Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
0ca7a31
Add set struct domains
jakoberzar Oct 29, 2021
1d6ef83
Merge branch 'master' into struct-tuple-domain
michael-schwarz Nov 25, 2021
c56e93f
mv struct tests 41 -> 42
michael-schwarz Nov 25, 2021
ec9ad25
42/*: Change annotations to //UNKNOWN!
michael-schwarz Nov 25, 2021
baeb86a
42/* rename tests to be consecutive
michael-schwarz Nov 25, 2021
a1b00b4
Reorder in defaults.ml
michael-schwarz Nov 25, 2021
37fdf08
use AD.is_top () for is_top_value
michael-schwarz Nov 25, 2021
4e21120
Remove exp.structs.meet-condition by pulling it into invariant
michael-schwarz Nov 25, 2021
e256f79
Change is_bot to for_all
michael-schwarz Nov 25, 2021
cc613c8
Fix usages of `==` instead of `=`
michael-schwarz Nov 25, 2021
47b3126
Simplification
michael-schwarz Nov 25, 2021
17282d6
typos
michael-schwarz Nov 25, 2021
ee3711f
simplify
michael-schwarz Nov 25, 2021
49793e4
simplify
michael-schwarz Nov 25, 2021
c97d860
Merge branch 'master' into struct-tuple-domain
michael-schwarz Nov 26, 2021
03df596
Add names of different options for exp.structs.domain
michael-schwarz Nov 26, 2021
504e920
Typo
michael-schwarz Nov 26, 2021
0921809
Stop leaking cardinal from structs
michael-schwarz Nov 26, 2021
462f007
Simplify signature of struct domains
michael-schwarz Nov 26, 2021
c2b5c38
Remove further things from the lattice signature
michael-schwarz Nov 26, 2021
5f9c2d0
Remove unused cardinal
michael-schwarz Nov 26, 2021
8f73f04
Simplify
michael-schwarz Nov 26, 2021
b7cc955
FlagConfiguredStructDomain: Invariant
michael-schwarz Nov 26, 2021
d40b4af
Rm tracing that was only in one function for some reason
michael-schwarz Nov 26, 2021
0dc97b2
Pull common things up
michael-schwarz Nov 26, 2021
2a2d9b9
refactor
michael-schwarz Nov 26, 2021
e633b3e
further simplify
michael-schwarz Nov 26, 2021
f94c07e
Rm newline
michael-schwarz Nov 26, 2021
fd1ec65
Delegate Base.is_some_bot to VD.is_bot_value
michael-schwarz Nov 26, 2021
daab17d
Redefine map to work on sets
michael-schwarz Nov 26, 2021
7bc34d0
some refactoring
michael-schwarz Nov 26, 2021
c967628
Merge branch 'master' into struct-tuple-domain
michael-schwarz Nov 29, 2021
9467a5c
Move struct test to folder 43
michael-schwarz Nov 29, 2021
99c13c7
tests/43 cleanup includes
michael-schwarz Nov 29, 2021
603ad5e
Structs: Redefine x in terms of x_with_fct
michael-schwarz Nov 29, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 23 additions & 23 deletions src/analyses/base.ml
Original file line number Diff line number Diff line change
Expand Up @@ -454,13 +454,7 @@ struct
| `Top -> `Top
| t -> `Blob (t,s,o)
end
| `Struct s ->
let one_field fl vl st =
match replace_val vl with
| `Top -> st
| v -> ValueDomain.Structs.replace st fl v
in
`Struct (ValueDomain.Structs.fold one_field (ValueDomain.Structs.top ()) s)
| `Struct s -> `Struct (ValueDomain.Structs.map replace_val s)
| _ -> `Top
in
CPA.map replace_val st
Expand Down Expand Up @@ -1281,16 +1275,8 @@ struct

let is_some_bot x =
match x with
| `Int n -> ID.is_bot n
| `Address n -> AD.is_bot n
| `Struct n -> ValueDomain.Structs.is_bot n
| `Union n -> ValueDomain.Unions.is_bot n
| `Array n -> ValueDomain.CArrays.is_bot n
| `Blob n -> ValueDomain.Blobs.is_bot n
| `List n -> ValueDomain.Lists.is_bot n
| `Thread n -> ValueDomain.Threads.is_bot n
| `Bot -> false (* HACK: bot is here due to typing conflict (we do not cast appropriately) *)
| `Top -> false
| _ -> VD.is_bot_value x

let invariant ctx a (gs:glob_fun) st exp tv =
(* We use a recursive helper function so that x != 0 is false can be handled
Expand Down Expand Up @@ -1611,13 +1597,27 @@ struct
| TEnum ({ekind = ik; _}, _) -> `Int (ID.cast_to ik c )
| _ -> `Int c
in
let oldv = eval (Lval x) st in
let v = VD.meet oldv c' in
if is_some_bot v then raise Deadcode
else (
if M.tracing then M.tracel "inv" "improve lval %a from %a to %a (c = %a, c' = %a)\n" d_lval x VD.pretty oldv VD.pretty v ID.pretty c VD.pretty c';
set' x v st
)
(match x with
| Var var, o ->
(* For variables, this is done at to the level of entire variables to benefit e.g. from disjunctive struct domains *)
let oldv = get_var a gs st var in
let offs = convert_offset a gs st o in
let newv = VD.update_offset a oldv offs c' (Some exp) x (var.vtype) in
let v = VD.meet oldv newv in
if is_some_bot v then raise Deadcode
else (
if M.tracing then M.tracel "inv" "improve variable %a from %a to %a (c = %a, c' = %a)\n" d_varinfo var VD.pretty oldv VD.pretty v ID.pretty c VD.pretty c';
set' (Var var,NoOffset) v st
)
| Mem _, _ ->
(* For accesses via pointers, not yet *)
let oldv = eval (Lval x) st in
let v = VD.meet oldv c' in
if is_some_bot v then raise Deadcode
else (
if M.tracing then M.tracel "inv" "improve lval %a from %a to %a (c = %a, c' = %a)\n" d_lval x VD.pretty oldv VD.pretty v ID.pretty c VD.pretty c';
set' x v st
))
| Const _ -> st (* nothing to do *)
| CastE ((TInt (ik, _)) as t, e)
| CastE ((TEnum ({ekind = ik; _ }, _)) as t, e) -> (* Can only meet the t part of an Lval in e with c (unless we meet with all overflow possibilities)! Since there is no good way to do this, we only continue if e has no values outside of t. *)
Expand Down
Loading