Skip to content

Commit 80daeef

Browse files
Add a version of static_verifier that works with propertiest
This will make it easier to use with static_verifiert going forward.
1 parent e36c5f1 commit 80daeef

File tree

5 files changed

+53
-0
lines changed

5 files changed

+53
-0
lines changed

src/goto-analyzer/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ target_link_libraries(goto-analyzer-lib
1212
cpp
1313
linking
1414
big-int
15+
goto-checker
1516
goto-programs
1617
analyses
1718
pointer-analysis

src/goto-analyzer/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ OBJ += ../ansi-c/ansi-c$(LIBEXT) \
1313
../cpp/cpp$(LIBEXT) \
1414
../linking/linking$(LIBEXT) \
1515
../big-int/big-int$(LIBEXT) \
16+
../goto-checker/goto-checker$(LIBEXT) \
1617
../goto-programs/goto-programs$(LIBEXT) \
1718
../analyses/analyses$(LIBEXT) \
1819
../pointer-analysis/pointer-analysis$(LIBEXT) \

src/goto-analyzer/module_dependencies.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ analyses
33
assembler
44
cpp
55
goto-analyzer
6+
goto-checker
67
goto-programs
78
java_bytecode # will go away
89
langapi # should go away

src/goto-analyzer/static_verifier.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,49 @@ struct static_verifier_resultt
2727
irep_idt function_id;
2828
};
2929

30+
void static_verifier(
31+
const abstract_goto_modelt &abstract_goto_model,
32+
const ai_baset &ai,
33+
propertiest &properties)
34+
{
35+
const namespacet ns{abstract_goto_model.get_symbol_table()};
36+
// this is mutable because we want to change the property status
37+
// in this loop
38+
for(auto &property : properties)
39+
{
40+
auto &property_status = property.second.status;
41+
const goto_programt::const_targett &property_location = property.second.pc;
42+
exprt condition = property_location->get_condition();
43+
const std::unique_ptr<ai_baset::statet> predecessor_state_copy =
44+
ai.abstract_state_before(property_location);
45+
// simplify the condition given the domain information we have
46+
// about the state right before the assertion is evaluated
47+
predecessor_state_copy->ai_simplify(condition, ns);
48+
// if the condition simplifies to true the assertion always succeeds
49+
if(condition.is_true())
50+
{
51+
property_status = property_statust::PASS;
52+
}
53+
// if the condition simplifies to false the assertion always fails
54+
else if(condition.is_false())
55+
{
56+
property_status = property_statust::FAIL;
57+
}
58+
// if the domain state is bottom then the assertion is definitely
59+
// unreachable
60+
else if(predecessor_state_copy->is_bottom())
61+
{
62+
property_status = property_statust::NOT_REACHABLE;
63+
}
64+
// if the condition isn't definitely true, false or unreachable
65+
// we don't know whether or not it may fail
66+
else
67+
{
68+
property_status = property_statust::UNKNOWN;
69+
}
70+
}
71+
}
72+
3073
/// Makes a status message string from a status.
3174
static const char *message(const static_verifier_resultt::statust &status)
3275
{

src/goto-analyzer/static_verifier.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ Author: Martin Brain, [email protected]
99
#ifndef CPROVER_GOTO_ANALYZER_STATIC_VERIFIER_H
1010
#define CPROVER_GOTO_ANALYZER_STATIC_VERIFIER_H
1111

12+
#include <goto-checker/properties.h>
1213
#include <iosfwd>
1314

15+
class abstract_goto_modelt;
1416
class ai_baset;
1517
class goto_modelt;
1618
class message_handlert;
@@ -23,4 +25,9 @@ bool static_verifier(
2325
message_handlert &,
2426
std::ostream &);
2527

28+
void static_verifier(
29+
const abstract_goto_modelt &abstract_goto_model,
30+
const ai_baset &ai,
31+
propertiest &properties);
32+
2633
#endif // CPROVER_GOTO_ANALYZER_STATIC_VERIFIER_H

0 commit comments

Comments
 (0)