Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
e0d88ee
First steps towards tracking things that have their address taken
michael-schwarz Apr 16, 2022
75482dd
Add test exhibiting problematic issue
michael-schwarz Apr 16, 2022
ae00554
Keep values of things that are pointed to
michael-schwarz Apr 16, 2022
5d66309
progress in tracking things that have their address taken
michael-schwarz Apr 16, 2022
18baca1
Fixes towards handling things having their address taken in apron
michael-schwarz May 19, 2022
b99ff58
Add additional test
michael-schwarz May 19, 2022
c7e747d
Add problematic example
michael-schwarz May 19, 2022
099e701
Fix replacement when actual may be modified by call
michael-schwarz May 22, 2022
8b491b7
Add "escaping" via recursion example
michael-schwarz May 22, 2022
3aa4134
Use `is_multiple` in apron
michael-schwarz May 22, 2022
4feb04e
Apron: steps towards handling escaping
michael-schwarz May 22, 2022
fe117be
Add exmpale of confusion between locals of different procedures :/
michael-schwarz May 23, 2022
138df18
Add comment to 46/11
michael-schwarz May 23, 2022
d657138
Use vids also in privatizations
michael-schwarz May 23, 2022
7901cb2
Fix in protection based
michael-schwarz May 23, 2022
10e80e2
Add asserts to escape tests taht highlight what goes wrong
michael-schwarz May 23, 2022
577f1c0
Smaller example
michael-schwarz May 23, 2022
739ef9c
escaping of locals
michael-schwarz May 24, 2022
89bffce
Add example that should work
michael-schwarz Jun 8, 2022
df4d2d8
Rename initializer test and mark as TODO
michael-schwarz Jun 8, 2022
c8272b5
Simplify `assign_to_global_wrapper`
michael-schwarz Jun 8, 2022
732f89f
Add invalidation
michael-schwarz Jun 9, 2022
798748e
Merge branch 'master' into apron_track_address
michael-schwarz Jun 9, 2022
0ee9e18
Fix apron exp threshold widening with globals
sim642 Jun 10, 2022
b7c0cfa
36/07: rm spurious statement
michael-schwarz Jun 10, 2022
6bf4ef3
Add comment on possible future improvement
michael-schwarz Jun 10, 2022
ea41437
Normalize whitespace
michael-schwarz Jun 10, 2022
db97892
46/{06,11}: Update outdated comments
michael-schwarz Jun 10, 2022
f0a4f95
Add comment about ProtectionBasedPriv not considering escapes
michael-schwarz Jun 10, 2022
2d48d5b
rm outdated comment
michael-schwarz Jun 10, 2022
2c69f46
Try to replace pointr derefs with variables also in query
michael-schwarz Jun 10, 2022
cb5ab2e
Merge branch 'master' into apron_track_address
michael-schwarz Jun 20, 2022
ee7c367
Change when llocals are passed to callee
michael-schwarz Jun 21, 2022
72060b7
Add TODO
michael-schwarz Jun 21, 2022
b0fbdd9
Simplify ApronPriv.VM
michael-schwarz Jun 21, 2022
759bce1
Unknown function calls: Invalidate also things reachable via globals
michael-schwarz Jun 21, 2022
842efde
Fix unknown pointer handling in apron dereference
sim642 Jun 22, 2022
f52cf30
Fix TypeOfError crashes in ApronDomain
sim642 Jun 22, 2022
f0ce57c
rm outdated comment
michael-schwarz Jun 22, 2022
e4d5d95
Fix apron domain top crash on knot
sim642 Jun 22, 2022
fa8113e
Merge branch 'master' into apron_track_address
sim642 Jun 23, 2022
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
56 changes: 30 additions & 26 deletions src/analyses/apron/apronAnalysis.apron.ml
Original file line number Diff line number Diff line change
Expand Up @@ -373,18 +373,18 @@ struct
invalidate_one ask ctx st (Lval.CilLval.to_lval lval)
) rs st


let special ctx r f args =
let ask = Analyses.ask_of_ctx ctx in
let st = ctx.local in
let desc = LibraryFunctions.find f in
match desc.special args, f.vname with
(* TODO: assert handling from https://github.com/goblint/analyzer/pull/278 *)
| `Assert expression -> st
| `Unknown "__goblint_check" -> st
| `Unknown "__goblint_commit" -> st
| `Unknown "__goblint_assert" -> st
| `ThreadJoin (id,retvar) ->
| Assert expression, _ -> st
| Unknown, "__goblint_check" -> st
| Unknown, "__goblint_commit" -> st
| Unknown, "__goblint_assert" -> st
| ThreadJoin { thread = id; ret_var = retvar }, _ ->
(* nothing to invalidate as only arguments that have their AddrOf taken may be invalidated *)
(
(* Forget value that thread return is assigned to *)
let st' = forget_reachable ctx st [retvar] in
Expand All @@ -394,28 +394,32 @@ struct
| None -> st'
)
| _, _ ->
let ask = Analyses.ask_of_ctx ctx in
let st' = match LibraryFunctions.get_invalidate_action f.vname with
| Some fnc -> forget_reachable ctx st (fnc `Write args)
| None ->
let st' = if GobConfig.get_bool "sem.unknown_function.invalidate.globals" then (
let globals = foldGlobals !Cilfacade.current_file (fun acc global ->
match global with
| GVar (vi, _, _) when not (BaseUtil.is_static vi) ->
(Var vi, NoOffset) :: acc
(* TODO: what about GVarDecl? *)
| _ -> acc
) []
in
List.fold_left (invalidate_one ask ctx) st globals)
else
st
let lvallist e =
let s = ask.f (Queries.MayPointTo e) in
match s with
| `Top -> []
| `Lifted _ -> List.map (Lval.CilLval.to_lval) (Queries.LS.elements s)
in
let shallow_addrs = LibraryDesc.Accesses.find desc.accs { kind = Write; deep = false } args in
let deep_addrs = LibraryDesc.Accesses.find desc.accs { kind = Write; deep = true } args in
let st' =
if List.mem LibraryDesc.InvalidateGlobals desc.attrs then (
let globals = foldGlobals !Cilfacade.current_file (fun acc global ->
match global with
| GVar (vi, _, _) when not (BaseUtil.is_static vi) ->
(Var vi, NoOffset) :: acc
(* TODO: what about GVarDecl? *)
| _ -> acc
) []
in
if GobConfig.get_bool "sem.unknown_function.invalidate.args" then
forget_reachable ctx st' args
else
st'
List.fold_left (invalidate_one ask ctx) st globals
)
else
st
in
let st' = forget_reachable ctx st' deep_addrs in
let shallow_lvals = List.concat_map lvallist shallow_addrs in
let st' = List.fold_left (invalidate_one ask ctx) st' shallow_lvals in
(* invalidate lval if present *)
match r with
| Some lv -> invalidate_one ask ctx st' lv
Expand Down
28 changes: 22 additions & 6 deletions src/analyses/apron/apronPriv.apron.ml
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,8 @@ struct
module V = EmptyV
module AV = ApronDomain.V

type apron_components_t = ApronDomain.ApronComponents (AD) (D).t

type apron_components_t = ApronComponents (AD) (D).t

module AV = ApronDomain.V

let name () = "top"
let startstate () = ()
let should_join _ _ = true
Expand All @@ -81,6 +77,7 @@ struct
let thread_return ask getg sideg tid st = st

let sync ask getg sideg st reason = st

let escape node ask getg sideg (st:apron_components_t) escaped:apron_components_t =
let apr = st.apr in
let esc_vars = List.filter (fun var -> match AV.find_metadata var with
Expand All @@ -97,6 +94,27 @@ struct
let apr_local = AD.remove_vars apr esc_vars in
{ st with apr = apr_local }

let sync (ask: Q.ask) getg sideg (st: apron_components_t) reason =
match reason with
| `Join ->
if (ask.f Q.MustBeSingleThreaded) then
st
else
(* must be like enter_multithreaded *)
let apr = st.apr in
let apr_local = AD.remove_filter apr (fun var ->
match AV.find_metadata var with
| Some (Global _) -> true
| _ -> false
)
in
{st with apr = apr_local}
| `Normal
| `Init
| `Thread
| `Return ->
st

let enter_multithreaded ask getg sideg (st: apron_components_t): apron_components_t =
let apr = st.apr in
let apr_local = AD.remove_filter apr (fun var ->
Expand All @@ -110,8 +128,6 @@ struct
let threadenter ask getg (st: apron_components_t): apron_components_t =
{apr = AD.bot (); priv = startstate ()}

(* TODO: remove escaped locals after PR #742 *)

let init () = ()
let finalize () = ()
end
Expand Down
2 changes: 1 addition & 1 deletion tests/regression/36-apron/07-problem-pointer.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization dummy
// SKIP PARAM: --set ana.activated[+] apron
extern int __VERIFIER_nondet_int();

void change(int *p) {
Expand Down
2 changes: 1 addition & 1 deletion tests/regression/46-apron2/05-pointer-multilevel.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization dummy
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization top
extern int __VERIFIER_nondet_int();

void otherchange(int* ptr) {
Expand Down
2 changes: 1 addition & 1 deletion tests/regression/46-apron2/06-pointer-multilevel-two.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization dummy
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization top
extern int __VERIFIER_nondet_int();

void change(int *p,int i) {
Expand Down
2 changes: 1 addition & 1 deletion tests/regression/46-apron2/07-escaping-recursion.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization dummy
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization top
// Copy of 01/52 for Apron
int rec(int i,int* ptr) {
int top;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization dummy
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization top
// Copy of 45 01 for apron
#include <pthread.h>
#include <assert.h>
Expand Down
2 changes: 1 addition & 1 deletion tests/regression/46-apron2/11-names.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization dummy
// SKIP PARAM: --set solver td3 --set ana.activated "['base','threadid','threadflag','mallocWrapper','apron','escape']" --set ana.base.privatization none --set ana.apron.privatization top
extern int __VERIFIER_nondet_int();

void change(int *p) {
Expand Down
You are viewing a condensed version of this merge commit. You can view the full changes here.