Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
frama-c
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container Registry
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
pub
frama-c
Commits
ea4b851d
Commit
ea4b851d
authored
4 years ago
by
Loïc Correnson
Browse files
Options
Downloads
Patches
Plain Diff
[wp] smoke requires
parent
3ee159f6
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
src/plugins/wp/cfgAnnot.ml
+21
-2
21 additions, 2 deletions
src/plugins/wp/cfgAnnot.ml
src/plugins/wp/cfgAnnot.mli
+5
-2
5 additions, 2 deletions
src/plugins/wp/cfgAnnot.mli
src/plugins/wp/cfgCalculus.ml
+11
-12
11 additions, 12 deletions
src/plugins/wp/cfgCalculus.ml
with
37 additions
and
16 deletions
src/plugins/wp/cfgAnnot.ml
+
21
−
2
View file @
ea4b851d
...
@@ -22,6 +22,13 @@
...
@@ -22,6 +22,13 @@
open
Cil_types
open
Cil_types
(* -------------------------------------------------------------------------- *)
(* --- Smoke Tests --- *)
(* -------------------------------------------------------------------------- *)
let
smoke
kf
~
id
?
doomed
?
unreachable
()
=
WpPropId
.
mk_smoke
kf
~
id
?
doomed
?
unreachable
()
,
Logic_const
.
pfalse
(* -------------------------------------------------------------------------- *)
(* -------------------------------------------------------------------------- *)
(* --- Memoization --- *)
(* --- Memoization --- *)
(* -------------------------------------------------------------------------- *)
(* -------------------------------------------------------------------------- *)
...
@@ -40,6 +47,7 @@ end
...
@@ -40,6 +47,7 @@ end
type
behavior
=
{
type
behavior
=
{
bhv_assumes
:
WpPropId
.
pred_info
list
;
bhv_assumes
:
WpPropId
.
pred_info
list
;
bhv_requires
:
WpPropId
.
pred_info
list
;
bhv_requires
:
WpPropId
.
pred_info
list
;
bhv_smokes
:
WpPropId
.
pred_info
list
;
bhv_ensures
:
WpPropId
.
pred_info
list
;
bhv_ensures
:
WpPropId
.
pred_info
list
;
bhv_exits
:
WpPropId
.
pred_info
list
;
bhv_exits
:
WpPropId
.
pred_info
list
;
bhv_post_assigns
:
WpPropId
.
assigns_full_info
;
bhv_post_assigns
:
WpPropId
.
assigns_full_info
;
...
@@ -110,16 +118,27 @@ let normalize_assigns kf ki has_exit bhv ~active = function
...
@@ -110,16 +118,27 @@ let normalize_assigns kf ki has_exit bhv ~active = function
let
get_requires
kf
ki
bhv
=
let
get_requires
kf
ki
bhv
=
List
.
map
(
normalize_pre
kf
ki
bhv
)
bhv
.
b_requires
List
.
map
(
normalize_pre
kf
ki
bhv
)
bhv
.
b_requires
let
get_behavior
kf
ki
~
exits
~
active
bhv
=
let
get_behavior
kf
?
(
ki
=
Kglobal
)
?
(
smoking
=
false
)
?
(
exits
=
false
)
?
(
active
=
[]
)
bhv
=
let
pre_cond
=
normalize_pre
kf
ki
bhv
in
let
pre_cond
=
normalize_pre
kf
ki
bhv
in
let
post_cond
tk
(
kind
,
ip
)
=
let
post_cond
tk
(
kind
,
ip
)
=
if
kind
=
tk
then
Some
(
normalize_post
kf
ki
bhv
tk
ip
)
else
None
in
if
kind
=
tk
then
Some
(
normalize_post
kf
ki
bhv
tk
ip
)
else
None
in
let
p_asgn
,
e_asgn
=
let
p_asgn
,
e_asgn
=
normalize_assigns
kf
ki
exits
bhv
~
active
bhv
.
b_assigns
normalize_assigns
kf
ki
exits
bhv
~
active
bhv
.
b_assigns
in
let
smokes
=
if
smoking
then
if
bhv
.
b_assumes
=
[]
&&
bhv
.
b_requires
=
[]
then
[]
else
let
bname
=
if
Cil
.
is_default_behavior
bhv
then
"default"
else
bhv
.
b_name
in
let
id
=
bname
^
"_requires"
in
let
doomed
=
Property
.
ip_requires_of_behavior
kf
Kglobal
bhv
in
[
smoke
kf
~
id
~
doomed
()
]
else
[]
in
in
{
{
bhv_assumes
=
List
.
map
pre_cond
bhv
.
b_assumes
;
bhv_assumes
=
List
.
map
pre_cond
bhv
.
b_assumes
;
bhv_requires
=
List
.
map
pre_cond
bhv
.
b_requires
;
bhv_requires
=
List
.
map
pre_cond
bhv
.
b_requires
;
bhv_smokes
=
smokes
;
bhv_ensures
=
List
.
filter_map
(
post_cond
Normal
)
bhv
.
b_post_cond
;
bhv_ensures
=
List
.
filter_map
(
post_cond
Normal
)
bhv
.
b_post_cond
;
bhv_exits
=
List
.
filter_map
(
post_cond
Exits
)
bhv
.
b_post_cond
;
bhv_exits
=
List
.
filter_map
(
post_cond
Exits
)
bhv
.
b_post_cond
;
bhv_post_assigns
=
p_asgn
;
bhv_post_assigns
=
p_asgn
;
...
...
This diff is collapsed.
Click to expand it.
src/plugins/wp/cfgAnnot.mli
+
5
−
2
View file @
ea4b851d
...
@@ -35,6 +35,7 @@ open WpPropId
...
@@ -35,6 +35,7 @@ open WpPropId
type
behavior
=
{
type
behavior
=
{
bhv_assumes
:
pred_info
list
;
bhv_assumes
:
pred_info
list
;
bhv_requires
:
pred_info
list
;
bhv_requires
:
pred_info
list
;
bhv_smokes
:
pred_info
list
;
bhv_ensures
:
pred_info
list
;
bhv_ensures
:
pred_info
list
;
bhv_exits
:
pred_info
list
;
bhv_exits
:
pred_info
list
;
bhv_post_assigns
:
assigns_full_info
;
bhv_post_assigns
:
assigns_full_info
;
...
@@ -42,11 +43,13 @@ type behavior = {
...
@@ -42,11 +43,13 @@ type behavior = {
}
}
val
get_requires
:
kernel_function
->
kinstr
->
funbehavior
->
pred_info
list
val
get_requires
:
kernel_function
->
kinstr
->
funbehavior
->
pred_info
list
val
get_behavior
:
val
get_behavior
:
kernel_function
->
kinstr
->
exits
:
bool
->
active
:
string
list
->
kernel_function
->
?
ki
:
kinstr
->
?
smoking
:
bool
->
?
exits
:
bool
->
?
active
:
string
list
->
funbehavior
->
behavior
funbehavior
->
behavior
val
get_preconditions
:
goal
:
bool
->
kernel_function
->
pred_info
list
val
get_preconditions
:
goal
:
bool
->
kernel_function
->
pred_info
list
val
get_complete_behaviors
:
kernel_function
->
pred_info
list
val
get_complete_behaviors
:
kernel_function
->
pred_info
list
val
get_disjoint_behaviors
:
kernel_function
->
pred_info
list
val
get_disjoint_behaviors
:
kernel_function
->
pred_info
list
...
...
This diff is collapsed.
Click to expand it.
src/plugins/wp/cfgCalculus.ml
+
11
−
12
View file @
ea4b851d
...
@@ -321,26 +321,24 @@ struct
...
@@ -321,26 +321,24 @@ struct
I
.
process_global_init
env
.
we
env
.
mode
.
kf
@@
I
.
process_global_init
env
.
we
env
.
mode
.
kf
@@
W
.
scope
env
.
we
[]
SC_Global
w
W
.
scope
env
.
we
[]
SC_Global
w
let
do_preconditions
env
~
formals
bhvs
w
=
let
do_preconditions
env
~
formals
(
b
:
CfgAnnot
.
behavior
)
w
=
let
kf
=
env
.
mode
.
kf
in
let
kf
=
env
.
mode
.
kf
in
let
init
=
WpStrategy
.
is_main_init
kf
in
let
init
=
WpStrategy
.
is_main_init
kf
in
let
behaviors
=
let
side_
behaviors
=
if
init
||
WpLog
.
PrecondWeakening
.
get
()
then
[]
if
init
||
WpLog
.
PrecondWeakening
.
get
()
then
[]
else
CfgAnnot
.
get_preconditions
~
goal
:
false
kf
in
else
CfgAnnot
.
get_preconditions
~
goal
:
false
kf
in
let
defaults
=
default_requires
env
.
mode
kf
in
let
requires_init
=
if
init
then
b
.
bhv_requires
else
[]
in
let
requires
=
bhvs
.
CfgAnnot
.
bhv_requires
in
let
initreqs
=
if
init
then
requires
else
[]
in
let
assumes
=
bhvs
.
CfgAnnot
.
bhv_assumes
in
(* pre-state *)
(* pre-state *)
W
.
label
env
.
we
None
Clabels
.
pre
@@
W
.
label
env
.
we
None
Clabels
.
pre
@@
(* frame-in *)
(* frame-in *)
W
.
scope
env
.
we
formals
SC_Frame_in
@@
W
.
scope
env
.
we
formals
SC_Frame_in
@@
(* pre-conditions *)
(* pre-conditions *)
List
.
fold_right
(
use_property
env
)
defaults
@@
List
.
fold_right
(
use_property
env
)
(
default_requires
env
.
mode
kf
)
@@
List
.
fold_right
(
use_property
env
)
assumes
@@
List
.
fold_right
(
use_property
env
)
b
.
bhv_assumes
@@
List
.
fold_right
(
prove_property
env
)
initreqs
@@
List
.
fold_right
(
prove_property
env
)
requires_init
@@
List
.
fold_right
(
use_property
env
)
requires
@@
List
.
fold_right
(
use_property
env
)
b
.
bhv_requires
@@
List
.
fold_right
(
use_property
env
)
behaviors
w
List
.
fold_right
(
prove_property
env
)
b
.
bhv_smokes
@@
List
.
fold_right
(
use_property
env
)
side_behaviors
w
let
do_post
env
~
formals
(
b
:
CfgAnnot
.
behavior
)
w
=
let
do_post
env
~
formals
(
b
:
CfgAnnot
.
behavior
)
w
=
W
.
scope
env
.
we
formals
SC_Frame_out
@@
W
.
scope
env
.
we
formals
SC_Frame_out
@@
...
@@ -380,7 +378,8 @@ struct
...
@@ -380,7 +378,8 @@ struct
}
in
}
in
let
formals
=
Kf
.
get_formals
kf
in
let
formals
=
Kf
.
get_formals
kf
in
let
exits
=
not
@@
Kf
.
Set
.
is_empty
@@
CfgInfos
.
calls
infos
in
let
exits
=
not
@@
Kf
.
Set
.
is_empty
@@
CfgInfos
.
calls
infos
in
let
bhv
=
CfgAnnot
.
get_behavior
kf
Kglobal
~
exits
~
active
:
[]
mode
.
bhv
in
let
smoking
=
WpLog
.
SmokeTests
.
get
()
in
let
bhv
=
CfgAnnot
.
get_behavior
kf
~
smoking
~
exits
mode
.
bhv
in
begin
begin
W
.
close
env
.
we
@@
W
.
close
env
.
we
@@
do_global_init
env
@@
do_global_init
env
@@
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment