1 #ifndef ROSE_BinaryAnalysis_StackDelta_H
2 #define ROSE_BinaryAnalysis_StackDelta_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
6 #include <Rose/BinaryAnalysis/Disassembler/BasicTypes.h>
7 #include <Rose/BinaryAnalysis/Partitioner2/BasicTypes.h>
8 #include <Rose/BinaryAnalysis/InstructionSemantics/BaseSemantics.h>
9 #include <Sawyer/Map.h>
11 #include <boost/serialization/access.hpp>
14 namespace BinaryAnalysis {
17 namespace Partitioner2 {
26 namespace StackDelta {
58 InstructionSemantics::BaseSemantics::SValuePtr> SValuePair;
68 SValuePair functionStackPtrs_;
69 InstructionSemantics::BaseSemantics::SValuePtr functionDelta_;
71 SValuePairPerAddress bblockStackPtrs_;
72 DeltasPerAddress bblockDeltas_;
74 SValuePairPerAddress insnStackPtrs_;
75 DeltasPerAddress insnDeltas_;
77 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
79 friend class boost::serialization::access;
82 void serialize(S &s,
const unsigned ) {
83 s & BOOST_SERIALIZATION_NVP(cpu_);
84 s & BOOST_SERIALIZATION_NVP(initialConcreteStackPointer_);
85 s & BOOST_SERIALIZATION_NVP(hasResults_);
86 s & BOOST_SERIALIZATION_NVP(didConverge_);
87 s & BOOST_SERIALIZATION_NVP(functionStackPtrs_);
88 s & BOOST_SERIALIZATION_NVP(functionDelta_);
89 s & BOOST_SERIALIZATION_NVP(bblockStackPtrs_);
90 s & BOOST_SERIALIZATION_NVP(bblockDeltas_);
91 s & BOOST_SERIALIZATION_NVP(insnStackPtrs_);
92 s & BOOST_SERIALIZATION_NVP(insnDeltas_);
103 : hasResults_(false), didConverge_(false) {}
109 : hasResults_(false), didConverge_(false) {
121 : cpu_(cpu), hasResults_(false), didConverge_(false) {}
205 InstructionSemantics::BaseSemantics::SValuePtr
basicBlockStackDelta(rose_addr_t basicBlockAddress)
const;
274 static int64_t
toInt(
const InstructionSemantics::BaseSemantics::SValuePtr&);
277 void print(std::ostream&)
const;
282 const InstructionSemantics::BaseSemantics::SValuePtr &spIn,
283 const InstructionSemantics::BaseSemantics::SValuePtr &spOut,
284 const InstructionSemantics::BaseSemantics::SValuePtr &delta);
290 std::ostream& operator<<(std::ostream&,
const Analysis&);
void initDiagnostics()
Initialize diagnostics.
Analysis()
Default constructor.
InstructionSemantics::BaseSemantics::SValuePtr basicBlockInputStackDeltaWrtFunction(rose_addr_t basicBlockAddress) const
Stack delta for block w.r.t.
InstructionSemantics::BaseSemantics::SValuePtr instructionInputStackDeltaWrtFunction(SgAsmInstruction *) const
Stack delta for instruction w.r.t.
void initialConcreteStackPointer(const Sawyer::Optional< rose_addr_t > &val)
Property: Initial value to use for stack pointers.
static void clearAstStackDeltas(SgNode *)
Clear AST stack deltas.
InstructionSemantics::BaseSemantics::SValuePtr instructionOutputStackDeltaWrtFunction(SgAsmInstruction *) const
Stack delta for instruction w.r.t.
Base class for machine instructions.
void print(std::ostream &) const
Print multi-line value to specified stream.
int64_t instructionStackDeltaConcrete(SgAsmInstruction *) const
Concrete stack delta for an instruction.
Represents a synthesized function.
InstructionSemantics::BaseSemantics::SValuePtr instructionStackDelta(SgAsmInstruction *) const
Stack delta for an instruction.
InstructionSemantics::BaseSemantics::SValuePtr basicBlockStackDelta(rose_addr_t basicBlockAddress) const
Stack delta for an analyzed basic block.
bool didConverge() const
Whether the analysis results are valid.
Main namespace for the ROSE library.
void clearStackPointers()
Clear stack pointers, not deltas.
int64_t basicBlockStackDeltaConcrete(rose_addr_t basicBlockAddress) const
Concrete stack delta for an analyzed basic block.
Sawyer::Optional< rose_addr_t > initialConcreteStackPointer() const
Property: Initial value to use for stack pointers.
boost::shared_ptr< Dispatcher > DispatcherPtr
Shared-ownership pointer to a semantics instruction dispatcher.
void clearStackDeltas()
Clear stack deltas, not pointers.
int64_t functionStackDeltaConcrete() const
Concrete stack delta for an analyzed function.
This class represents the base class for all IR nodes within Sage III.
InstructionSemantics::BaseSemantics::SValuePtr basicBlockOutputStackDeltaWrtFunction(rose_addr_t basicBlockAddress) const
Stack delta for block w.r.t.
void analyzeFunction(const Partitioner2::PartitionerConstPtr &, const Partitioner2::FunctionPtr &, Partitioner2::DataFlow::InterproceduralPredicate &)
Analyze one function.
Predicate that decides when to use inter-procedural data-flow.
InstructionSemantics::BaseSemantics::DispatcherPtr cpu() const
Virtual CPU used for analysis.
bool hasResults() const
Whether a function has been analyzed.
Sawyer::SharedPointer< SValue > SValuePtr
Shared-ownership pointer to a semantic value in any domain.
SValuePair functionStackPointers() const
Initial and final stack pointers for an analyzed function.
void clearResults()
Clear analysis results.
Analysis(const Disassembler::BasePtr &d)
Construct an analyzer using a specified disassembler.
Analysis(const InstructionSemantics::BaseSemantics::DispatcherPtr &cpu)
Construct an analysis using a specified dispatcher.
Various tools for data-flow analysis.
Sawyer::Message::Facility mlog
Facility for diagnostic output.
void saveAnalysisResults(SgAsmFunction *) const
Update AST with analysis results.
static int64_t toInt(const InstructionSemantics::BaseSemantics::SValuePtr &)
Convert a symbolic value to an integer.
SValuePair instructionStackPointers(SgAsmInstruction *) const
Initial and final stack ponters for an analyzed instruction.
InstructionSemantics::BaseSemantics::SValuePtr functionStackDelta() const
Stack delta for an analyzed function.
SValuePair basicBlockStackPointers(rose_addr_t basicBlockAddress) const
Initial and final stack pointers for a basic block.
void clearNonResults()
Clears everything but results.