/* * Converts blocks to functions (is not part of Jeremiahs disassembler - and also IDA) * deprecated! */ void RoseBin_FlowAnalysis::convertBlocksToFunctions(SgAsmNode* globalNode) { vector<SgNode*> tree =NodeQuery::querySubTree(globalNode, V_SgAsmBlock); vector<SgNode*>::iterator itV = tree.begin(); //cerr << " ObjDump-BinRose:: Converting Blocks To Functions" << endl; for (;itV!=tree.end();itV++) { SgAsmBlock* block = isSgAsmBlock(*itV); if (block && block!=globalNode) { uint64_t addr = block->get_address(); isSgAsmBlock(globalNode)->remove_statement(block); block->set_parent(NULL); SgAsmFunction* func = new SgAsmFunction(addr, RoseBin_support::HexToString(addr)); ROSE_ASSERT(g_algo->info); g_algo->info->returnTargets[func].insert(g_algo->info->returnTargets[block].begin(), g_algo->info->returnTargets[block].end()); isSgAsmBlock(globalNode)->append_statement(func); func->set_parent(globalNode); vector <SgNode*> vec =block->get_traversalSuccessorContainer(); for (unsigned int itf = 0; itf < vec.size() ; itf++) { SgAsmInstruction* finst = isSgAsmInstruction(vec[itf]); finst->set_parent(func); func->append_statement(finst); } block->remove_children(); } } // string filename="_binary_tree_func.dot"; //AST_BIN_Traversal* trav = new AST_BIN_Traversal(); //trav->run(globalNode, filename); }
void visit(SgNode *node) { SgAsmBlock *bb = isSgAsmBlock(node); SgAsmFunction *func = bb ? SageInterface::getEnclosingNode<SgAsmFunction>(bb) : NULL; if (func && bb->get_address()==removal_addr) { SgAsmStatementPtrList::iterator found = std::find(func->get_statementList().begin(), func->get_statementList().end(), bb); ROSE_ASSERT(found!=func->get_statementList().end()); func->get_statementList().erase(found); std::cout <<"removed basic block " <<StringUtility::addrToString(removal_addr) <<std::endl; // throw 1 /* found the one-and-only block, so we can abandon the traversal */ } }
BtorTranslationPolicy::BtorTranslationPolicy(BtorTranslationHooks* hooks, uint32_t minNumStepsToFindError, uint32_t maxNumStepsToFindError, SgProject* proj): problem(), hooks(hooks), regdict(NULL) { assert (minNumStepsToFindError >= 1); // Can't find an error on the first step assert (maxNumStepsToFindError < 0xFFFFFFFFU); // Prevent overflows assert (minNumStepsToFindError <= maxNumStepsToFindError || maxNumStepsToFindError == 0); makeRegMap(origRegisterMap, ""); makeRegMapZero(newRegisterMap); isValidIp = false_(); validIPs.clear(); Comp stepCount = problem.build_var(32, "stepCount_saturating_at_" + boost::lexical_cast<std::string>(maxNumStepsToFindError + 1)); addNext(stepCount, ite(problem.build_op_eq(stepCount, number<32>(maxNumStepsToFindError + 1)), number<32>(maxNumStepsToFindError + 1), problem.build_op_inc(stepCount))); resetState = problem.build_op_eq(stepCount, zero(32)); errorsEnabled = problem.build_op_and( problem.build_op_ugte(stepCount, number<32>(minNumStepsToFindError)), (maxNumStepsToFindError == 0 ? true_() : problem.build_op_ulte(stepCount, number<32>(maxNumStepsToFindError)))); { vector<SgNode*> functions = NodeQuery::querySubTree(proj, V_SgAsmFunction); for (size_t i = 0; i < functions.size(); ++i) { functionStarts.push_back(isSgAsmFunction(functions[i])->get_address()); // fprintf(stderr, "functionStarts 0x%"PRIx64"\n", isSgAsmFunction(functions[i])->get_address()); } } { vector<SgNode*> blocks = NodeQuery::querySubTree(proj, V_SgAsmBlock); for (size_t i = 0; i < blocks.size(); ++i) { SgAsmBlock* b = isSgAsmBlock(blocks[i]); if (!b->get_statementList().empty() && isSgAsmX86Instruction(b->get_statementList().front())) { blockStarts.push_back(b->get_address()); // fprintf(stderr, "blockStarts 0x%"PRIx64"\n", b->get_address()); } } } { vector<SgNode*> calls = NodeQuery::querySubTree(proj, V_SgAsmX86Instruction); for (size_t i = 0; i < calls.size(); ++i) { SgAsmX86Instruction* b = isSgAsmX86Instruction(calls[i]); if (b->get_kind() != x86_call) continue; returnPoints.push_back(b->get_address() + b->get_raw_bytes().size()); // fprintf(stderr, "returnPoints 0x%"PRIx64"\n", b->get_address() + b->get_raw_bytes().size()); } } { vector<SgNode*> instructions = NodeQuery::querySubTree(proj, V_SgAsmX86Instruction); for (size_t i = 0; i < instructions.size(); ++i) { SgAsmX86Instruction* b = isSgAsmX86Instruction(instructions[i]); validIPs.push_back(b->get_address()); } } }
void BlockTraversal::visit(SgNode* n) { SgAsmBlock* asmBlock = isSgAsmBlock(n); if (asmBlock != NULL) { // Save the address of the SgAsmBlock. rose_addr_t asmBlockAddress = asmBlock->get_address(); // printf ("asmBlockAddress = %zu \n",asmBlockAddress); printf ("asmBlockAddress = %p \n",asmBlockAddress); bool blockExists = blockMap.find(asmBlockAddress) != blockMap.end(); ROSE_ASSERT(blockExists == false); if (blockExists == false) { // Need to add the block address. // blockMap[asmBlockAddress] = asmBlock; blockMap[asmBlockAddress] = pair<SgAsmBlock*,TraceStructType*>(asmBlock,new TraceStructType(asmBlock)); } } }