CBMC
|
JANALYZER Command Line Option Processing. More...
#include <util/parse_options.h>
#include <util/timestamper.h>
#include <langapi/language.h>
#include <goto-programs/show_goto_functions.h>
#include <goto-programs/show_properties.h>
#include <java_bytecode/java_bytecode_language.h>
Go to the source code of this file.
Classes | |
class | janalyzer_parse_optionst |
Macros | |
#define | JANALYZER_OPTIONS |
JANALYZER Command Line Option Processing.
Goto-analyze is the tool front-end for CPROVER's classic style abstract interpretation analyses. By "classic style" I mean, domains are C++ objects, transformers are computed using C++ functions and the fix-points are computed by iteration. This is in contrast to 2LS's approach where everything is computed using quantifier-elimination.
The analyses are mostly in analyses/ and although they are used in other places in the code, the goal is that goto-analyze should eventually provide an executable front-end for all of them.
There are a lot of different analyses and a lot of ways they can be used. Goto-analyze has five, largely independent, sets of options:
Formally speaking, 2, 3 and 4 are an artificial distinction as they are all really parts of the "what domain" question. However they correspond to parts of our code architecture, so ... they should stay.
Ideally, the cross product of options should be supported but ... in practice there will always be ones that are not meaningful. Those should give errors. In addition there are some analyses which are currently stand alone as they don't fit directly in to this model. For example the unwind bounds analysis, which is both the task, the abstract interpreter and the output. Where possible these should be integrated / support the other options. In the case of the unwind analysis this means the domain and it's sensitivity should be configurable.
Tasks are implemented by the relevant file in goto-analyze/static_*. At the moment they are each responsible for building the domain / using the other options. As much as possible of this code should be shared. Some of these inherit from messaget. They all probably should.
Show : Prints out the domains for inspection or further use.
Verify : Uses the domain to check all assertions in the code, marking each one "SUCCESS" (the assertion always holds), "FAILURE if reachable" (the assertion never holds), "UNKNOWN" (the assertion may or may not hold). This is implemented using domain_simplify().
Simplify : Generates a new goto program with branch conditions, assertions, assumptions and assignments simplified using the information in the domain (again using domain_simplify()). This task is intended to be used as a preprocessing step for other analysis.
Instrument : (Not implemented yet) Use the domains to add assume() statements to the code giving invariants generated from the domain. These assumes don't reduce the space of possible executions; they make existing invariants explicit. Again, intended as a preprocessing step.
This option is effectively about how we compute the fix-point(s) / which child class of ai_baset we use. I.E. ait<domainT> or concurrency_aware_ait<domainT>, etc. For migrating / refactor / unifying with the pointer analysis code we might want a location_insensitive_ait<domainT> or something but this is not urgent. We will need a context_aware_ait<domainT>.
Which child of ai_domain_baset we use to represent the abstract state at each location / implement the transformers. I expect most of these will be non-relational (i.e. an abstract object for each variable) due to the cost of implementing effective non-relational domains in this style vs. using 2LS. The exception might be equalities, which we could implement here.
Text, XML, JSON plus some others for specific domains such as dependence graphs in DOT format.
Definition in file janalyzer_parse_options.h.
#define JANALYZER_OPTIONS |
Definition at line 120 of file janalyzer_parse_options.h.