SymbolicVariable *SymbolicEngine::convertRegToSymVar(uint64 regId, uint64 symVarSize, std::string symVarComment) { SymbolicVariable *symVar = nullptr; SymbolicExpression *expression = nullptr; uint64 regSymId = UNSET; if (regId >= ID_LAST_ITEM) throw std::runtime_error("SymbolicEngine::convertRegToSymVar() - Invalid register ID"); regSymId = this->getRegSymbolicID(regId); if (regSymId == UNSET) { symVar = this->addSymbolicVariable(SymVar::kind::REG, regId, symVarSize, symVarComment); smt2lib::smtAstAbstractNode *tmp = smt2lib::variable(symVar->getSymVarName()); if (tmp == nullptr) throw std::runtime_error("convertRegToSymVar can't create smtAstAbstractNode (nullptr)"); SymbolicExpression *se = this->newSymbolicExpression(tmp); if (se == nullptr) throw std::runtime_error("convertRegToSymVar can't create symbolic expression (nullptr)"); this->symbolicReg[regId] = se->getID(); } else { expression = this->getExpressionFromId(regSymId); if (expression == nullptr) return nullptr; symVar = this->addSymbolicVariable(SymVar::kind::REG, regId, symVarSize, symVarComment); expression->setExpression(smt2lib::variable(symVar->getSymVarName())); } return symVar; }
/* * Converts an expression ID to a symbolic variable. * e.g: * #43 = (_ bv10 8) * convertExprToSymVar(43, 8) * #43 = SymVar_4 */ SymbolicVariable *SymbolicEngine::convertExprToSymVar(uint64 exprId, uint64 symVarSize, std::string symVarComment) { SymbolicVariable *symVar = nullptr; SymbolicExpression *expression = this->getExpressionFromId(exprId); if (expression == nullptr) return nullptr; symVar = this->addSymbolicVariable(SymVar::kind::UNDEF, 0, symVarSize, symVarComment); expression->setExpression(smt2lib::variable(symVar->getSymVarName())); return symVar; }
// Note: symVarSize is in BYTE. SymbolicVariable *SymbolicEngine::convertMemToSymVar(uint64 memAddr, uint64 symVarSize, std::string symVarComment) { SymbolicVariable *symVar = nullptr; SymbolicExpression *expression = nullptr; smt2lib::smtAstAbstractNode *tmp = nullptr; uint64 memSymId = UNSET; uint64 size_quotient = symVarSize; memSymId = this->getMemSymbolicID(memAddr); // First we create a symbolic variable symVar = this->addSymbolicVariable(SymVar::kind::MEM, memAddr, symVarSize * 8, symVarComment); smt2lib::smtAstAbstractNode *symVarNode = smt2lib::variable(symVar->getSymVarName()); if (symVarNode == nullptr) throw std::runtime_error("convertMemToSymVar can't create smtAstAbstractNode (nullptr)"); std::list<smt2lib::smtAstAbstractNode *> symMemChunk; while (size_quotient) { tmp = smt2lib::extract((REG_SIZE * size_quotient - 1), (REG_SIZE * size_quotient - REG_SIZE), symVarNode); symMemChunk.push_back(tmp); if (tmp == nullptr) throw std::runtime_error("convertMemToSymVar can't create extract (nullptr)"); if (memSymId == UNSET) { if (size_quotient > 1 or symVarSize == 1) { expression = this->newSymbolicExpression(tmp, "byte reference"); } else { smt2lib::smtAstAbstractNode *concat = smt2lib::concat(symMemChunk); expression = this->newSymbolicExpression(concat); } } else { expression = this->getExpressionFromId(memSymId); expression->setExpression(tmp); } if (expression == nullptr) throw std::runtime_error("convertMemToSymVar can't create symbolic expression (nullptr)"); this->addMemoryReference((memAddr + size_quotient) - 1, expression->getID()); size_quotient--; } return symVar; }
SymbolicVariable *SymbolicEngine::convertMemToSymVar(uint64 memAddr, uint64 symVarSize, std::string symVarComment) { SymbolicVariable *symVar = nullptr; SymbolicExpression *expression = nullptr; uint64 memSymId = UNSET; memSymId = this->getMemSymbolicID(memAddr); if (memSymId == UNSET) throw std::runtime_error("SymbolicEngine::convertMemToSymVar() - This memory address is UNSET"); expression = this->getExpressionFromId(memSymId); if (expression == nullptr) return nullptr; symVar = this->addSymbolicVariable(SymVar::kind::MEM, memAddr, symVarSize, symVarComment); expression->setExpression(smt2lib::variable(symVar->getSymVarName())); return symVar; }
SymbolicVariable *SymbolicEngine::convertRegToSymVar(uint64 regId, uint64 symVarSize, std::string symVarComment) { SymbolicVariable *symVar = nullptr; SymbolicExpression *expression = nullptr; uint64 regSymId = UNSET; if (regId >= ID_LAST_ITEM) throw std::runtime_error("SymbolicEngine::convertRegToSymVar() - Invalid register ID"); regSymId = this->getRegSymbolicID(regId); if (regSymId == UNSET) throw std::runtime_error("SymbolicEngine::convertRegToSymVar() - This register ID is UNSET"); expression = this->getExpressionFromId(regSymId); if (expression == nullptr) return nullptr; symVar = this->addSymbolicVariable(SymVar::kind::REG, regId, symVarSize, symVarComment); expression->setExpression(smt2lib::variable(symVar->getSymVarName())); return symVar; }