decompiler
1.0.0
|
An in-memory implementation of the Scope interface. More...
#include <database.hh>
Public Member Functions | |
ScopeInternal (const string &nm, Architecture *g) | |
Construct the Scope. More... | |
virtual void | clear (void) |
Clear all symbols from this scope. | |
virtual void | categorySanity (void) |
Make sure Symbol categories are sane. More... | |
virtual void | clearCategory (int4 cat) |
Clear all symbols of the given category from this scope. | |
virtual void | clearUnlocked (void) |
Clear all unlocked symbols from this scope. | |
virtual void | clearUnlockedCategory (int4 cat) |
Clear unlocked symbols of the given category from this scope. | |
virtual MapIterator | begin (void) const |
Beginning iterator to mapped SymbolEntrys. | |
virtual MapIterator | end (void) const |
Ending iterator to mapped SymbolEntrys. | |
virtual list< SymbolEntry >::const_iterator | beginDynamic (void) const |
Beginning iterator to dynamic SymbolEntrys. | |
virtual list< SymbolEntry >::const_iterator | endDynamic (void) const |
Ending iterator to dynamic SymbolEntrys. | |
virtual list< SymbolEntry >::iterator | beginDynamic (void) |
Beginning iterator to dynamic SymbolEntrys. | |
virtual list< SymbolEntry >::iterator | endDynamic (void) |
Ending iterator to dynamic SymbolEntrys. | |
virtual void | removeSymbolMappings (Symbol *symbol) |
Remove all SymbolEntrys from the given Symbol. | |
virtual void | removeSymbol (Symbol *symbol) |
Remove the given Symbol from this Scope. | |
virtual void | renameSymbol (Symbol *sym, const string &newname) |
Rename a Symbol within this Scope. | |
virtual void | retypeSymbol (Symbol *sym, Datatype *ct) |
Change the data-type of a Symbol within this Scope. More... | |
virtual void | setAttribute (Symbol *sym, uint4 attr) |
Set boolean Varnode properties on a Symbol. | |
virtual void | clearAttribute (Symbol *sym, uint4 attr) |
Clear boolean Varnode properties on a Symbol. | |
virtual void | setDisplayFormat (Symbol *sym, uint4 attr) |
Set the display format for a Symbol. | |
virtual SymbolEntry * | findAddr (const Address &addr, const Address &usepoint) const |
Find a Symbol at a given address and usepoint. More... | |
virtual SymbolEntry * | findContainer (const Address &addr, int4 size, const Address &usepoint) const |
Find the smallest Symbol containing the given memory range. More... | |
virtual SymbolEntry * | findClosestFit (const Address &addr, int4 size, const Address &usepoint) const |
Find Symbol which is the closest fit to the given memory range. More... | |
virtual Funcdata * | findFunction (const Address &addr) const |
Find the function starting at the given address. More... | |
virtual ExternRefSymbol * | findExternalRef (const Address &addr) const |
Find an external reference at the given address. More... | |
virtual LabSymbol * | findCodeLabel (const Address &addr) const |
Find a label Symbol at the given address. More... | |
virtual SymbolEntry * | findOverlap (const Address &addr, int4 size) const |
Find first Symbol overlapping the given memory range. More... | |
virtual void | findByName (const string &name, vector< Symbol * > &res) const |
Find a Symbol by name within this Scope. More... | |
virtual bool | isNameUsed (const string &name) const |
Check if the given name is used within this scope. More... | |
virtual Funcdata * | resolveExternalRefFunction (ExternRefSymbol *sym) const |
Convert an external reference to the referenced function. More... | |
virtual string | buildVariableName (const Address &addr, const Address &pc, Datatype *ct, int4 &index, uint4 flags) const |
Given an address and data-type, build a suitable generic symbol name. More... | |
virtual string | buildUndefinedName (void) const |
Build a formal undefined name, used internally when a Symbol is not given a name. More... | |
virtual string | makeNameUnique (const string &nm) const |
Produce a version of the given symbol name that won't collide with other names in this Scope. More... | |
virtual void | saveXml (ostream &s) const |
Write out this as a <scope> XML tag. | |
virtual void | restoreXml (const Element *el) |
Restore this Scope from a <scope> XML tag. | |
virtual void | printEntries (ostream &s) const |
Dump a description of all SymbolEntry objects to a stream. | |
virtual int4 | getCategorySize (int4 cat) const |
Get the number of Symbols in the given category. More... | |
virtual Symbol * | getCategorySymbol (int4 cat, int4 ind) const |
Retrieve a Symbol by index within a specific category. More... | |
virtual void | setCategory (Symbol *sym, int4 cat, int4 ind) |
Set the category and index for the given Symbol. More... | |
void | assignDefaultNames (int4 &base) |
Assign a default name (via buildVariableName) to any unnamed symbol. More... | |
![]() | |
Scope (const string &nm, Architecture *g) | |
Construct an empty scope, given a name and Architecture. | |
virtual | ~Scope (void) |
Destructor. | |
virtual bool | inScope (const Address &addr, int4 size, const Address &usepoint) const |
Query if the given range is owned by this Scope. More... | |
virtual SymbolEntry * | addSymbol (const string &name, Datatype *ct, const Address &addr, const Address &usepoint) |
Add a new Symbol to this Scope, given a name, data-type, and a single mapping. More... | |
void | queryByName (const string &name, vector< Symbol * > &res) const |
Look-up symbols by name. More... | |
Funcdata * | queryFunction (const string &name) const |
Look-up a function by name. More... | |
SymbolEntry * | queryByAddr (const Address &addr, const Address &usepoint) const |
Get Symbol with matching address. More... | |
SymbolEntry * | queryContainer (const Address &addr, int4 size, const Address &usepoint) const |
Find the smallest containing Symbol. More... | |
SymbolEntry * | queryProperties (const Address &addr, int4 size, const Address &usepoint, uint4 &flags) const |
Find a Symbol or properties at the given address. More... | |
Funcdata * | queryFunction (const Address &addr) const |
Look-up a function by address. More... | |
Funcdata * | queryExternalRefFunction (const Address &addr) const |
Look-up a function thru an external reference. More... | |
LabSymbol * | queryCodeLabel (const Address &addr) const |
Look-up a code label by address. More... | |
Scope * | resolveScope (const string &name) const |
Find a child Scope of this. More... | |
Scope * | discoverScope (const Address &addr, int4 sz, const Address &usepoint) |
Find the owning Scope of a given memory range. More... | |
void | saveXmlRecursive (ostream &s, bool onlyGlobal) const |
Save all contained scopes as an XML stream. More... | |
void | overrideSizeLockType (Symbol *sym, Datatype *ct) |
Change the data-type of a Symbol that is sizelocked. More... | |
void | resetSizeLockType (Symbol *sym) |
Clear a Symbol's size-locked data-type. More... | |
bool | isSubScope (const Scope *scp) const |
Is this a sub-scope of the given Scope. More... | |
string | getFullName (void) const |
Get the full name of this Scope. | |
void | getNameSegments (vector< string > &vec) const |
Get the fullname of this in segments. More... | |
void | getScopePath (vector< Scope * > &vec) const |
Get the ordered list of parent scopes to this. More... | |
bool | isNameUsed (const string &nm, const Scope *op2) const |
Is the given name in use within given scope path. More... | |
const Scope * | findDistinguishingScope (const Scope *op2) const |
Find first ancestor of this not shared by given scope. More... | |
Symbol * | addSymbol (const string &name, Datatype *ct) |
Add a new Symbol without mapping it to an address. More... | |
SymbolEntry * | addMapPoint (Symbol *sym, const Address &addr, const Address &usepoint) |
Map a Symbol to a specific address. More... | |
Symbol * | addMapSym (const Element *el) |
Add a mapped Symbol from a <mapsym> XML tag. More... | |
FunctionSymbol * | addFunction (const Address &addr, const string &nm) |
Create a function Symbol at the given address in this Scope. More... | |
ExternRefSymbol * | addExternalRef (const Address &addr, const Address &refaddr, const string &nm) |
LabSymbol * | addCodeLabel (const Address &addr, const string &nm) |
Create a code label at the given address in this Scope. More... | |
Symbol * | addDynamicSymbol (const string &nm, Datatype *ct, const Address &caddr, uint8 hash) |
Create a dynamically mapped Symbol attached to a specific data-flow. More... | |
string | buildDefaultName (Symbol *sym, int4 &base, Varnode *vn) const |
Create a default name for the given Symbol. More... | |
bool | isReadOnly (const Address &addr, int4 size, const Address &usepoint) const |
Is the given memory range marked as read-only. More... | |
Static Public Member Functions | |
static void | savePathXml (ostream &s, const vector< string > &vec) |
Save a path with <val> tags. More... | |
static void | restorePathXml (vector< string > &vec, const Element *el) |
Restore path from <val> tags. More... | |
Protected Member Functions | |
virtual void | addSymbolInternal (Symbol *sym) |
Put a Symbol into the name map. More... | |
virtual SymbolEntry * | addMapInternal (Symbol *sym, uint4 exfl, const Address &addr, int4 off, int4 sz, const RangeList &uselim) |
Create a new SymbolEntry for a Symbol given a memory range. More... | |
virtual SymbolEntry * | addDynamicMapInternal (Symbol *sym, uint4 exfl, uint8 hash, int4 off, int4 sz, const RangeList &uselim) |
Create a new SymbolEntry for a Symbol given a dynamic hash. More... | |
![]() | |
virtual void | restrictScope (Funcdata *f) |
Convert this to a local Scope. More... | |
virtual void | addRange (AddrSpace *spc, uintb first, uintb last) |
Add a memory range to the ownership of this Scope. More... | |
virtual void | removeRange (AddrSpace *spc, uintb first, uintb last) |
Remove a memory range from the ownership of this Scope. More... | |
SymbolEntry * | addMap (const SymbolEntry &entry) |
Integrate a SymbolEntry into the range maps. More... | |
Protected Attributes | |
SymbolNameTree | nametree |
The set of Symbol objects, sorted by name. | |
vector< EntryMap * > | maptable |
Rangemaps of SymbolEntry, one map for each address space. | |
vector< vector< Symbol * > > | category |
References to Symbol objects organized by category. | |
list< SymbolEntry > | dynamicentry |
Dynamic symbol entries. | |
SymbolNameTree | multiEntrySet |
Set of symbols with multiple entries. | |
uint8 | nextUniqueId |
Next available symbol id. | |
![]() | |
Architecture * | glb |
Architecture of this scope. | |
string | name |
Name of this scope. | |
Funcdata * | fd |
(If non-null) the function which this is the local Scope for | |
uint4 | uniqueId |
Unique id for the scope, for deduping scope names, assigning symbol ids. | |
Private Member Functions | |
void | processHole (const Element *el) |
Parse a <hole> XML tag that describes boolean properties of memory range. More... | |
void | insertNameTree (Symbol *sym) |
Insert a Symbol into the nametree. More... | |
SymbolNameTree::const_iterator | findFirstByName (const string &name) const |
Find an iterator pointing to the first Symbol in the ordering with a given name. More... | |
Additional Inherited Members | |
![]() | |
static const Scope * | stackAddr (const Scope *scope1, const Scope *scope2, const Address &addr, const Address &usepoint, SymbolEntry **addrmatch) |
Query for Symbols starting at a given address, which match a given usepoint. More... | |
static const Scope * | stackContainer (const Scope *scope1, const Scope *scope2, const Address &addr, int4 size, const Address &usepoint, SymbolEntry **addrmatch) |
static const Scope * | stackClosestFit (const Scope *scope1, const Scope *scope2, const Address &addr, int4 size, const Address &usepoint, SymbolEntry **addrmatch) |
static const Scope * | stackFunction (const Scope *scope1, const Scope *scope2, const Address &addr, Funcdata **addrmatch) |
static const Scope * | stackExternalRef (const Scope *scope1, const Scope *scope2, const Address &addr, ExternRefSymbol **addrmatch) |
static const Scope * | stackCodeLabel (const Scope *scope1, const Scope *scope2, const Address &addr, LabSymbol **addrmatch) |
An in-memory implementation of the Scope interface.
This can act as a stand-alone Scope object or serve as an in-memory cache for another implementation. This implements a nametree, which is a a set of Symbol objects (the set owns the Symbol objects). It also implements a maptable, which is a list of rangemaps that own the SymbolEntry objects.
ScopeInternal::ScopeInternal | ( | const string & | nm, |
Architecture * | g | ||
) |
Construct the Scope.
nm | is the name of the Scope |
g | is the Architecture it belongs to |
References maptable, nextUniqueId, and AddrSpaceManager::numSpaces().
|
protectedvirtual |
Create a new SymbolEntry for a Symbol given a dynamic hash.
The SymbolEntry is specified in terms of a hash and usepoint, which describe how to find the temporary Varnode holding the symbol value.
sym | is the given Symbol being mapped |
exfl | are any boolean Varnode properties |
hash | is the given dynamic hash |
off | is the byte offset of the new SymbolEntry (relative to the whole Symbol) |
sz | is the number of bytes occupied by the Varnode |
uselim | is the given usepoint |
Implements Scope.
References dynamicentry, Symbol::mapentry, multiEntrySet, Symbol::type, and Symbol::wholeCount.
Referenced by ScopeLocal::remapSymbolDynamic().
|
protectedvirtual |
Create a new SymbolEntry for a Symbol given a memory range.
The SymbolEntry is specified in terms of a memory range and usepoint
sym | is the given Symbol being mapped |
exfl | are any boolean Varnode properties specific to the memory range |
addr | is the starting address of the given memory range |
off | is the byte offset of the new SymbolEntry (relative to the whole Symbol) |
sz | is the number of bytes in the range |
uselim | is the given usepoint (which may be invalid) |
Implements Scope.
Reimplemented in ScopeGhidraNamespace.
References AddrSpace::getIndex(), Address::getOffset(), Address::getSpace(), rangemap< _recordtype >::insert(), Symbol::mapentry, maptable, multiEntrySet, Symbol::type, and Symbol::wholeCount.
Referenced by ScopeGhidraNamespace::addMapInternal(), and ScopeLocal::remapSymbol().
|
protectedvirtual |
Put a Symbol into the name map.
sym | is the preconstructed Symbol |
Implements Scope.
References buildUndefinedName(), Symbol::category, category, Symbol::catindex, Symbol::ID_BASE, insertNameTree(), Symbol::name, nextUniqueId, Symbol::symbolId, and Scope::uniqueId.
void ScopeInternal::assignDefaultNames | ( | int4 & | base | ) |
Assign a default name (via buildVariableName) to any unnamed symbol.
Run through all the symbols whose name is undefined. Build a variable name, uniquify it, and rename the variable.
base | is the base index to start at for generating generic names |
References Scope::buildDefaultName(), Symbol::isNameUndefined(), nametree, and renameSymbol().
|
virtual |
Build a formal undefined name, used internally when a Symbol is not given a name.
Implements Scope.
References nametree.
Referenced by addSymbolInternal(), ScopeGhidra::buildUndefinedName(), clearUnlocked(), and clearUnlockedCategory().
|
virtual |
Given an address and data-type, build a suitable generic symbol name.
addr | is the given address |
pc | is the address at which the name is getting used |
ct | is a data-type used to inform the name |
index | is a reference to an index used to make the name unique, which will be updated |
flags | are boolean properties of the variable we need the name for |
Implements Scope.
Reimplemented in ScopeLocal.
References Varnode::addrtied, AddrSpace::byteToAddress(), findFirstByName(), Address::getAddrSize(), AddrSpace::getName(), Address::getOffset(), Translate::getRegisterName(), Address::getSpace(), AddrSpace::getWordSize(), Scope::glb, Varnode::indirect_creation, Varnode::input, makeNameUnique(), nametree, Varnode::persist, Varnode::return_address, Architecture::translate, and Varnode::unaffected.
Referenced by ScopeGhidra::buildVariableName(), and ScopeLocal::buildVariableName().
|
virtual |
Make sure Symbol categories are sane.
Look for NULL entries in the category tables. If there are, clear out the entire category, marking all symbols as uncategorized
References category, and setCategory().
Referenced by restoreXml().
|
virtual |
Find a Symbol at a given address and usepoint.
addr | is the given address |
usepoint | is the point at which the Symbol is accessed (may be invalid) |
Implements Scope.
References rangemap< _recordtype >::find(), AddrSpace::getIndex(), Address::getOffset(), Address::getSpace(), SymbolEntry::inUse(), Address::isInvalid(), and maptable.
Referenced by ScopeGhidra::findAddr(), and ScopeGhidra::findCodeLabel().
|
virtual |
Find a Symbol by name within this Scope.
If there are multiple Symbols with the same name, all are passed back.
name | is the name to search for |
res | will contain any matching Symbols |
Implements Scope.
References findFirstByName(), Symbol::name, Scope::name, and nametree.
|
virtual |
Find Symbol which is the closest fit to the given memory range.
addr | is the starting address of the given memory range |
size | is the number of bytes in the range |
usepoint | is the point at which the Symbol is accessed (may be invalid) |
Implements Scope.
References rangemap< _recordtype >::find(), AddrSpace::getIndex(), Address::getOffset(), Address::getSpace(), SymbolEntry::inUse(), Address::isInvalid(), and maptable.
Referenced by ScopeGhidra::findContainer().
Find a label Symbol at the given address.
addr | is the given address |
Implements Scope.
References rangemap< _recordtype >::find(), AddrSpace::getIndex(), Address::getOffset(), Address::getSpace(), SymbolEntry::inUse(), and maptable.
Referenced by ScopeGhidra::findCodeLabel().
|
virtual |
Find the smallest Symbol containing the given memory range.
addr | is the starting address of the given memory range |
size | is the number of bytes in the range |
usepoint | is the point at which the Symbol is accessed (may be invalid) |
Implements Scope.
References end(), rangemap< _recordtype >::find(), AddrSpace::getIndex(), Address::getOffset(), Address::getSpace(), SymbolEntry::inUse(), Address::isInvalid(), and maptable.
Referenced by ScopeGhidra::findAddr(), ScopeGhidra::findExternalRef(), and ScopeGhidra::findFunction().
|
virtual |
Find an external reference at the given address.
addr | is the given address |
Implements Scope.
References rangemap< _recordtype >::find(), AddrSpace::getIndex(), Address::getOffset(), Address::getSpace(), and maptable.
Referenced by ScopeGhidra::findExternalRef().
|
private |
Find an iterator pointing to the first Symbol in the ordering with a given name.
name | is the name to search for |
References Scope::name, and nametree.
Referenced by buildVariableName(), findByName(), and makeNameUnique().
Find the function starting at the given address.
addr | is the given starting address |
Implements Scope.
References rangemap< _recordtype >::find(), FunctionSymbol::getFunction(), AddrSpace::getIndex(), Address::getOffset(), Address::getSpace(), and maptable.
Referenced by ScopeGhidra::findFunction(), and ScopeGhidra::resolveExternalRefFunction().
|
virtual |
Find first Symbol overlapping the given memory range.
addr | is the starting address of the given range |
size | is the number of bytes in the range |
Implements Scope.
References rangemap< _recordtype >::find_overlap(), AddrSpace::getIndex(), Address::getOffset(), Address::getSpace(), and maptable.
Referenced by ScopeLocal::adjustFit(), ScopeLocal::markNotMapped(), ScopeLocal::recoverNameRecommendationsForSymbols(), and Funcdata::syncVarnodesWithSymbols().
|
virtual |
Get the number of Symbols in the given category.
cat | is the Symbol category |
Implements Scope.
References category.
Referenced by ScopeLocal::fakeInputSymbols().
|
virtual |
|
private |
Insert a Symbol into the nametree.
Duplicate symbol names are allowed for by establishing a deduplication id for the Symbol.
sym | is the Symbol to insert |
References Symbol::name, Symbol::nameDedup, and nametree.
Referenced by addSymbolInternal(), and renameSymbol().
|
virtual |
Check if the given name is used within this scope.
Only this scope is checked. If one or more symbols exist with the given name, true is returned.
name | is the given name to check for |
Implements Scope.
References Scope::name, and nametree.
|
virtual |
Produce a version of the given symbol name that won't collide with other names in this Scope.
nm | is the given name |
Implements Scope.
References findFirstByName(), Symbol::nameDedup, and nametree.
Referenced by ScopeLocal::buildVariableName(), buildVariableName(), ActionNameVars::lookForBadJumpTables(), ActionNameVars::lookForFuncParamNames(), and ScopeLocal::recoverNameRecommendationsForSymbols().
|
private |
Parse a <hole> XML tag that describes boolean properties of memory range.
The <scope> XML tag is allowed to contain <hole> tags, which are really descriptions of memory globally. This method parses them and passes the info to the Database object.
el | is the <hole> element |
References Element::getAttributeValue(), Scope::glb, Varnode::readonly, Range::restoreXml(), Database::setPropertyRange(), Architecture::symboltab, Varnode::volatil, and xml_readbool().
Referenced by restoreXml().
|
virtual |
Convert an external reference to the referenced function.
sym | is the Symbol marking the external reference |
Implements Scope.
References Scope::queryFunction().
|
static |
Restore path from <val> tags.
Given an element, parse all of its children (as <val> tags) and put each of their content into a string array.
vec | will hold the resulting string array |
el | is the XML element |
Referenced by Database::parseParentTag().
Change the data-type of a Symbol within this Scope.
If the size of the Symbol changes, any mapping (SymbolEntry) is adjusted
sym | is the given Symbol |
ct | is the new data-type |
Implements Scope.
References Scope::addMapPoint(), Symbol::checkSizeTypeLock(), rangemap< _recordtype >::erase(), Symbol::mapentry, maptable, Symbol::name, Symbol::type, and Symbol::wholeCount.
Referenced by Funcdata::attemptDynamicMappingLate().
|
static |
Save a path with <val> tags.
Given a list of name strings, write out each one in an XML <val> tag.
s | is the output stream |
vec | is the list of names |
References xml_escape().
Referenced by saveXml().
|
virtual |
Set the category and index for the given Symbol.
sym | is the given Symbol |
cat | is the category to set for the Symbol |
ind | is the index position to set (within the category) |
Implements Scope.
References Symbol::category, category, and Symbol::catindex.
Referenced by categorySanity().