
Several transformations rely on boolean and integer expressions that have a known value, known as opaque predicates and expressions. To construct these, data structures with precise invariants are added to the code.
At a minimum, you must create one or more opaque invariant data structures:
| Option | Arguments | Description | 
|---|---|---|
| --Transform | InitOpaque | Add opaque initialization code. This initialization code has to be added to a function that gets called before any uses of opaque predicates, usually, but not necessarily, to main. | 
| --InitOpaqueStructs | list, array, input, env, * |  Comma-separated list of the kinds of opaque constructs to add. Default=list,array.
  | 
| --InitOpaqueCount | INTSPEC | How many opaque data structures (lists or arrays) to add to the program. They will be split roughly evenly between the different declared opaque structures. Default=1. | 
| --InitOpaqueTrace | update, use, check |  Trace opaque structures and values as they are generated during execution. This used to be a boolean, but from version 3.3, it can take on multiple values. Default=NONE.
  | 
| --InitOpaqueDebug | BOOLSPEC | If true, then we store all opaque values in a temporary variable. This can help with debugging when looking at the generated code. For example, if you see a variable named _OPAQUE_Array_42_expected_128, it means: 1)this is opaque expression number 42; 2) it is computed based on an Array opaque kind; and 3) it should always have the value 128. Default=FALSE. | 
| --InitOpaqueSize | INTSPEC | Size of opaque arrays. Default=30. | 
To frustrate analysis, updates that maintain the invariants should
   be sprinkled throughout the program. This is done by the --Transform=UpdateOpaque
   option:
            
| Option | Arguments | Description | 
|---|---|---|
| --Transform | UpdateOpaque | Add code that makes updates to opaque predicates. | 
| --UpdateOpaqueCount | INTSPEC | How many updates to opaque data structures to add to the function. Default=1. | 
| --UpdateOpaqueTrace | BOOLSPEC | Print the updated structure. Default=false. | 
| --UpdateOpaqueDebug | BOOLSPEC | If true, then we store all opaque values in a temporary variable that reveals its expected value. Default=FALSE. | 
| --UpdateOpaqueAllowAddNodes | bool | Is it safe to malloc new nodes for the opaque data structure in this function? Only set to true if the function is called sparingly. Default=false. | 
 Note: In --Transform=InitOpaque --Functions=foo, the function foo
     must execute before any use of an opaque expression. Easiest is to set 
     --Transform=InitOpaque --Functions=main but this is best avoided since it
     is very obvious.
            
Tigress will generate copious numbers of extra local
variables and statements of the form _*__BARRIER_* = 1,
_*__BEGIN_* = 1, _*__END_* = 1. They
will be removed by any competent compiler, or by the
--Transform=CleanUp --CleanUpKinds=annotations 
transformation.