uint64 SymbolicEngine::convertMemToSymVar(uint64 memAddr, uint64 symVarSize) { SymbolicVariable *symVar = nullptr; SymbolicElement *element = nullptr; std::stringstream newExpr; uint64 memSymId = UNSET; memSymId = this->getMemSymbolicID(memAddr); if (memSymId == UNSET) throw std::runtime_error("SymbolicEngine::convertMemToSymVar() - This memory address is UNSET"); element = this->getElementFromId(memSymId); if (element == nullptr) return UNSET; if (symVarSize != BYTE_SIZE && symVarSize != WORD_SIZE && symVarSize != DWORD_SIZE && symVarSize != QWORD_SIZE && symVarSize != DQWORD_SIZE) throw std::runtime_error("SymbolicEngine::convertMemToSymVar() - Invalid symVarSize"); symVar = this->addSymbolicVariable(SymVar::kind::MEM, memAddr, symVarSize); newExpr << symVar->getSymVarName(); element->setSrcExpr(newExpr); return symVar->getSymVarId(); }
uint64 SymbolicEngine::convertRegToSymVar(uint64 regId, uint64 symVarSize) { SymbolicVariable *symVar = nullptr; SymbolicElement *element = nullptr; std::stringstream newExpr; 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"); element = this->getElementFromId(regSymId); if (element == nullptr) return UNSET; if (symVarSize != BYTE_SIZE && symVarSize != WORD_SIZE && symVarSize != DWORD_SIZE && symVarSize != QWORD_SIZE && symVarSize != DQWORD_SIZE) throw std::runtime_error("SymbolicEngine::convertRegToSymVar() - Invalid symVarSize"); symVar = this->addSymbolicVariable(SymVar::kind::REG, regId, symVarSize); newExpr << symVar->getSymVarName(); element->setSrcExpr(newExpr); return symVar->getSymVarId(); }
/* * Converts an expression ID to a symbolic variable. * e.g: * #43 = (_ bv10 8) * convertExprToSymVar(43, 8) * #43 = SymVar_4 */ uint64 SymbolicEngine::convertExprToSymVar(uint64 exprId, uint64 symVarSize) { SymbolicVariable *symVar = nullptr; SymbolicElement *element = this->getElementFromId(exprId); std::stringstream newExpr; if (element == nullptr) return UNSET; if (symVarSize != BYTE_SIZE && symVarSize != WORD_SIZE && symVarSize != DWORD_SIZE && symVarSize != QWORD_SIZE && symVarSize != DQWORD_SIZE) throw std::runtime_error("SymbolicEngine::convertExprToSymVar() - Invalid symVarSize"); symVar = this->addSymbolicVariable(SymVar::kind::UNDEF, 0, symVarSize); newExpr << symVar->getSymVarName(); element->setSrcExpr(newExpr); return symVar->getSymVarId(); }