diff --git a/afl_transforms/tools/zax/zax_base.cpp b/afl_transforms/tools/zax/zax_base.cpp index 68b6e5a8e13ddb8177fcfb937e5daf248d659bcb..90eb6f71ab83f022f8fe1f9f926b373f6957a975 100644 --- a/afl_transforms/tools/zax/zax_base.cpp +++ b/afl_transforms/tools/zax/zax_base.cpp @@ -163,17 +163,14 @@ ZaxBase_t::ZaxBase_t(IRDB_SDK::pqxxDB_t &p_dbinterface, IRDB_SDK::FileIR_t *p_va m_num_bb_skipped = 0; m_num_bb_skipped_pushjmp = 0; m_num_bb_skipped_nop_padding = 0; - m_num_bb_skipped_innernode = 0; m_num_bb_skipped_cbranch = 0; - m_num_bb_skipped_onlychild = 0; - m_num_bb_keep_exit_block = 0; - m_num_bb_keep_cbranch_back_edge = 0; m_num_style_collafl = 0; m_num_bb_float_instrumentation = 0; m_num_bb_float_regs_saved = 0; m_num_domgraph_blocks_elided = 0; m_num_exit_blocks_elided = 0; m_num_entry_blocks_elided = 0; + m_num_single_block_function_elided = 0; } void ZaxBase_t::setVerbose(bool p_verbose) @@ -562,16 +559,22 @@ BasicBlockSet_t ZaxBase_t::getBlocksToInstrument(const ControlFlowGraph_t &cfg) continue; } - // padding nop, don't bother - if (BB_isPaddingNop(bb)) + keepers.insert(bb); + } + return keepers; +} + +void ZaxBase_t::filterPaddingNOP(BasicBlockSet_t& p_in_out) +{ + auto copy=p_in_out; + for(auto block : copy) + { + if (BB_isPaddingNop(block)) { + p_in_out.erase(block); m_num_bb_skipped_nop_padding++; - continue; } - - keepers.insert(bb); } - return keepers; } void ZaxBase_t::filterEntryBlock(BasicBlockSet_t& p_in_out, BasicBlock_t* p_entry) @@ -618,7 +621,11 @@ void ZaxBase_t::filterExitBlocks(BasicBlockSet_t& p_in_out) if (copy.find(*block->getPredecessors().begin()) == copy.end()) continue; - // must be an exit block + const auto last_instruction_index = block->getInstructions().size() - 1; + if (block->getInstructions()[last_instruction_index]->getDisassembly().find("ret")==string::npos) + continue; + + // must be an exit block (ret) // exit block is not an ibta // only 1 predecessor // predecessor in <p_in_out> @@ -841,12 +848,19 @@ int ZaxBase_t::execute() const auto cfgp = ControlFlowGraph_t::factory(f); const auto &cfg = *cfgp; + const auto num_blocks_in_func = cfg.getBlocks().size(); + m_num_bb += num_blocks_in_func; + + if (m_graph_optimize && num_blocks_in_func == 1) + { + m_num_single_block_function_elided++; + m_num_bb_skipped++; + continue; + } + const auto dom_graphp=DominatorGraph_t::factory(cfgp.get()); const auto has_domgraph_warnings = dom_graphp -> hasWarnings(); - const auto num_blocks_in_func = cfg.getBlocks().size(); - m_num_bb += num_blocks_in_func; - const auto entry_block = cfg.getEntry(); auto keepers = getBlocksToInstrument(cfg); @@ -881,6 +895,8 @@ int ZaxBase_t::execute() cout << "num blocks to keep (after filter exits): " << keepers.size() << endl; } + filterPaddingNOP(keepers); + struct BBSorter { bool operator()( const BasicBlock_t* lhs, const BasicBlock_t* rhs ) const @@ -942,18 +958,12 @@ void ZaxBase_t::dumpAttributes() cout << "#ATTRIBUTE num_bb_float_instrumentation=" << m_num_bb_float_instrumentation << endl; cout << "#ATTRIBUTE num_bb_float_register_saved=" << m_num_bb_float_regs_saved << endl; cout << "#ATTRIBUTE graph_optimize=" << boolalpha << m_graph_optimize << endl; - if (m_graph_optimize) - { - cout << "#ATTRIBUTE num_bb_skipped_cond_branch=" << m_num_bb_skipped_cbranch << endl; - cout << "#ATTRIBUTE num_bb_keep_cbranch_back_edge=" << m_num_bb_keep_cbranch_back_edge << endl; - cout << "#ATTRIBUTE num_bb_keep_exit_block=" << m_num_bb_keep_exit_block << endl; - cout << "#ATTRIBUTE num_style_collafl=" << m_num_style_collafl << endl; - cout << "#ATTRIBUTE num_bb_skipped_onlychild=" << m_num_bb_skipped_onlychild << endl; - cout << "#ATTRIBUTE num_bb_skipped_innernode=" << m_num_bb_skipped_innernode << endl; - } + cout << "#ATTRIBUTE num_bb_skipped_cond_branch=" << m_num_bb_skipped_cbranch << endl; + cout << "#ATTRIBUTE num_style_collafl=" << m_num_style_collafl << endl; cout << "#ATTRIBUTE num_domgraph_blocks_elided=" << m_num_domgraph_blocks_elided << endl; cout << "#ATTRIBUTE num_entry_blocks_elided=" << m_num_entry_blocks_elided << endl; cout << "#ATTRIBUTE num_exit_blocks_elided=" << m_num_exit_blocks_elided << endl; + cout << "#ATTRIBUTE num_single_block_function_elided=" << m_num_single_block_function_elided << endl; } // file dump of modified basic block info diff --git a/afl_transforms/tools/zax/zax_base.hpp b/afl_transforms/tools/zax/zax_base.hpp index 795b53d480953ad5c502279e3769738f089968a5..b2314dda630831cbba3fb3868709bb97416fc6f3 100644 --- a/afl_transforms/tools/zax/zax_base.hpp +++ b/afl_transforms/tools/zax/zax_base.hpp @@ -41,6 +41,7 @@ namespace Zafl void setBasicBlockFloatingInstrumentation(bool); void setEnableForkServer(bool); void setBreakupCriticalEdges(bool); + void filterPaddingNOP(BasicBlockSet_t& p_in_out); void filterBlocksByDomgraph(BasicBlockSet_t& in_out, const DominatorGraph_t * dg ); void filterConditionalBranches(BasicBlockSet_t& p_in_out); void filterEntryBlock(BasicBlockSet_t& in_out, BasicBlock_t* p_entry); @@ -103,17 +104,14 @@ namespace Zafl size_t m_num_bb_skipped; size_t m_num_bb_skipped_pushjmp; size_t m_num_bb_skipped_nop_padding; - size_t m_num_bb_skipped_innernode; size_t m_num_bb_skipped_cbranch; - size_t m_num_bb_skipped_onlychild; - size_t m_num_bb_keep_exit_block; - size_t m_num_bb_keep_cbranch_back_edge; size_t m_num_bb_float_instrumentation; size_t m_num_bb_float_regs_saved; size_t m_num_style_collafl; size_t m_num_domgraph_blocks_elided; size_t m_num_entry_blocks_elided; size_t m_num_exit_blocks_elided; + size_t m_num_single_block_function_elided; private: string m_fork_server_entry; // string to specify fork server entry point