Skip to content

Commit 956d240

Browse files
committed
Adding additional symex documentation
1 parent 3323b76 commit 956d240

File tree

4 files changed

+66
-3
lines changed

4 files changed

+66
-3
lines changed

src/analyses/dirty.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ Date: March 2013
2020
#include <util/invariant.h>
2121
#include <goto-programs/goto_functions.h>
2222

23+
/// Dirty variables are ones which have their address taken so we can't
24+
/// reliably work out where they may be assigned. All variables of this sort
25+
/// escape their local scope and are also considered shared state in the
26+
/// presence of multi-threading.
2327
class dirtyt
2428
{
2529
private:

src/goto-symex/goto_symex.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,11 @@ class goto_symext
473473
}
474474
};
475475

476+
/// Transition to the next instruction, which increments the internal program
477+
/// counter and initializes the loop counter when it detects a loop (or
478+
/// recursion) being entered. 'Next instruction' in this situation refers
479+
/// to the next one in program order, so it ignores things like unconditional
480+
/// GOTOs, and only goes until the end of the current function.
476481
void symex_transition(goto_symext::statet &state);
477482

478483
void symex_transition(

src/goto-symex/goto_symex_state.h

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,14 @@ Author: Daniel Kroening, [email protected]
3030
#include "renaming_level.h"
3131
#include "symex_target_equation.h"
3232

33-
// central data structure: state
33+
/// Central data structure: state.
34+
35+
/// The state is a persistent data structure that symex maintains as it
36+
/// executes. As we walk over each instruction, state will be updated reflecting
37+
/// their effects until a branch occurs (such as an if), where parts of the
38+
/// state will be copied into a \ref goto_statet, stored in a map for later
39+
/// reference and then merged again (via merge_goto) once it reaches a
40+
/// control-flow graph convergence.
3441
class goto_symex_statet final
3542
{
3643
public:
@@ -54,6 +61,11 @@ class goto_symex_statet final
5461
/// distance from entry
5562
unsigned depth;
5663

64+
// A guard is a particular condition that has to pass for an instruction
65+
// to be executed. The easiest example is an if/else: each instruction along
66+
// the if branch will be guarded by the condition of the if (and if there
67+
// is an else branch then instructions on it will be guarded by the negation
68+
// of the condition of the if).
5769
guardt guard{true_exprt{}};
5870
symex_targett::sourcet source;
5971
symex_target_equationt *symex_target;
@@ -72,13 +84,40 @@ class goto_symex_statet final
7284
symex_level1t level1;
7385
symex_level2t level2;
7486

75-
// Map L1 names to (L2) constants
87+
// Map L1 names to (L2) constants. Values will be evicted from this map
88+
// when they become non-constant. This is used to propagate values that have
89+
// been worked out to only have one possible value.
90+
//
91+
// "constants" can include symbols, but only in the context of an address-of
92+
// op (i.e. &x can be propagated), and an address-taken thing should only be
93+
// L1.
7694
std::map<irep_idt, exprt> propagation;
7795
void output_propagation_map(std::ostream &);
7896

97+
// Symex renaming levels.
7998
enum levelt { L0=0, L1=1, L2=2 };
8099

81-
// performs renaming _up to_ the given level
100+
/// Rewrites symbol expressions in \ref exprt, applying a suffix to each
101+
/// symbol reflecting its most recent version, which differs depending on
102+
/// which level you requested. Each level also updates its predecessors, so
103+
/// a L1 rename will update L1 and L0. A L2 will update L2, L1 and L0.
104+
///
105+
/// What happens at each level:
106+
/// L0. Applies a suffix giving the current thread number. (Excludes
107+
/// guards, dynamic objects and anything not considered thread-local)
108+
/// L1. Applies a suffix giving the current loop iteration or recursive
109+
/// function invocation.
110+
/// L2. Applies a suffix giving the generation of this variable.
111+
///
112+
/// Renaming will not increment any of these values, just update the
113+
/// expression with them. Levels matter when reading a variable, for
114+
/// example: reading the value of x really means reading the particular x
115+
/// symbol for this thread (L0 renaming, if applicable), the most recent
116+
/// instance of x (L1 renaming), and the most recent write to x (L2 renaming).
117+
///
118+
/// The above example after being renamed could look like this: 'x!0@0#42'.
119+
/// That states it's the 42nd generation of this variable, on the first
120+
/// thread, in the first frame.
82121
void rename(exprt &expr, const namespacet &ns, levelt level=L2);
83122
void rename(
84123
typet &type,
@@ -100,8 +139,13 @@ class goto_symex_statet final
100139
protected:
101140
void rename_address(exprt &expr, const namespacet &ns, levelt level);
102141

142+
/// Update level 0 values.
103143
void set_l0_indices(ssa_exprt &expr, const namespacet &ns);
144+
145+
/// Update level 0 and 1 values.
104146
void set_l1_indices(ssa_exprt &expr, const namespacet &ns);
147+
148+
/// Update level 0, 1 and 2 values.
105149
void set_l2_indices(ssa_exprt &expr, const namespacet &ns);
106150

107151
// this maps L1 names to (L2) types
@@ -115,6 +159,10 @@ class goto_symex_statet final
115159
// do dereferencing
116160
value_sett value_set;
117161

162+
/// Container for data that varies per program point, e.g. the constant
163+
/// propagator state, when state needs to branch. This is copied out of
164+
/// goto_symex_statet at a control-flow fork and then back into it at a
165+
/// control-flow merge.
118166
class goto_statet
119167
{
120168
public:
@@ -273,6 +321,9 @@ class goto_symex_statet final
273321
bool l2_thread_write_encoding(const ssa_exprt &expr, const namespacet &ns);
274322

275323
bool record_events;
324+
325+
// Local variables are considered 'dirty' if they've had an address taken and
326+
// therefore may be referred to by a pointer.
276327
incremental_dirtyt dirty;
277328

278329
goto_programt::const_targett saved_target;

src/goto-symex/symex_target_equation.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,9 @@ void symex_target_equationt::convert_io(
659659
}
660660
}
661661

662+
/// Merging causes identical ireps to be shared.
663+
/// This is only enabled if the definition SHARING is defined.
664+
/// \param SSA_step The step you want to have shared values.
662665
void symex_target_equationt::merge_ireps(SSA_stept &SSA_step)
663666
{
664667
merge_irep(SSA_step.guard);

0 commit comments

Comments
 (0)