ROSE 0.11.145.147
|
Type of values manipulated by the MultiSemantics domain.
A multi-semantic value is a set of values, one from each of the subdomains, and a bit vector that indicates which values are valid. The bit vector is accessed by the RiscOperators and new values are created by those operators with appropriate validities, but the MultiSemantics domain doesn't otherwise modify the bit vector–that's up to the user-defined, inter-operation callbacks.
Individual sub-domain values can be queried from a multi-domain value with get_subvalue() using the ID returned by add_subdomain() when the sub-domain's RiscOperators were added to the multi-domain's RiscOperators.
Definition at line 84 of file MultiSemantics.h.
#include <Rose/BinaryAnalysis/InstructionSemantics/MultiSemantics.h>
Public Types | |
using | Super = BaseSemantics::SValue |
Base type. | |
using | Ptr = SValuePtr |
Shared-ownership pointer. | |
Public Types inherited from Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue | |
using | Ptr = SValuePtr |
Shared-ownership pointer. | |
Public Member Functions | |
virtual BaseSemantics::SValuePtr | bottom_ (size_t nbits) const override |
Data-flow bottom value. | |
virtual BaseSemantics::SValuePtr | undefined_ (size_t nbits) const override |
Create a new undefined MultiSemantics value. | |
virtual BaseSemantics::SValuePtr | unspecified_ (size_t nbits) const override |
Create a new unspecified MultiSemantics value. | |
virtual BaseSemantics::SValuePtr | number_ (size_t nbits, uint64_t number) const override |
Create a MultiSemantics value holding a concrete value. | |
virtual SValuePtr | create_empty (size_t nbits) const |
Create a new MultiSemantics value with no valid subvalues. | |
virtual BaseSemantics::SValuePtr | copy (size_t=0) const override |
Create a new value from an existing value, changing the width if new_width is non-zero. | |
virtual Sawyer::Optional< BaseSemantics::SValuePtr > | createOptionalMerge (const BaseSemantics::SValuePtr &other, const BaseSemantics::MergerPtr &, const SmtSolverPtr &) const override |
Possibly create a new value by merging two existing values. | |
virtual bool | isBottom () const override |
Determines whether a value is a data-flow bottom. | |
virtual void | print (std::ostream &, BaseSemantics::Formatter &) const override |
Print a value to a stream using default format. | |
virtual void | hash (Combinatorics::Hasher &) const override |
Hash this semantic value. | |
virtual bool | may_equal (const BaseSemantics::SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const override |
Determines if two multidomain values might be equal. | |
virtual bool | must_equal (const BaseSemantics::SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const override |
Determines if two multidomain values must be equal. | |
virtual void | set_width (size_t nbits) override |
Virtual API. | |
virtual bool | is_number () const override |
Determines if the value is a concrete number. | |
virtual uint64_t | get_number () const override |
Virtual API. | |
virtual bool | is_valid (size_t idx) const |
Returns true if a subdomain value is valid. | |
virtual void | invalidate (size_t idx) |
Removes a subdomain value and marks it as invalid. | |
virtual BaseSemantics::SValuePtr | get_subvalue (size_t idx) const |
Return a subdomain value. | |
virtual void | set_subvalue (size_t idx, const BaseSemantics::SValuePtr &value) |
Insert a subdomain value. | |
Public Member Functions inherited from Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue | |
virtual SValuePtr | boolean_ (bool value) const |
Create a new, Boolean value. | |
SValuePtr | createMerged (const SValuePtr &other, const MergerPtr &merger, const SmtSolverPtr &solver) const |
Create a new value by merging two existing values. | |
size_t | nBits () const |
Property: value width. | |
bool | isConcrete () const |
Determines if the value is a concrete number. | |
Sawyer::Optional< uint64_t > | toUnsigned () const |
Converts a concrete value to a native unsigned integer. | |
Sawyer::Optional< int64_t > | toSigned () const |
Converts a concrete value to a native signed integer. | |
bool | mustEqual (const SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const |
Tests two values for equality. | |
bool | mayEqual (const SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const |
Tests two values for possible equality. | |
bool | isTrue () const |
Returns true if concrete non-zero. | |
bool | isFalse () const |
Returns true if concrete zero. | |
std::string | toString () const |
Render this symbolic expression as a string. | |
std::string | comment () const |
Property: Comment. | |
void | comment (const std::string &) const |
Property: Comment. | |
void | print (std::ostream &) const |
Print a value to a stream using default format. | |
WithFormatter | with_format (Formatter &fmt) |
Used for printing values with formatting. | |
WithFormatter | operator+ (Formatter &fmt) |
Used for printing values with formatting. | |
WithFormatter | operator+ (const std::string &linePrefix) |
Used for printing values with formatting. | |
virtual size_t | get_width () const |
Virtual API. | |
virtual std::string | get_comment () const |
Some subclasses support the ability to add comments to values. | |
virtual void | set_comment (const std::string &) const |
Some subclasses support the ability to add comments to values. | |
Public Member Functions inherited from Sawyer::SharedObject | |
SharedObject () | |
Default constructor. | |
SharedObject (const SharedObject &) | |
Copy constructor. | |
virtual | ~SharedObject () |
Virtual destructor. | |
SharedObject & | operator= (const SharedObject &) |
Assignment. | |
Public Member Functions inherited from Sawyer::SharedFromThis< SValue > | |
SharedPointer< SValue > | sharedFromThis () |
Create a shared pointer from this . | |
SharedPointer< const SValue > | sharedFromThis () const |
Create a shared pointer from this . | |
Static Public Member Functions | |
static SValuePtr | instance () |
Construct a prototypical value. | |
static SValuePtr | promote (const BaseSemantics::SValuePtr &) |
Promote a base value to a MultiSemantics value. | |
Static Public Member Functions inherited from Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue | |
static SValuePtr | promote (const SValuePtr &x) |
Static Public Member Functions inherited from Sawyer::SmallObject | |
static SynchronizedPoolAllocator & | poolAllocator () |
Return the pool allocator for this class. | |
static void * | operator new (size_t size) |
static void | operator delete (void *ptr, size_t size) |
Protected Types | |
typedef std::vector< BaseSemantics::SValuePtr > | Subvalues |
Protected Member Functions | |
SValue (size_t nbits) | |
SValue (const SValue &other) | |
void | init (const SValue &other) |
Protected Member Functions inherited from Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue | |
SValue (size_t nbits) | |
SValue (const SValue &other) | |
Protected Attributes | |
Subvalues | subvalues |
Protected Attributes inherited from Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue | |
size_t | width |
using Rose::BinaryAnalysis::InstructionSemantics::MultiSemantics::SValue::Super = BaseSemantics::SValue |
Base type.
Definition at line 87 of file MultiSemantics.h.
Shared-ownership pointer.
Definition at line 90 of file MultiSemantics.h.
|
protected |
Definition at line 93 of file MultiSemantics.h.
|
static |
Construct a prototypical value.
Prototypical values are only used for their virtual constructors.
|
static |
Promote a base value to a MultiSemantics value.
The value v
must have a MultiSemantics::SValue dynamic type.
Referenced by Rose::BinaryAnalysis::InstructionSemantics::MultiSemantics::RiscOperators::svalue_empty().
|
overridevirtual |
Data-flow bottom value.
Returns a new value that represents bottom in a data-flow analysis. If a semantic domain can represent a bottom value then the isBottom predicate is true when invoked on this method's return value. If a semantic domain cannot support a bottom value, then it may return some other value.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Create a new undefined MultiSemantics value.
The returned value is constructed by calling the virtual undefined_() for each subdomain value in "this". If you want a multidomain value that has no valid subvalues, then use the create_empty() method instead.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Create a new unspecified MultiSemantics value.
The returned value is constructed by calling the virtual unspecified_() for each subdomain value in "this". If you want a multidomain value that has no valid subvalues, then use the create_empty() method instead.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Create a MultiSemantics value holding a concrete value.
The returned value is constructed by calling the virtual number_() method for each subdomain value in "this".
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
virtual |
Create a new MultiSemantics value with no valid subvalues.
The caller will probably construct a value iteratively by invoking set_subvalue() one or more times.
|
overridevirtual |
Create a new value from an existing value, changing the width if new_width
is non-zero.
Increasing the width logically adds zero bits to the most significant side of the value; decreasing the width logically removes bits from the most significant side of the value.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Possibly create a new value by merging two existing values.
This method optionally returns a new semantic value as the data-flow merge of this
and other
. If the two inputs are "equal" in some sense of the dataflow implementation then nothing is returned, otherwise a new value is returned. Typical usage is like this:
If you always want a copy regardless of whether the merge is necessary, then use the createMerged convenience function instead.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Determines whether a value is a data-flow bottom.
Returns true if this value represents a bottom value for data-flow analysis. Any RiscOperation performed on an operand whose isBottom predicate returns true will itself return a bottom value. This includes operations like "xor x x" which would normally return zero.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Print a value to a stream using default format.
The value will normally occupy a single line and not contain leading space or line termination. See also, with_format().
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Hash this semantic value.
Hashes the value by appending it to the specified hasher.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Determines if two multidomain values might be equal.
Two multidomain values are equal if, for any subdomain for which both values are valid, they are equal in the subdomain.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Determines if two multidomain values must be equal.
Two multidomain values are equal if and only if there is at least one subdomain where both values are valid, and for all subdomains where both values are valid, their must_equal() relationship is satisfied.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Virtual API.
See nBits.
Reimplemented from Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Determines if the value is a concrete number.
In the MultiSemantics domain, a value is a concrete number if and only if it has at least one valid subdomain value and all valid subdomain values are concrete numbers, and all are the same concrete number.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
overridevirtual |
Virtual API.
See toUnsigned and toSigned.
Implements Rose::BinaryAnalysis::InstructionSemantics::BaseSemantics::SValue.
|
virtual |
Returns true if a subdomain value is valid.
A subdomain value is valid if the specified index has a non-null SValue pointer. It is permissible to call this with an index that is out of range (false is returned in that case).
|
virtual |
Removes a subdomain value and marks it as invalid.
It is permissible to call this with an index that does not correspond to a valid subdomain value.
|
virtual |
Return a subdomain value.
The subdomain must be valid according to is_valid().
|
virtual |
Insert a subdomain value.
The specified value is inserted at the specified index. No attempt is made to validate whether the value has a valid dynamic type for that slot. If the value is not a null pointer, then is_valid() will return true after this call.
|
protected |
Definition at line 94 of file MultiSemantics.h.