Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
165 commits
Select commit Hold shift + click to select a range
3bbe288
Enable int refinement in `traces.json`
michael-schwarz Apr 16, 2024
f62f74f
Typo
michael-schwarz Apr 16, 2024
0755057
Enable `def_exc_widen_by_join`
michael-schwarz Apr 16, 2024
4c3a0a3
Typo
michael-schwarz Apr 17, 2024
35427ae
Typo
michael-schwarz Apr 17, 2024
6e17641
Typos
michael-schwarz Apr 17, 2024
a11f713
Add `exp.priv-prec-dump-suffix`
michael-schwarz Apr 17, 2024
811c183
Hotfix for #1421
michael-schwarz Apr 19, 2024
34411aa
precComp: Fix stderr output colorization
michael-schwarz Apr 21, 2024
af887b2
Add `exp.priv-prec-dump-proj` option
michael-schwarz Apr 21, 2024
2b7e509
Just warn instead of crash if an argument to a string function does n…
michael-schwarz Apr 21, 2024
7cfa3b1
Initiate buckets
michael-schwarz Apr 22, 2024
b9a110d
Change to macos-13 in GitHub Actions for x86_64 OSX
sim642 Apr 23, 2024
d33ccbf
Output more sophisticated stats
michael-schwarz Apr 24, 2024
ba4272d
Merge pull request #1431 from goblint/prec_compare_buckets
michael-schwarz Apr 24, 2024
22fdef6
Make `traces` and `traces-rel` more similar
michael-schwarz Apr 25, 2024
1b180d4
Add `bot_in_blob_leq_bot` so `bot` and `Blob(bot)` comapre equal in p…
michael-schwarz Apr 25, 2024
549f152
Find more catch-all exception handlers
sim642 Apr 26, 2024
097a137
Fix catch-all in LoopUnrolling
sim642 Apr 26, 2024
868e7d9
Fix catch-all in base exp_may_signed_overflow
sim642 Apr 26, 2024
ec6ada3
Fix catch-all in AddressDomain
sim642 Apr 26, 2024
a9e19b0
Fix two AD.type_of crashes in base
sim642 Apr 26, 2024
7cdfa74
Add @raise documentation to some functions
sim642 Apr 29, 2024
c59429e
Fix catch-all in GobConfig
sim642 Apr 29, 2024
f990912
Update catch-all TODO in Goblint_backtrace
sim642 Apr 29, 2024
1b9222e
Add GobExn.catch_all_filter
sim642 Apr 29, 2024
3f7e5e8
Use 1s interval for timeout timer for robustness
sim642 Apr 29, 2024
a4b5c8d
Document GobExn
sim642 Apr 29, 2024
accdd77
addresDomain.ml: add catch to get pre-#1435 behavior
michael-schwarz May 5, 2024
86b5079
Turn on precise output in privPrecCompare
michael-schwarz May 10, 2024
d4a740f
Add refine to traces config
michael-schwarz May 10, 2024
5ed5c37
Add refine to traces-rel
michael-schwarz May 10, 2024
db6f477
Refine until fixpoint
michael-schwarz May 10, 2024
ac756f6
Undo enabling refinement
michael-schwarz May 10, 2024
9e894bb
`force_refine` on dumps
michael-schwarz May 10, 2024
36748bd
Allow more cases in bot comparison
michael-schwarz May 10, 2024
ebf5ffb
Even more cases
michael-schwarz May 10, 2024
8bcbd2b
Limit `Blob(\Bot) \leq \Bot` to malloced blobs
michael-schwarz May 12, 2024
f48348e
message for top
michael-schwarz May 12, 2024
08cc1a5
topsify locations where unknown pointers are accessed
michael-schwarz May 12, 2024
7a7f11c
Output stats about topsification
michael-schwarz May 12, 2024
f6cf60e
Add disregard table
michael-schwarz May 12, 2024
c923a89
CReduce script to debug privatization precision differences
michael-schwarz May 13, 2024
08e0ec2
Minimized example
michael-schwarz May 13, 2024
57cdd43
More
michael-schwarz May 13, 2024
44eb176
Add problematic examples for #1457
michael-schwarz May 13, 2024
d033d7d
`set`: For non-definite AD, join over **all** components not just `cpa`
michael-schwarz May 13, 2024
febcf09
Rm spurious file
michael-schwarz May 13, 2024
d2d01d2
Add example where write lack precision
michael-schwarz May 15, 2024
0389355
Rm unneeded argument
michael-schwarz May 15, 2024
2f66c57
Typo
michael-schwarz May 15, 2024
53f9a1a
Add `amenable_to_meet` and test for it
michael-schwarz May 15, 2024
a763a7f
Make comparison of pointers amenable to `meet` if they only differ in…
michael-schwarz May 15, 2024
911da17
Add example where write is less precise
michael-schwarz May 17, 2024
ae72bdd
Add union direct
michael-schwarz May 17, 2024
a0f6bcd
`meet` in `Union`: Do not raise uncomparable when one arg is Top
michael-schwarz May 17, 2024
63e5427
Experiment without disregard
michael-schwarz May 17, 2024
37e5784
Revert "Experiment without disregard"
michael-schwarz May 17, 2024
1d63b11
Add example where a difference due to widening can be observed
michael-schwarz May 17, 2024
b140ac2
Comment command
michael-schwarz May 17, 2024
755d87f
Rm 2.c
michael-schwarz May 19, 2024
8fae8ba
Update example
michael-schwarz May 19, 2024
1591132
Minimal widening effect example
michael-schwarz May 19, 2024
80c3ffe
Add example where widening makes a difference
michael-schwarz May 19, 2024
61d6289
Further simplify
michael-schwarz May 19, 2024
64bd88f
Explain intricacies
michael-schwarz May 19, 2024
6108c7b
Add problem
michael-schwarz May 22, 2024
9d166e2
Merge branch 'issue_1159' into michael-schwarz-dissertation
michael-schwarz May 22, 2024
d65a835
Add example for unsoundness due to escape
michael-schwarz May 23, 2024
6d0a4f8
Fix gloabl_init for escaped globals in cluster configuration
michael-schwarz May 23, 2024
df01b46
Add test 46-apron2/84-relation-extern (issue #1440)
sim642 May 6, 2024
8fcdb50
Fix relation analysis ignoring extern inits (issue #1440)
sim642 May 6, 2024
6065687
Add test
michael-schwarz May 24, 2024
b9bdbed
Disable `exp.hide-std-globals`
michael-schwarz May 24, 2024
5465878
Fix `mutex-meet` for malloc after thread creation
michael-schwarz May 27, 2024
e1f7a1b
Also fix atomic
michael-schwarz May 27, 2024
db093cb
Switch to Mval-based must locksets
sim642 Apr 23, 2024
f0be59f
Remove unused LockDomain.MayLocks
sim642 Apr 23, 2024
dc21ca0
Remove unused set parts of LockDomain.Lockset
sim642 Apr 23, 2024
8888069
Remove LockDomain.Lockset
sim642 Apr 23, 2024
c01bb0d
Rename LockDomain.MLockset -> Lockset
sim642 Apr 23, 2024
04ee6ee
Extract LockDomain.MakeLockRW
sim642 Apr 23, 2024
afcd253
Clean up mutex analysis add and remove
sim642 Apr 23, 2024
7b914c5
Use Mval for mutex analysis multiplicity
sim642 Apr 23, 2024
6307cc1
Use Mval for mutex analysis protecting
sim642 Apr 23, 2024
4d27ca3
Use Mval for mutex analysis protected
sim642 Apr 23, 2024
1dedf97
Add Mval.Z with definite indices
sim642 Apr 23, 2024
acc182e
Extract mem_rw and remove_rw to LockDomain.Lockset
sim642 Apr 23, 2024
b68e969
Use Mval.Z for must locksets
sim642 Apr 24, 2024
d9d1326
Add test for unsound recursive mutex handling due to non-definite index
sim642 Apr 24, 2024
659f3b0
Fix unsound recursive mutex handling due to non-definite index
sim642 Apr 24, 2024
d1444f2
Add second test for unsound recursive mutex handling due to non-defin…
sim642 Apr 24, 2024
0331145
Fix second unsound recursive mutex handling due to non-definite index
sim642 Apr 24, 2024
bdd8c37
Fix LockDomain indentation
sim642 Apr 24, 2024
c3bb20f
Move Multiplicity to LockDomain
sim642 Apr 24, 2024
6df19ce
Rename LockDomain.Mval -> MustLock
sim642 Apr 24, 2024
3acb191
Rename LockDomain.Lockset -> MustLocksetRW
sim642 Apr 24, 2024
3d4a91d
Extract LockDomain.MustLockRW
sim642 Apr 24, 2024
3a8d939
Rename LockDomain.Multiplicity -> MustMultiplicity
sim642 Apr 24, 2024
18eedd4
Rename LockDomain.Simple -> MustLockset
sim642 Apr 24, 2024
e3bc139
Remove unused LockDomain.Priorities
sim642 Apr 24, 2024
538c394
Add all and is_all to must locksets
sim642 Apr 24, 2024
250be96
Use MustLockset.disjoint in mutex analysis
sim642 Apr 24, 2024
0624c7f
Remove Offset.Index.Printable.top
sim642 Apr 24, 2024
36aa2f0
Extract Printable.Z
sim642 Apr 24, 2024
470b431
Add Offset.Poly.map_indices
sim642 Apr 24, 2024
45d47a4
Clean up module aliases in LockDomain
sim642 Apr 24, 2024
c7b54b7
Rename LockDomain.Lock -> AddrRW
sim642 Apr 24, 2024
8aabfa6
Remove LockDomain.Mutexes
sim642 Apr 24, 2024
449dc64
Rename LockDomain.MustLocksetRW functions
sim642 Apr 24, 2024
b1eda02
Add LockDomain.MustLock.semantic_equal_mval
sim642 Apr 24, 2024
c712fcf
Update some variable names in mutex analysis
sim642 Apr 24, 2024
91e31d7
Use mem for MustBeProtectedBy query
sim642 Apr 24, 2024
ac16e02
Move LockDomain.Symbolic to SymbLocksDomain
sim642 Apr 19, 2024
3fbbfa2
Use LockDomain.MustLockset for MustLockset query
sim642 Apr 24, 2024
edf476a
Use LockDomain.MustLock for MustProtectedVars query
sim642 Apr 24, 2024
3a92918
Fix MustBeProtectedBy TODO
sim642 Apr 24, 2024
f533707
Restore NULL mutex unlock warning
sim642 Apr 25, 2024
68d431a
Add NULL mutex lock warning
sim642 Apr 25, 2024
bb5011b
Update mutex analysis may-be-recursive unlock TODO
sim642 May 27, 2024
7373da7
GobZ: derive `eq`, `ord`, `hash`
michael-schwarz Jun 10, 2024
b84f77b
Add unsound test for unlocking non-definite mutex in privatizations
sim642 Jun 4, 2024
8d4abd8
Fix base privatization unsoundness with non-definite mutex unlock
sim642 Jun 4, 2024
11a6705
Add unsound test for unlocking non-definite mutex in relational priva…
sim642 Jun 4, 2024
b9a2268
Port base privatization non-definite mutex unlock unsoundness fix to …
sim642 Jun 4, 2024
6c69bf8
Extract CommonPriv.lift_lock and lift_unlock
sim642 Jun 4, 2024
06a585a
Refactor CommonPriv.lift_lock and lift_unlock
sim642 Jun 4, 2024
12e5551
Add unsound test for unlocking unknown mutex in privatizations
sim642 Jun 4, 2024
ad233e1
Fix privatization unlocking unknown mutex unsoundness
sim642 Jun 4, 2024
c06af68
Add SKIP to Apron tests (PR #1500)
sim642 Jun 6, 2024
44d7abb
Add enabled_if to Apron cram tests (PR #1500)
sim642 Jun 6, 2024
a21a2d4
Rename tests
michael-schwarz Jun 10, 2024
48cd365
Add Apron mutex-meet abortUnless non-termination test case (PR #1464)
sim642 May 20, 2024
7c22d48
Make relational mutex-meet join sync more precise when threadflag is …
sim642 May 20, 2024
b78173c
Use branched thread creation check for other privatizations
sim642 May 20, 2024
98ff8f6
Remove ConfCheck.no_branched_thread_creation
sim642 May 21, 2024
eb73537
Simplify and document ConfCheck.branched_thread_creation
sim642 May 21, 2024
da31d5c
Introduce sync reason "SyncJoin"
michael-schwarz Jun 12, 2024
2c92cee
Employ same invalidation as for base
michael-schwarz Jun 25, 2024
76c27bf
Hotfix
michael-schwarz Jun 27, 2024
547491b
Undo svcomp stuff leaking into otherwise reasonable things
michael-schwarz Jul 2, 2024
837837c
Use same invalidation strategy as base (References #1535)
michael-schwarz Jul 6, 2024
73e336e
Consider all globals in scope (workaround for #1538)
michael-schwarz Jul 7, 2024
f8da59e
traces-rel.json: Limit YAML entry type to location_invariant
michael-schwarz Jul 8, 2024
1a4d6d1
Skip check for speedup
michael-schwarz Jul 9, 2024
a1817de
Non verbose
michael-schwarz Jul 9, 2024
970a999
Revert "Non verbose"
michael-schwarz Jul 9, 2024
3a30b0c
Cehck overflows when generating witnesses
michael-schwarz Jul 12, 2024
c35fd86
Mark TODO completed
michael-schwarz Jul 12, 2024
3eb8017
Add witness cram test
michael-schwarz Jul 16, 2024
13ee48a
Fix `read_global`
michael-schwarz Jul 16, 2024
5c0338b
Spurious tracing
michael-schwarz Jul 16, 2024
f1bd3dd
Fix tracing
michael-schwarz Jul 16, 2024
2fcb551
Update cram test
michael-schwarz Jul 16, 2024
5fe42bd
Apron: Do not produce invariants about stale locals that have escaped
michael-schwarz Jul 24, 2024
0639c74
Merge pull request #1545 from goblint/witness_val_fail
michael-schwarz Jul 24, 2024
88d9a3b
46/96: Use deterministic warn
michael-schwarz Jul 24, 2024
d9eea8a
Typo
michael-schwarz Aug 4, 2024
e493bca
Relation: Call `enter_mulithreaded` also for unknown threads
michael-schwarz Aug 4, 2024
88c88b6
Add test for #1511
michael-schwarz Aug 4, 2024
9ef0ab6
Clustered LMust
michael-schwarz Aug 6, 2024
1d0e9ad
Add regression test
michael-schwarz Aug 6, 2024
0d7ce37
Merge pull request #1555 from goblint/lmust-cluster
michael-schwarz Aug 6, 2024
3878a22
Make `update_offset` idempotent for blobs
michael-schwarz Aug 9, 2024
ccca4b2
Merge pull request #1559 from goblint/issue_1558
michael-schwarz Aug 9, 2024
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
2 changes: 1 addition & 1 deletion .github/workflows/locked.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
matrix:
os:
- ubuntu-latest
- macos-latest
- macos-13
ocaml-compiler:
- ocaml-variants.4.14.0+options,ocaml-option-flambda # matches opam lock file
# don't add any other because they won't be used
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/unlocked.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
matrix:
os:
- ubuntu-latest
- macos-latest
- macos-13
ocaml-compiler:
- 5.0.x
- ocaml-variants.4.14.0+options,ocaml-option-flambda
Expand Down Expand Up @@ -91,7 +91,7 @@ jobs:
matrix:
os:
- ubuntu-latest
- macos-latest
- macos-13
ocaml-compiler:
- ocaml-variants.4.14.0+options,ocaml-option-flambda # matches opam lock file, downgrade deps step

Expand Down Expand Up @@ -189,7 +189,7 @@ jobs:
matrix:
os:
- ubuntu-latest
- macos-latest
- macos-13
ocaml-compiler:
- ocaml-variants.4.14.0+options,ocaml-option-flambda # matches opam lock file

Expand Down
6 changes: 5 additions & 1 deletion conf/traces-rel.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
"int": {
"def_exc": true,
"interval": false,
"enums": true
"enums": true,
"def_exc_widen_by_join": true
},
"malloc": {
"wrappers": [
Expand Down Expand Up @@ -79,6 +80,9 @@
"other": false,
"loop-head": false,
"after-lock": true
},
"yaml" : {
"entry-types": ["location_invariant"]
}
},
"pre": {
Expand Down
22 changes: 20 additions & 2 deletions conf/traces.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
"int": {
"def_exc": true,
"interval": false,
"enums": true
"enums": true,
"def_exc_widen_by_join": true
},
"malloc": {
"wrappers": [
Expand All @@ -24,6 +25,14 @@
"ldv_xzalloc",
"ldv_calloc"
]
},
"base" : {
"invariant": {
"enabled": false
},
"eval": {
"deep-query": false
}
}
},
"sem": {
Expand All @@ -35,9 +44,18 @@
},
"builtin_unreachable": {
"dead_code": true
},
"int": {
"signed_overflow": "assume_none"
}
},
"exp": {
"priv-distr-init": false
"priv-distr-init": false,
"priv-prec-dump-proj" : true
},
"solvers" : {
"td3": {
"side_widen" : "sides-pp"
}
}
}
30 changes: 30 additions & 0 deletions example_widening_effects.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#include <pthread.h>
int occupied;

pthread_mutex_t mtx;


void* thread(void* arg) {
pthread_mutex_lock(&mtx);

if(occupied < 2) {
occupied++;
}

pthread_mutex_unlock(&mtx);
}

int main() {
pthread_t worker;

pthread_create(&worker, 0, &thread, 0);

pthread_mutex_lock(&mtx);
occupied = 0;
pthread_mutex_unlock(&mtx);

return 0;
}


// rm out.txt && ./goblint --conf conf/traces.json --set ana.base.privatization protection 2.c --enable allglobs --enable dbg.timing.enabled --enable warn.debug -v --sets exp.priv-prec-dump level-ip.protection.prec --enable ana.int.interval && ./goblint --conf conf/traces.json --set ana.base.privatization write 2.c --enable allglobs --enable dbg.timing.enabled --enable warn.debug -v --sets exp.priv-prec-dump level-ip.write.prec --enable ana.int.interval && ./privPrecCompare level-ip.protection.prec level-ip.write.prec &> out.txt
23 changes: 23 additions & 0 deletions reduce_difference.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/bin/bash
grep "void (\*argmatch_die)(void) = & __argmatch_die;" reduce.c
if [ $? -eq 1 ]; then
exit 17
fi
grep "static void __argmatch_die(void)" reduce.c
if [ $? -eq 1 ]; then
exit 17
fi
grep "usage(1)" reduce.c
if [ $? -eq 1 ]; then
exit 17
fi


/home/michael/Documents/goblint-cil/analyzer/goblint-2 --conf /home/michael/Documents/goblint-cil/analyzer/conf/traces.json --set dbg.timeout 900 --set ana.base.privatization protection 1.c --enable allglobs --enable dbg.timing.enabled --enable warn.debug -v --sets exp.priv-prec-dump level-ip.protection.prec
/home/michael/Documents/goblint-cil/analyzer/goblint-2 --conf /home/michael/Documents/goblint-cil/analyzer/conf/traces.json --set dbg.timeout 900 --set ana.base.privatization write 1.c --enable allglobs --enable dbg.timing.enabled --enable warn.debug -v --sets exp.priv-prec-dump level-ip.write.prec
/home/michael/Documents/goblint-cil/analyzer/privPrecCompare level-ip.protection.prec level-ip.write.prec 2> details.txt 1> res.txt
if [ $? -eq 0 ]; then
grep "protection more precise than write" res.txt >/dev/null 2>&1
else
exit 5
fi
138 changes: 72 additions & 66 deletions src/analyses/apron/relationAnalysis.apron.ml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ struct
Priv.read_global ask getg st g x
else (
let rel = st.rel in
let g_var = RV.global g in
(* If it has escaped and we have never been multi-threaded, we can still refer to the local *)
let g_var = if g.vglob then RV.global g else RV.local g in
let x_var = RV.local x in
let rel' = RD.add_vars rel [g_var] in
let rel' = RD.assign_var rel' x_var g_var in
Expand Down Expand Up @@ -245,25 +246,21 @@ struct
(* Basic transfer functions. *)
let assign ctx (lv:lval) e =
let st = ctx.local in
if !AnalysisState.global_initialization && e = MyCFG.unknown_exp then
st (* ignore extern inits because there's no body before assign, so env is empty... *)
else (
let simplified_e = replace_deref_exps ctx.ask e in
if M.tracing then M.traceli "relation" "assign %a = %a (simplified to %a)" d_lval lv d_exp e d_exp simplified_e;
let ask = Analyses.ask_of_ctx ctx in
let r = assign_to_global_wrapper ask ctx.global ctx.sideg st lv (fun st v ->
assign_from_globals_wrapper ask ctx.global st simplified_e (fun apr' e' ->
if M.tracing then M.traceli "relation" "assign inner %a = %a (%a)" CilType.Varinfo.pretty v d_exp e' d_plainexp e';
if M.tracing then M.trace "relation" "st: %a" RD.pretty apr';
let r = RD.assign_exp ask apr' (RV.local v) e' (no_overflow ask simplified_e) in
if M.tracing then M.traceu "relation" "-> %a" RD.pretty r;
r
)
)
in
if M.tracing then M.traceu "relation" "-> %a" D.pretty r;
r
)
let simplified_e = replace_deref_exps ctx.ask e in
if M.tracing then M.traceli "relation" "assign %a = %a (simplified to %a)" d_lval lv d_exp e d_exp simplified_e;
let ask = Analyses.ask_of_ctx ctx in
let r = assign_to_global_wrapper ask ctx.global ctx.sideg st lv (fun st v ->
assign_from_globals_wrapper ask ctx.global st simplified_e (fun apr' e' ->
if M.tracing then M.traceli "relation" "assign inner %a = %a (%a)" CilType.Varinfo.pretty v d_exp e' d_plainexp e';
if M.tracing then M.trace "relation" "st: %a" RD.pretty apr';
let r = RD.assign_exp ask apr' (RV.local v) e' (no_overflow ask simplified_e) in
if M.tracing then M.traceu "relation" "-> %a" RD.pretty r;
r
)
)
in
if M.tracing then M.traceu "relation" "-> %a" D.pretty r;
r

let branch ctx e b =
let st = ctx.local in
Expand Down Expand Up @@ -469,10 +466,9 @@ struct
| None -> None
| Some st ->
let ad = ask.f (Queries.ReachableFrom e) in
if Queries.AD.is_top ad then
None
else
Some (Queries.AD.join ad st)
(* See https://github.com/goblint/analyzer/issues/1535 *)
let ad = Queries.AD.remove UnknownPtr ad in
Some (Queries.AD.join ad st)
in
List.fold_right reachable es (Some (Queries.AD.empty ()))

Expand Down Expand Up @@ -513,6 +509,35 @@ struct
if RD.is_bot_env res then raise Deadcode;
{st with rel = res}

let special_unknown_invalidate ctx f args =
(* No warning here, base already produces the appropriate warnings *)
let desc = LibraryFunctions.find f 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 deep_addrs =
if List.mem LibraryDesc.InvalidateGlobals desc.attrs then (
foldGlobals !Cilfacade.current_file (fun acc global ->
match global with
| GVar (vi, _, _) when not (BaseUtil.is_static vi) ->
mkAddrOf (Var vi, NoOffset) :: acc
(* TODO: what about GVarDecl? *)
| _ -> acc
) deep_addrs
)
else
deep_addrs
in
let lvallist e =
match ctx.ask (Queries.MayPointTo e) with
| ad when Queries.AD.is_top ad -> []
| ad ->
Queries.AD.to_mval ad
|> List.map ValueDomain.Addr.Mval.to_cil
in
let st' = forget_reachable ctx ctx.local deep_addrs in
let shallow_lvals = List.concat_map lvallist shallow_addrs in
List.fold_left (invalidate_one (Analyses.ask_of_ctx ctx) ctx) st' shallow_lvals

let special ctx r f args =
let ask = Analyses.ask_of_ctx ctx in
let st = ctx.local in
Expand Down Expand Up @@ -548,31 +573,7 @@ struct
assert_fn {ctx with local = st} (BinOp (Ge, Lval lv, zero, intType)) true
| None -> st)
| _, _ ->
let lvallist e =
match ask.f (Queries.MayPointTo e) with
| ad when Queries.AD.is_top ad -> []
| ad ->
Queries.AD.to_mval ad
|> List.map ValueDomain.Addr.Mval.to_cil
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 deep_addrs =
if List.mem LibraryDesc.InvalidateGlobals desc.attrs then (
foldGlobals !Cilfacade.current_file (fun acc global ->
match global with
| GVar (vi, _, _) when not (BaseUtil.is_static vi) ->
mkAddrOf (Var vi, NoOffset) :: acc
(* TODO: what about GVarDecl? *)
| _ -> acc
) deep_addrs
)
else
deep_addrs
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
let st' = special_unknown_invalidate ctx f args in
(* invalidate lval if present *)
match r with
| Some lv -> invalidate_one ask ctx st' lv
Expand Down Expand Up @@ -602,6 +603,10 @@ struct
| Some (Local v) ->
if VH.mem v_ins_inv v then
keep_global
else if ThreadEscape.has_escaped ask v then
(* Escaped local variables should be read in via their v#in# variables, this apron var may refer to stale values only *)
(* and is not a sound description of the C variable. *)
false
else
keep_local
| _ -> false
Expand Down Expand Up @@ -662,35 +667,36 @@ struct

let threadenter ctx ~multiple lval f args =
let st = ctx.local in
(* TODO: HACK: Simulate enter_multithreaded for first entering thread to publish global inits before analyzing thread.
Otherwise thread is analyzed with no global inits, reading globals gives bot, which turns into top, which might get published...
sync `Thread doesn't help us here, it's not specific to entering multithreaded mode.
EnterMultithreaded events only execute after threadenter and threadspawn. *)
if not (ThreadFlag.has_ever_been_multi (Analyses.ask_of_ctx ctx)) then
ignore (Priv.enter_multithreaded (Analyses.ask_of_ctx ctx) ctx.global ctx.sideg st);
match Cilfacade.find_varinfo_fundec f with
| fd ->
(* TODO: HACK: Simulate enter_multithreaded for first entering thread to publish global inits before analyzing thread.
Otherwise thread is analyzed with no global inits, reading globals gives bot, which turns into top, which might get published...
sync `Thread doesn't help us here, it's not specific to entering multithreaded mode.
EnterMultithreaded events only execute after threadenter and threadspawn. *)
if not (ThreadFlag.has_ever_been_multi (Analyses.ask_of_ctx ctx)) then
ignore (Priv.enter_multithreaded (Analyses.ask_of_ctx ctx) ctx.global ctx.sideg st);
let st' = Priv.threadenter (Analyses.ask_of_ctx ctx) ctx.global st in
let new_rel = make_callee_rel ~thread:true ctx fd args in
[{st' with rel = new_rel}]
| exception Not_found ->
(* Unknown functions *)
(* TODO: do something like base? *)
failwith "relation.threadenter: unknown function"
[special_unknown_invalidate ctx f args]

let threadspawn ctx ~multiple lval f args fctx =
ctx.local

let event ctx e octx =
let ask = Analyses.ask_of_ctx ctx in
let st = ctx.local in
match e with
| Events.Lock (addr, _) when ThreadFlag.has_ever_been_multi (Analyses.ask_of_ctx ctx) -> (* TODO: is this condition sound? *)
Priv.lock (Analyses.ask_of_ctx ctx) ctx.global st addr
| Events.Unlock addr when ThreadFlag.has_ever_been_multi (Analyses.ask_of_ctx ctx) -> (* TODO: is this condition sound? *)
if addr = UnknownPtr then
M.info ~category:Unsound "Unknown mutex unlocked, relation privatization unsound"; (* TODO: something more sound *)
| Events.Lock (addr, _) when ThreadFlag.has_ever_been_multi ask -> (* TODO: is this condition sound? *)
CommonPriv.lift_lock ask (fun st m ->
Priv.lock ask ctx.global st m
) st addr
| Events.Unlock addr when ThreadFlag.has_ever_been_multi ask -> (* TODO: is this condition sound? *)
WideningTokens.with_local_side_tokens (fun () ->
Priv.unlock (Analyses.ask_of_ctx ctx) ctx.global ctx.sideg st addr
CommonPriv.lift_unlock ask (fun st m ->
Priv.unlock ask ctx.global ctx.sideg st m
) st addr
)
| Events.EnterMultiThreaded ->
Priv.enter_multithreaded (Analyses.ask_of_ctx ctx) ctx.global ctx.sideg st
Expand Down Expand Up @@ -769,7 +775,7 @@ struct
PCU.RH.replace results ctx.node new_value;
end;
WideningTokens.with_local_side_tokens (fun () ->
Priv.sync (Analyses.ask_of_ctx ctx) ctx.global ctx.sideg ctx.local (reason :> [`Normal | `Join | `Return | `Init | `Thread])
Priv.sync (Analyses.ask_of_ctx ctx) ctx.global ctx.sideg ctx.local (reason :> [`Normal | `Join | `JoinCall | `Return | `Init | `Thread])
)

let init marshal =
Expand All @@ -778,7 +784,7 @@ struct
let store_data file =
let results = PCU.RH.map (fun _ v -> RD.marshal v) results in
let name = RD.name () ^ "(domain: " ^ (RD.name ()) ^ ", privatization: " ^ (Priv.name ()) ^ (if GobConfig.get_bool "ana.apron.threshold_widening" then ", th" else "" ) ^ ")" in
let results: PCU.dump = {marshalled = results; name } in
let results: PCU.dump = {marshalled = results; name; disregard = None } in
Serialize.marshal results file

let finalize () =
Expand Down
Loading