ROSE  0.11.28.0
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue Class Reference

Description

Semantic values for generating C source code ASTs.

Each SValue contains a string representation of a C expression.

Future work is planned to replace the string representation with a C source AST, in which case each SValue will have a pointer to a partly-constructed AST. In general, the parent pointers in these AST nodes are not initialized because many of these nodes are being shared across multiple subtrees. ROSE's instruction semantics framework relies very heavily on node sharing, but the AST was not designed for this. Do not expect AST traversals and analysis to work correctly for ASTs pointed to by an SValue. But never fear, the SValue's AST will be fixed by the time whole function ASTs are generated.

Definition at line 68 of file SourceAstSemantics2.h.

#include <SourceAstSemantics2.h>

Inheritance diagram for Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue:
Inheritance graph
[legend]
Collaboration diagram for Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue:
Collaboration graph
[legend]

Public Member Functions

virtual BaseSemantics::SValuePtr bottom_ (size_t nbits) const ROSE_OVERRIDE
 Data-flow bottom value. More...
 
virtual BaseSemantics::SValuePtr undefined_ (size_t nbits) const ROSE_OVERRIDE
 Create a new undefined semantic value. More...
 
virtual BaseSemantics::SValuePtr unspecified_ (size_t nbits) const ROSE_OVERRIDE
 Create a new unspecified semantic value. More...
 
virtual BaseSemantics::SValuePtr number_ (size_t nbits, uint64_t value) const ROSE_OVERRIDE
 Create a new concrete semantic value. More...
 
virtual BaseSemantics::SValuePtr boolean_ (bool value) const ROSE_OVERRIDE
 Create a new, Boolean value. More...
 
virtual BaseSemantics::SValuePtr copy (size_t new_width=0) const ROSE_OVERRIDE
 Create a new value from an existing value, changing the width if new_width is non-zero. More...
 
virtual Sawyer::Optional< BaseSemantics::SValuePtrcreateOptionalMerge (const BaseSemantics::SValuePtr &, const BaseSemantics::MergerPtr &, const SmtSolverPtr &) const ROSE_OVERRIDE
 Possibly create a new value by merging two existing values. More...
 
virtual bool may_equal (const BaseSemantics::SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const ROSE_OVERRIDE
 Virtual API. More...
 
virtual bool must_equal (const BaseSemantics::SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const ROSE_OVERRIDE
 Virtual API. More...
 
virtual void set_width (size_t nbits) ROSE_OVERRIDE
 Virtual API. More...
 
virtual bool isBottom () const ROSE_OVERRIDE
 Determines whether a value is a data-flow bottom. More...
 
virtual bool is_number () const ROSE_OVERRIDE
 Virtual API. More...
 
virtual uint64_t get_number () const ROSE_OVERRIDE
 Virtual API. More...
 
virtual void print (std::ostream &, BaseSemantics::Formatter &) const ROSE_OVERRIDE
 Print a value to a stream using default format. More...
 
virtual const std::string & ctext () const
 C source text associated with this semantic value.
 
virtual void ctext (const std::string &s)
 C source text associated with this semantic value.
 
- Public Member Functions inherited from Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue
SValuePtr createMerged (const SValuePtr &other, const MergerPtr &merger, const SmtSolverPtr &solver) const
 Create a new value by merging two existing values. More...
 
size_t nBits () const
 Property: value width. More...
 
bool isConcrete () const
 Determines if the value is a concrete number. More...
 
Sawyer::Optional< uint64_t > toUnsigned () const
 Converts a concrete value to a native unsigned integer. More...
 
Sawyer::Optional< int64_t > toSigned () const
 Converts a concrete value to a native signed integer. More...
 
bool mustEqual (const SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const
 Tests two values for equality. More...
 
bool mayEqual (const SValuePtr &other, const SmtSolverPtr &solver=SmtSolverPtr()) const
 Tests two values for possible equality. More...
 
bool isTrue () const
 Returns true if concrete non-zero. More...
 
bool isFalse () const
 Returns true if concrete zero. More...
 
std::string comment () const
 Property: Comment. More...
 
void comment (const std::string &) const
 Property: Comment. More...
 
void print (std::ostream &) const
 Print a value to a stream using default format. More...
 
WithFormatter with_format (Formatter &fmt)
 Used for printing values with formatting. More...
 
WithFormatter operator+ (Formatter &fmt)
 Used for printing values with formatting. More...
 
WithFormatter operator+ (const std::string &linePrefix)
 Used for printing values with formatting. More...
 
virtual std::string get_comment () const
 Some subclasses support the ability to add comments to values. More...
 
virtual void set_comment (const std::string &) const
 Some subclasses support the ability to add comments to values. More...
 
virtual size_t get_width () const
 Virtual API. More...
 
- Public Member Functions inherited from Sawyer::SharedObject
 SharedObject ()
 Default constructor. More...
 
 SharedObject (const SharedObject &)
 Copy constructor. More...
 
virtual ~SharedObject ()
 Virtual destructor. More...
 
SharedObjectoperator= (const SharedObject &)
 Assignment. More...
 
- Public Member Functions inherited from Sawyer::SharedFromThis< SValue >
SharedPointer< SValue > sharedFromThis ()
 Create a shared pointer from this. More...
 
SharedPointer< const SValue > sharedFromThis () const
 Create a shared pointer from this. More...
 

Static Public Member Functions

static SValuePtr instance ()
 Instantiate a prototypical SValue. More...
 
static SValuePtr instance_undefined (size_t nbits)
 Instantiate an undefined value. More...
 
static SValuePtr instance_integer (size_t nbits, uint64_t value)
 Instantiate an integer constant. More...
 
static SValuePtr promote (const BaseSemantics::SValuePtr &v)
 Promote a base instance to an instance of this class. More...
 
static std::string unsignedTypeNameForSize (size_t nbits)
 Name of integer type used for value.
 
static std::string signedTypeNameForSize (size_t nbits)
 Name of integer type used for value.
 
- Static Public Member Functions inherited from Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue
static SValuePtr promote (const SValuePtr &x)
 
- Static Public Member Functions inherited from Sawyer::SmallObject
static SynchronizedPoolAllocatorpoolAllocator ()
 Return the pool allocator for this class. More...
 
static void * operator new (size_t size)
 
static void operator delete (void *ptr, size_t size)
 

Protected Member Functions

 SValue (size_t nbits)
 
 SValue (size_t nbits, uint64_t number)
 
 SValue (const SValue &other)
 
- Protected Member Functions inherited from Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue
 SValue (size_t nbits)
 
 SValue (const SValue &other)
 

Protected Attributes

std::string ctext_
 
- Protected Attributes inherited from Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue
size_t width
 

Static Protected Attributes

static size_t nVariables_
 

Additional Inherited Members

- Public Types inherited from Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue
typedef SValuePtr Ptr
 Shared-ownership pointer for an SValue object. More...
 

Member Function Documentation

static SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::instance ( )
inlinestatic

Instantiate a prototypical SValue.

This SValue will be used only for its virtual constructors and will never appear in an expression.

Definition at line 87 of file SourceAstSemantics2.h.

Referenced by Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::RiscOperators::instance().

static SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::instance_undefined ( size_t  nbits)
inlinestatic

Instantiate an undefined value.

Undefined values are distinct C variables that are never initialized.

Definition at line 94 of file SourceAstSemantics2.h.

Referenced by bottom_(), undefined_(), and unspecified_().

static SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::instance_integer ( size_t  nbits,
uint64_t  value 
)
inlinestatic

Instantiate an integer constant.

Definition at line 99 of file SourceAstSemantics2.h.

Referenced by boolean_(), and number_().

virtual BaseSemantics::SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::bottom_ ( size_t  nBits) const
inlinevirtual

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::InstructionSemantics2::BaseSemantics::SValue.

Definition at line 104 of file SourceAstSemantics2.h.

References instance_undefined().

virtual BaseSemantics::SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::undefined_ ( size_t  nbits) const
inlinevirtual

Create a new undefined semantic value.

The new semantic value will have the same dynamic type as the value on which this virtual method is called. This is the most common way that a new value is created. The unspecified_ method is closely related.

See also
unspecified_

Implements Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue.

Definition at line 107 of file SourceAstSemantics2.h.

References instance_undefined().

virtual BaseSemantics::SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::unspecified_ ( size_t  nbits) const
inlinevirtual

Create a new unspecified semantic value.

The new semantic value will have the same dynamic type as the value on which this virtual method is called. Undefined (undefined_) and unspecified are closely related. Unspecified values are the same as undefined values except they're instantiated as the result of some machine instruction where the ISA documentation indicates that the value is unspecified (e.g., status flags for x86 shift and rotate instructions).

Most semantic domains make no distinction between undefined and unspecified.

See also
undefined_

Implements Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue.

Definition at line 110 of file SourceAstSemantics2.h.

References instance_undefined().

virtual BaseSemantics::SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::number_ ( size_t  nbits,
uint64_t  number 
) const
inlinevirtual

Create a new concrete semantic value.

The new value will represent the specified concrete value and have the same dynamic type as the value on which this virtual method is called. This is the most common way that a new constant is created. The number is truncated to contain nbits bits (higher order bits are cleared).

Implements Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue.

Definition at line 113 of file SourceAstSemantics2.h.

References instance_integer().

virtual BaseSemantics::SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::boolean_ ( bool  value) const
inlinevirtual

Create a new, Boolean value.

The new semantic value will have the same dynamic type as the value on which this virtual method is called. This is how 1-bit flag register values (among others) are created. The base implementation uses number_() to construct a 1-bit value whose bit is zero (false) or one (true).

Reimplemented from Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue.

Definition at line 116 of file SourceAstSemantics2.h.

References instance_integer().

virtual BaseSemantics::SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::copy ( size_t  new_width = 0) const
inlinevirtual

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::InstructionSemantics2::BaseSemantics::SValue.

Definition at line 119 of file SourceAstSemantics2.h.

virtual Sawyer::Optional<BaseSemantics::SValuePtr> Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::createOptionalMerge ( const BaseSemantics::SValuePtr other,
const BaseSemantics::MergerPtr merger,
const SmtSolverPtr solver 
) const
inlinevirtual

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 (SValuePtr merged = v1->createOptionalMerge(v2).orDefault()) {
std::cout <<"v1 and v2 were merged to " <<*merged <<"\n";
} else {
std::cout <<"no merge is necessary\n";
}
or
@code
SValuePtr merge;
if (v1->createOptionalMerge(v2).assignTo(merged)) {
std::cout <<"v1 and v2 were merged to " <<*merged <<"\n";
} else {
std::cout <<"v1 and v2 are equal in some sense (no merge necessary)\n";
}

If you always want a copy regardless of whether the merge is necessary, then use the createMerged convenience function instead.

Implements Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue.

Definition at line 126 of file SourceAstSemantics2.h.

static SValuePtr Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::promote ( const BaseSemantics::SValuePtr v)
inlinestatic

Promote a base instance to an instance of this class.

Definition at line 133 of file SourceAstSemantics2.h.

References Sawyer::SharedPointer< T >::dynamicCast().

virtual bool Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::may_equal ( const BaseSemantics::SValuePtr other,
const SmtSolverPtr solver = SmtSolverPtr() 
) const
inlinevirtual
virtual bool Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::must_equal ( const BaseSemantics::SValuePtr other,
const SmtSolverPtr solver = SmtSolverPtr() 
) const
inlinevirtual
virtual void Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::set_width ( size_t  nbits)
inlinevirtual

Virtual API.

See nBits.

Reimplemented from Rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValue.

Definition at line 151 of file SourceAstSemantics2.h.

virtual bool Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::isBottom ( ) const
inlinevirtual

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::InstructionSemantics2::BaseSemantics::SValue.

Definition at line 155 of file SourceAstSemantics2.h.

virtual bool Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::is_number ( ) const
inlinevirtual
virtual uint64_t Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::get_number ( ) const
inlinevirtual
virtual void Rose::BinaryAnalysis::InstructionSemantics2::SourceAstSemantics::SValue::print ( std::ostream &  ,
BaseSemantics::Formatter  
) const
virtual

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::InstructionSemantics2::BaseSemantics::SValue.


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