retdec
Static Public Member Functions | Private Member Functions | Private Attributes | List of all members
retdec::llvmir2hll::IndirectFuncRefAnalysis Class Reference

Analysis of functions that are referenced outside of direct calls. More...

#include <indirect_func_ref_analysis.h>

Inheritance diagram for retdec::llvmir2hll::IndirectFuncRefAnalysis:
Inheritance graph
[legend]
Collaboration diagram for retdec::llvmir2hll::IndirectFuncRefAnalysis:
Collaboration graph
[legend]

Static Public Member Functions

static FuncSet getIndirectlyReferencedFuncs (ShPtr< Module > module)
 Returns the set of functions that are referenced outside of direct function calls in the given module. More...
 
static bool isIndirectlyReferenced (ShPtr< Module > module, ShPtr< Function > func)
 Returns the set of functions that are reference outside of function calls in the given module. More...
 

Private Member Functions

 IndirectFuncRefAnalysis (ShPtr< Module > module)
 Constructs a new analysis. More...
 
void performAnalysis ()
 Performs the analysis. More...
 
void visitAllFuncs ()
 Visits all the functions in the given module. More...
 
bool shouldCalledExprBeVisited (ShPtr< Expression > expr)
 Checks whether the given called expression should be visited. More...
 
void visitArgs (const ExprVector &args)
 Visits all the given arguments. More...
 
Visitor Interface
virtual void visit (ShPtr< CallExpr > expr) override
 
virtual void visit (ShPtr< Variable > var) override
 
virtual void visit (ShPtr< GlobalVarDef > varDef) override
 
virtual void visit (ShPtr< Function > func) override
 
virtual void visit (ShPtr< AssignStmt > stmt) override
 
virtual void visit (ShPtr< BreakStmt > stmt) override
 
virtual void visit (ShPtr< CallStmt > stmt) override
 
virtual void visit (ShPtr< ContinueStmt > stmt) override
 
virtual void visit (ShPtr< EmptyStmt > stmt) override
 
virtual void visit (ShPtr< ForLoopStmt > stmt) override
 
virtual void visit (ShPtr< UForLoopStmt > stmt) override
 
virtual void visit (ShPtr< GotoStmt > stmt) override
 
virtual void visit (ShPtr< IfStmt > stmt) override
 
virtual void visit (ShPtr< ReturnStmt > stmt) override
 
virtual void visit (ShPtr< SwitchStmt > stmt) override
 
virtual void visit (ShPtr< UnreachableStmt > stmt) override
 
virtual void visit (ShPtr< VarDefStmt > stmt) override
 
virtual void visit (ShPtr< WhileLoopStmt > stmt) override
 
virtual void visit (ShPtr< AddOpExpr > expr) override
 
virtual void visit (ShPtr< AddressOpExpr > expr) override
 
virtual void visit (ShPtr< AndOpExpr > expr) override
 
virtual void visit (ShPtr< ArrayIndexOpExpr > expr) override
 
virtual void visit (ShPtr< AssignOpExpr > expr) override
 
virtual void visit (ShPtr< BitAndOpExpr > expr) override
 
virtual void visit (ShPtr< BitOrOpExpr > expr) override
 
virtual void visit (ShPtr< BitShlOpExpr > expr) override
 
virtual void visit (ShPtr< BitShrOpExpr > expr) override
 
virtual void visit (ShPtr< BitXorOpExpr > expr) override
 
virtual void visit (ShPtr< CallExpr > expr) override
 
virtual void visit (ShPtr< CommaOpExpr > expr) override
 
virtual void visit (ShPtr< DerefOpExpr > expr) override
 
virtual void visit (ShPtr< DivOpExpr > expr) override
 
virtual void visit (ShPtr< EqOpExpr > expr) override
 
virtual void visit (ShPtr< GtEqOpExpr > expr) override
 
virtual void visit (ShPtr< GtOpExpr > expr) override
 
virtual void visit (ShPtr< LtEqOpExpr > expr) override
 
virtual void visit (ShPtr< LtOpExpr > expr) override
 
virtual void visit (ShPtr< ModOpExpr > expr) override
 
virtual void visit (ShPtr< MulOpExpr > expr) override
 
virtual void visit (ShPtr< NegOpExpr > expr) override
 
virtual void visit (ShPtr< NeqOpExpr > expr) override
 
virtual void visit (ShPtr< NotOpExpr > expr) override
 
virtual void visit (ShPtr< OrOpExpr > expr) override
 
virtual void visit (ShPtr< StructIndexOpExpr > expr) override
 
virtual void visit (ShPtr< SubOpExpr > expr) override
 
virtual void visit (ShPtr< TernaryOpExpr > expr) override
 
virtual void visit (ShPtr< Variable > var) override
 
virtual void visit (ShPtr< BitCastExpr > expr) override
 
virtual void visit (ShPtr< ExtCastExpr > expr) override
 
virtual void visit (ShPtr< FPToIntCastExpr > expr) override
 
virtual void visit (ShPtr< IntToFPCastExpr > expr) override
 
virtual void visit (ShPtr< IntToPtrCastExpr > expr) override
 
virtual void visit (ShPtr< PtrToIntCastExpr > expr) override
 
virtual void visit (ShPtr< TruncCastExpr > expr) override
 
virtual void visit (ShPtr< ConstArray > constant) override
 
virtual void visit (ShPtr< ConstBool > constant) override
 
virtual void visit (ShPtr< ConstFloat > constant) override
 
virtual void visit (ShPtr< ConstInt > constant) override
 
virtual void visit (ShPtr< ConstNullPointer > constant) override
 
virtual void visit (ShPtr< ConstString > constant) override
 
virtual void visit (ShPtr< ConstStruct > constant) override
 
virtual void visit (ShPtr< ConstSymbol > constant) override
 
virtual void visit (ShPtr< ArrayType > type) override
 
virtual void visit (ShPtr< FloatType > type) override
 
virtual void visit (ShPtr< IntType > type) override
 
virtual void visit (ShPtr< PointerType > type) override
 
virtual void visit (ShPtr< StringType > type) override
 
virtual void visit (ShPtr< StructType > type) override
 
virtual void visit (ShPtr< FunctionType > type) override
 
virtual void visit (ShPtr< VoidType > type) override
 
virtual void visit (ShPtr< UnknownType > type) override
 
- Private Member Functions inherited from retdec::llvmir2hll::OrderedAllVisitor
virtual void visit (ShPtr< GlobalVarDef > varDef) override
 
virtual void visit (ShPtr< Function > func) override
 
virtual void visit (ShPtr< AssignStmt > stmt) override
 
virtual void visit (ShPtr< BreakStmt > stmt) override
 
virtual void visit (ShPtr< CallStmt > stmt) override
 
virtual void visit (ShPtr< ContinueStmt > stmt) override
 
virtual void visit (ShPtr< EmptyStmt > stmt) override
 
virtual void visit (ShPtr< ForLoopStmt > stmt) override
 
virtual void visit (ShPtr< UForLoopStmt > stmt) override
 
virtual void visit (ShPtr< GotoStmt > stmt) override
 
virtual void visit (ShPtr< IfStmt > stmt) override
 
virtual void visit (ShPtr< ReturnStmt > stmt) override
 
virtual void visit (ShPtr< SwitchStmt > stmt) override
 
virtual void visit (ShPtr< UnreachableStmt > stmt) override
 
virtual void visit (ShPtr< VarDefStmt > stmt) override
 
virtual void visit (ShPtr< WhileLoopStmt > stmt) override
 
virtual void visit (ShPtr< AddOpExpr > expr) override
 
virtual void visit (ShPtr< AddressOpExpr > expr) override
 
virtual void visit (ShPtr< AndOpExpr > expr) override
 
virtual void visit (ShPtr< ArrayIndexOpExpr > expr) override
 
virtual void visit (ShPtr< AssignOpExpr > expr) override
 
virtual void visit (ShPtr< BitAndOpExpr > expr) override
 
virtual void visit (ShPtr< BitOrOpExpr > expr) override
 
virtual void visit (ShPtr< BitShlOpExpr > expr) override
 
virtual void visit (ShPtr< BitShrOpExpr > expr) override
 
virtual void visit (ShPtr< BitXorOpExpr > expr) override
 
virtual void visit (ShPtr< CommaOpExpr > expr) override
 
virtual void visit (ShPtr< DerefOpExpr > expr) override
 
virtual void visit (ShPtr< DivOpExpr > expr) override
 
virtual void visit (ShPtr< EqOpExpr > expr) override
 
virtual void visit (ShPtr< GtEqOpExpr > expr) override
 
virtual void visit (ShPtr< GtOpExpr > expr) override
 
virtual void visit (ShPtr< LtEqOpExpr > expr) override
 
virtual void visit (ShPtr< LtOpExpr > expr) override
 
virtual void visit (ShPtr< ModOpExpr > expr) override
 
virtual void visit (ShPtr< MulOpExpr > expr) override
 
virtual void visit (ShPtr< NegOpExpr > expr) override
 
virtual void visit (ShPtr< NeqOpExpr > expr) override
 
virtual void visit (ShPtr< NotOpExpr > expr) override
 
virtual void visit (ShPtr< OrOpExpr > expr) override
 
virtual void visit (ShPtr< StructIndexOpExpr > expr) override
 
virtual void visit (ShPtr< SubOpExpr > expr) override
 
virtual void visit (ShPtr< TernaryOpExpr > expr) override
 
virtual void visit (ShPtr< BitCastExpr > expr) override
 
virtual void visit (ShPtr< ExtCastExpr > expr) override
 
virtual void visit (ShPtr< FPToIntCastExpr > expr) override
 
virtual void visit (ShPtr< IntToFPCastExpr > expr) override
 
virtual void visit (ShPtr< IntToPtrCastExpr > expr) override
 
virtual void visit (ShPtr< PtrToIntCastExpr > expr) override
 
virtual void visit (ShPtr< TruncCastExpr > expr) override
 
virtual void visit (ShPtr< ConstArray > constant) override
 
virtual void visit (ShPtr< ConstBool > constant) override
 
virtual void visit (ShPtr< ConstFloat > constant) override
 
virtual void visit (ShPtr< ConstInt > constant) override
 
virtual void visit (ShPtr< ConstNullPointer > constant) override
 
virtual void visit (ShPtr< ConstString > constant) override
 
virtual void visit (ShPtr< ConstStruct > constant) override
 
virtual void visit (ShPtr< ConstSymbol > constant) override
 
virtual void visit (ShPtr< ArrayType > type) override
 
virtual void visit (ShPtr< FloatType > type) override
 
virtual void visit (ShPtr< IntType > type) override
 
virtual void visit (ShPtr< PointerType > type) override
 
virtual void visit (ShPtr< StringType > type) override
 
virtual void visit (ShPtr< StructType > type) override
 
virtual void visit (ShPtr< FunctionType > type) override
 
virtual void visit (ShPtr< VoidType > type) override
 
virtual void visit (ShPtr< UnknownType > type) override
 
 OrderedAllVisitor (bool visitSuccessors=true, bool visitNestedStmts=true)
 Constructs a new visitor. More...
 
virtual void visitStmt (ShPtr< Statement > stmt, bool visitSuccessors=true, bool visitNestedStmts=true)
 Visits the given statement, and possibly its successors or nested statements. More...
 
void restart (bool visitSuccessors=true, bool visitNestedStmts=true)
 "Restarts" the visitor so it is in the state like it was when it was created. More...
 
bool makeAccessedAndCheckIfAccessed (ShPtr< Type > type)
 Makes the given type accessed. More...
 
- Private Member Functions inherited from retdec::llvmir2hll::Visitor
virtual ~Visitor ()=default
 
 Visitor ()=default
 
- Private Member Functions inherited from retdec::utils::NonCopyable
 NonCopyable (const NonCopyable &)=delete
 
NonCopyableoperator= (const NonCopyable &)=delete
 
 NonCopyable ()=default
 
 ~NonCopyable ()=default
 

Private Attributes

ShPtr< Modulemodule
 The analyzed module. More...
 
ShPtr< FunctioncurrFunc
 The currently visited function. More...
 
FuncSet indirRefdFuncs
 Indirectly referenced functions. More...
 
- Private Attributes inherited from retdec::llvmir2hll::OrderedAllVisitor
ShPtr< StatementlastStmt
 Statement that has been accessed as the last one. More...
 
StmtUSet accessedStmts
 A set of all accessed statements. More...
 
TypeUSet accessedTypes
 A set of all accessed types. More...
 
bool visitSuccessors
 Should statements' successor be accessed? More...
 
bool visitNestedStmts
 Should nested statements be accessed? More...
 

Detailed Description

Analysis of functions that are referenced outside of direct calls.

Given a module, this class can be used to find functions that are referenced outside of direct function calls. For example, consider the following code:

void func(int argc) {
printf("%d\n", main);
}
int main(int argc, char **argv) {
func(argc);
return 0;
}
int main(int argc, char **argv)
Definition: ar_extractor.cpp:366

Here, main is indirectly referenced in func. This piece of information can be used to generate prototypes for such functions. In the code above, a prototype for main has to be given to prevent C syntax checker from complaining. Indeed, gcc -std=c99 emits the following error when a prototype for main is not given prior to the definition of func:

error: 'main' undeclared (first use in this function)

This class implements the "static helper" (or "library") design pattern (it has just static functions and no instances can be created).

Constructor & Destructor Documentation

◆ IndirectFuncRefAnalysis()

retdec::llvmir2hll::IndirectFuncRefAnalysis::IndirectFuncRefAnalysis ( ShPtr< Module module)
private

Constructs a new analysis.

Member Function Documentation

◆ getIndirectlyReferencedFuncs()

FuncSet retdec::llvmir2hll::IndirectFuncRefAnalysis::getIndirectlyReferencedFuncs ( ShPtr< Module module)
static

Returns the set of functions that are referenced outside of direct function calls in the given module.

Preconditions
  • module is non-null

◆ isIndirectlyReferenced()

bool retdec::llvmir2hll::IndirectFuncRefAnalysis::isIndirectlyReferenced ( ShPtr< Module module,
ShPtr< Function func 
)
static

Returns the set of functions that are reference outside of function calls in the given module.

Preconditions
  • module is non-null

◆ performAnalysis()

void retdec::llvmir2hll::IndirectFuncRefAnalysis::performAnalysis ( )
private

Performs the analysis.

◆ shouldCalledExprBeVisited()

bool retdec::llvmir2hll::IndirectFuncRefAnalysis::shouldCalledExprBeVisited ( ShPtr< Expression expr)
private

Checks whether the given called expression should be visited.

◆ visit() [1/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [2/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [3/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [4/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [5/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [6/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [7/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [8/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [9/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [10/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [11/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [12/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [13/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [14/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [15/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [16/71]

void retdec::llvmir2hll::IndirectFuncRefAnalysis::visit ( ShPtr< CallExpr expr)
overrideprivatevirtual

◆ visit() [17/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [18/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [19/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [20/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [21/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [22/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [23/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [24/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [25/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [26/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [27/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [28/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [29/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [30/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [31/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [32/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [33/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [34/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [35/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [36/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [37/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [38/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [39/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [40/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [41/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [42/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [43/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [44/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [45/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [46/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [47/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [48/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [49/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [50/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [51/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [52/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [53/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [54/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [55/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [56/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [57/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [58/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [59/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [60/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [61/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [62/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [63/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [64/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [65/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [66/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [67/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [68/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [69/71]

void retdec::llvmir2hll::IndirectFuncRefAnalysis::visit ( ShPtr< Variable var)
overrideprivatevirtual

◆ visit() [70/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visit() [71/71]

void retdec::llvmir2hll::OrderedAllVisitor::visit
overrideprivate

◆ visitAllFuncs()

void retdec::llvmir2hll::IndirectFuncRefAnalysis::visitAllFuncs ( )
private

Visits all the functions in the given module.

◆ visitArgs()

void retdec::llvmir2hll::IndirectFuncRefAnalysis::visitArgs ( const ExprVector args)
private

Visits all the given arguments.

Member Data Documentation

◆ currFunc

ShPtr<Function> retdec::llvmir2hll::IndirectFuncRefAnalysis::currFunc
private

The currently visited function.

◆ indirRefdFuncs

FuncSet retdec::llvmir2hll::IndirectFuncRefAnalysis::indirRefdFuncs
private

Indirectly referenced functions.

◆ module

ShPtr<Module> retdec::llvmir2hll::IndirectFuncRefAnalysis::module
private

The analyzed module.


The documentation for this class was generated from the following files: