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
3eb276f8
Commit
3eb276f8
authored
9 months ago
by
Loïc Correnson
Browse files
Options
Downloads
Patches
Plain Diff
[region] add-code
parent
b03f3586
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
src/plugins/region/code.ml
+56
-56
56 additions, 56 deletions
src/plugins/region/code.ml
src/plugins/region/code.mli
+0
-5
0 additions, 5 deletions
src/plugins/region/code.mli
src/plugins/region/memory.ml
+8
-6
8 additions, 6 deletions
src/plugins/region/memory.ml
with
64 additions
and
67 deletions
src/plugins/region/code.ml
+
56
−
56
View file @
3eb276f8
...
...
@@ -28,57 +28,57 @@ open Memory
(* --- L-Values & Expressions --- *)
(* -------------------------------------------------------------------------- *)
let
rec
lval
(
m
:
map
)
(
s
:
stmt
)
(
lv
:
lval
)
:
node
=
let
rec
add_
lval
(
m
:
map
)
(
s
:
stmt
)
(
lv
:
lval
)
:
node
=
let
h
=
fst
lv
in
loffset
m
s
(
lhost
m
s
h
)
(
Cil
.
typeOfLhost
h
)
(
snd
lv
)
add_
loffset
m
s
(
add_
lhost
m
s
h
)
(
Cil
.
typeOfLhost
h
)
(
snd
lv
)
and
lhost
(
m
:
map
)
(
s
:
stmt
)
=
function
and
add_
lhost
(
m
:
map
)
(
s
:
stmt
)
=
function
|
Var
x
->
Memory
.
add_root
m
x
|
Mem
e
->
pointer
m
s
e
|
Mem
e
->
add_
pointer
m
s
e
and
loffset
(
m
:
map
)
(
s
:
stmt
)
(
r
:
node
)
(
ty
:
typ
)
=
function
and
add_
loffset
(
m
:
map
)
(
s
:
stmt
)
(
r
:
node
)
(
ty
:
typ
)
=
function
|
NoOffset
->
r
|
Field
(
fd
,
ofs
)
->
loffset
m
s
(
add_field
m
r
fd
)
fd
.
ftype
ofs
add_
loffset
m
s
(
add_field
m
r
fd
)
fd
.
ftype
ofs
|
Index
(
_
,
ofs
)
->
loffset
m
s
(
add_index
m
r
ty
)
(
Cil
.
typeOf_array_elem
ty
)
ofs
add_
loffset
m
s
(
add_index
m
r
ty
)
(
Cil
.
typeOf_array_elem
ty
)
ofs
and
pointer
m
s
e
=
match
exp
m
s
e
with
None
->
add_cell
m
()
|
Some
r
->
r
and
add_
pointer
m
s
e
=
match
add_
exp
m
s
e
with
None
->
add_cell
m
()
|
Some
r
->
r
and
value
m
s
e
=
ignore
(
exp
m
s
e
)
and
add_
value
m
s
e
=
ignore
(
add_
exp
m
s
e
)
and
exp
(
m
:
map
)
(
s
:
stmt
)
(
e
:
exp
)
:
node
option
=
and
add_
exp
(
m
:
map
)
(
s
:
stmt
)
(
e
:
exp
)
:
node
option
=
match
e
.
enode
with
|
AddrOf
lv
|
StartOf
lv
->
let
rv
=
lval
m
s
lv
in
let
rv
=
add_
lval
m
s
lv
in
Some
rv
|
Lval
lv
->
let
rv
=
lval
m
s
lv
in
let
rv
=
add_
lval
m
s
lv
in
Memory
.
read
m
rv
(
Lval
(
s
,
lv
))
;
Memory
.
add_value
m
rv
@@
Cil
.
typeOfLval
lv
|
UnOp
(
_
,
e
,_
)
->
value
m
s
e
;
None
add_
value
m
s
e
;
None
|
BinOp
((
PlusPI
|
MinusPI
)
,
p
,
k
,_
)
->
value
m
s
k
;
let
r
=
pointer
m
s
p
in
add_
value
m
s
k
;
let
r
=
add_
pointer
m
s
p
in
(*TODO: move the 'A' access on the source of the pointed region *)
(*Memory.shift m r (Exp(s,p)) ;*)
Some
r
|
BinOp
(
_
,
a
,
b
,_
)
->
value
m
s
a
;
value
m
s
b
;
add_
value
m
s
a
;
add_
value
m
s
b
;
None
|
CastE
(
ty
,
p
)
->
if
Cil
.
isPointerType
ty
then
Some
(
pointer
m
s
p
)
Some
(
add_
pointer
m
s
p
)
else
(
value
m
s
p
;
None
)
(
add_
value
m
s
p
;
None
)
|
Const
_
|
SizeOf
_
|
SizeOfE
_
|
SizeOfStr
_
...
...
@@ -89,45 +89,45 @@ and exp (m: map) (s:stmt) (e:exp) : node option =
(* --- Initializers --- *)
(* -------------------------------------------------------------------------- *)
let
rec
init
(
m
:
map
)
(
s
:
stmt
)
(
acs
:
Access
.
acs
)
(
lv
:
lval
)
(
iv
:
init
)
=
let
rec
add_
init
(
m
:
map
)
(
s
:
stmt
)
(
acs
:
Access
.
acs
)
(
lv
:
lval
)
(
iv
:
init
)
=
match
iv
with
|
SingleInit
e
->
let
r
=
lval
m
s
lv
in
let
r
=
add_
lval
m
s
lv
in
Memory
.
write
m
r
acs
;
Option
.
iter
(
Memory
.
add_points_to
m
r
)
(
exp
m
s
e
)
Option
.
iter
(
Memory
.
add_points_to
m
r
)
(
add_
exp
m
s
e
)
|
CompoundInit
(
_
,
fvs
)
->
List
.
iter
(
fun
(
ofs
,
iv
)
->
let
lv
=
Cil
.
addOffsetLval
ofs
lv
in
init
m
s
acs
lv
iv
add_
init
m
s
acs
lv
iv
)
fvs
(* -------------------------------------------------------------------------- *)
(* --- Instructions --- *)
(* -------------------------------------------------------------------------- *)
let
instr
(
m
:
map
)
(
s
:
stmt
)
(
instr
:
instr
)
=
let
add_
instr
(
m
:
map
)
(
s
:
stmt
)
(
instr
:
instr
)
=
match
instr
with
|
Skip
_
|
Code_annot
_
->
()
|
Set
(
lv
,
e
,_
)
->
let
r
=
lval
m
s
lv
in
let
v
=
exp
m
s
e
in
let
r
=
add_
lval
m
s
lv
in
let
v
=
add_
exp
m
s
e
in
Memory
.
write
m
r
(
Lval
(
s
,
lv
))
;
Option
.
iter
(
Memory
.
add_points_to
m
r
)
v
|
Local_init
(
x
,
AssignInit
iv
,_
)
->
let
acs
=
Access
.
Init
(
s
,
x
)
in
init
m
s
acs
(
Var
x
,
NoOffset
)
iv
add_
init
m
s
acs
(
Var
x
,
NoOffset
)
iv
|
Call
(
lr
,
e
,
es
,_
)
->
value
m
s
e
;
List
.
iter
(
value
m
s
)
es
;
add_
value
m
s
e
;
List
.
iter
(
add_
value
m
s
)
es
;
Option
.
iter
(
fun
lv
->
let
r
=
lval
m
s
lv
in
let
r
=
add_
lval
m
s
lv
in
Memory
.
write
m
r
(
Lval
(
s
,
lv
))
)
lr
;
Options
.
warning
~
source
:
(
fst
@@
Stmt
.
loc
s
)
"Incomplete call analysis"
...
...
@@ -148,46 +148,46 @@ type rmap = Memory.map Stmt.Map.t ref
let
store
rmap
m
s
=
rmap
:=
Stmt
.
Map
.
add
s
(
Memory
.
copy
~
locked
:
true
m
)
!
rmap
let
rec
stmt
(
r
:
rmap
)
(
m
:
map
)
(
s
:
stmt
)
=
let
rec
add_
stmt
(
r
:
rmap
)
(
m
:
map
)
(
s
:
stmt
)
=
let
annots
=
Annotations
.
code_annot
s
in
if
annots
<>
[]
then
Options
.
warning
~
source
:
(
fst
@@
Stmt
.
loc
s
)
"Annotations not analyzed"
;
match
s
.
skind
with
|
Instr
ki
->
instr
m
s
ki
;
store
r
m
s
|
Return
(
Some
e
,_
)
->
value
m
s
e
;
store
r
m
s
|
Instr
ki
->
add_
instr
m
s
ki
;
store
r
m
s
|
Return
(
Some
e
,_
)
->
add_
value
m
s
e
;
store
r
m
s
|
Goto
_
|
Break
_
|
Continue
_
|
Return
(
None
,_
)
->
store
r
m
s
|
If
(
e
,
st
,
se
,_
)
->
value
m
s
e
;
add_
value
m
s
e
;
store
r
m
s
;
block
r
m
st
;
block
r
m
se
;
add_
block
r
m
st
;
add_
block
r
m
se
;
|
Switch
(
e
,
b
,_,_
)
->
value
m
s
e
;
add_
value
m
s
e
;
store
r
m
s
;
block
r
m
b
;
|
Block
b
|
Loop
(
_
,
b
,_,_,_
)
->
block
r
m
b
|
UnspecifiedSequence
s
->
block
r
m
@@
Cil
.
block_from_unspecified_sequence
s
|
Throw
(
exn
,_
)
->
Option
.
iter
(
fun
(
e
,_
)
->
value
m
s
e
)
exn
add_
block
r
m
b
;
|
Block
b
|
Loop
(
_
,
b
,_,_,_
)
->
add_
block
r
m
b
|
UnspecifiedSequence
s
->
add_
block
r
m
@@
Cil
.
block_from_unspecified_sequence
s
|
Throw
(
exn
,_
)
->
Option
.
iter
(
fun
(
e
,_
)
->
add_
value
m
s
e
)
exn
|
TryCatch
(
b
,
hs
,_
)
->
block
r
m
b
;
List
.
iter
(
fun
(
c
,
b
)
->
catch
r
m
c
;
block
r
m
b
)
hs
;
add_
block
r
m
b
;
List
.
iter
(
fun
(
c
,
b
)
->
add_
catch
r
m
c
;
add_
block
r
m
b
)
hs
;
|
TryExcept
(
a
,
(
ks
,
e
)
,
b
,_
)
->
block
r
m
a
;
List
.
iter
(
instr
m
s
)
ks
;
value
m
s
e
;
block
r
m
b
;
add_
block
r
m
a
;
List
.
iter
(
add_
instr
m
s
)
ks
;
add_
value
m
s
e
;
add_
block
r
m
b
;
|
TryFinally
(
a
,
b
,_
)
->
block
r
m
a
;
block
r
m
b
;
add_
block
r
m
a
;
add_
block
r
m
b
;
and
catch
(
r
:
rmap
)
(
m
:
map
)
(
c
:
catch_binder
)
=
and
add_
catch
(
r
:
rmap
)
(
m
:
map
)
(
c
:
catch_binder
)
=
match
c
with
|
Catch_all
->
()
|
Catch_exn
(
_
,
xbs
)
->
List
.
iter
(
fun
(
_
,
b
)
->
block
r
m
b
)
xbs
|
Catch_exn
(
_
,
xbs
)
->
List
.
iter
(
fun
(
_
,
b
)
->
add_
block
r
m
b
)
xbs
and
block
(
r
:
rmap
)
(
m
:
map
)
(
b
:
block
)
=
List
.
iter
(
stmt
r
m
)
b
.
bstmts
and
add_
block
(
r
:
rmap
)
(
m
:
map
)
(
b
:
block
)
=
List
.
iter
(
add_
stmt
r
m
)
b
.
bstmts
(* -------------------------------------------------------------------------- *)
(* --- Behavior --- *)
...
...
@@ -198,7 +198,7 @@ type imap = Memory.map Property.Map.t ref
let
istore
imap
m
ip
=
imap
:=
Property
.
Map
.
add
ip
(
Memory
.
copy
~
locked
:
true
m
)
!
imap
let
bhv
~
kf
(
s
:
imap
)
(
m
:
map
)
(
bhv
:
behavior
)
=
let
add_
bhv
~
kf
(
s
:
imap
)
(
m
:
map
)
(
bhv
:
behavior
)
=
List
.
iter
(
fun
e
->
let
rs
=
Annot
.
of_extension
e
in
...
...
@@ -227,13 +227,13 @@ let domain ?global kf =
begin
try
let
funspec
=
Annotations
.
funspec
kf
in
List
.
iter
(
bhv
~
kf
s
m
)
funspec
.
spec_behavior
;
List
.
iter
(
add_
bhv
~
kf
s
m
)
funspec
.
spec_behavior
;
with
Annotations
.
No_funspec
_
->
()
end
;
begin
try
let
fundec
=
Kernel_function
.
get_definition
kf
in
block
r
m
fundec
.
sbody
;
add_
block
r
m
fundec
.
sbody
;
with
Kernel_function
.
No_Definition
->
()
end
;
{
...
...
This diff is collapsed.
Click to expand it.
src/plugins/region/code.mli
+
0
−
5
View file @
3eb276f8
...
...
@@ -24,11 +24,6 @@ open Cil_types
open
Cil_datatype
open
Memory
val
lval
:
map
->
stmt
->
lval
->
node
val
exp
:
map
->
stmt
->
exp
->
node
option
val
instr
:
map
->
stmt
->
instr
->
unit
val
stmt
:
map
Stmt
.
Map
.
t
ref
->
map
->
stmt
->
unit
(** All the provided maps are locked. *)
type
domain
=
{
map
:
map
;
...
...
This diff is collapsed.
Click to expand it.
src/plugins/region/memory.ml
+
8
−
6
View file @
3eb276f8
...
...
@@ -485,12 +485,14 @@ and offset (m: map) (r: node) (ofs: offset) : node =
match
ofs
with
|
NoOffset
->
Ufind
.
find
m
.
store
r
|
Field
(
fd
,
ofs
)
->
let
_
,
rgs
=
cranges
m
r
in
let
(
p
,
w
)
=
Cil
.
fieldBitsOffset
fd
in
let
rg
=
Ranges
.
find
p
rgs
in
if
rg
.
offset
<=
p
&&
p
+
w
<=
rg
.
offset
+
rg
.
length
then
offset
m
rg
.
data
ofs
else
raise
Not_found
if
fd
.
fcomp
.
cstruct
then
let
_
,
rgs
=
cranges
m
r
in
let
(
p
,
w
)
=
Cil
.
fieldBitsOffset
fd
in
let
rg
=
Ranges
.
find
p
rgs
in
if
rg
.
offset
<=
p
&&
p
+
w
<=
rg
.
offset
+
rg
.
length
then
offset
m
rg
.
data
ofs
else
raise
Not_found
else
r
|
Index
(
_
,
ofs
)
->
let
s
,
rgs
=
cranges
m
r
in
match
rgs
with
...
...
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