Skip to content

Commit 739ef9c

Browse files
escaping of locals
1 parent 577f1c0 commit 739ef9c

File tree

2 files changed

+11
-34
lines changed

2 files changed

+11
-34
lines changed

src/analyses/apron/apronPriv.apron.ml

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -533,21 +533,10 @@ struct
533533
{st with apr = apr_local}
534534

535535
let escape node ask getg sideg (st:apron_components_t) escaped : apron_components_t =
536-
let apr = st.apr in
537-
let esc_vars = List.filter (fun var -> match AV.find_metadata var with
538-
| Some (Global _) -> false
539-
| Some Local ->
540-
(let fundec = Node.find_fundec node in
541-
let r = AV.to_cil_varinfo fundec var in
542-
match r with
543-
| Some r -> EscapeDomain.EscapedVars.mem r escaped
544-
| _ -> false)
545-
| _ -> false
546-
) (AD.vars apr) in
547-
let apr_side = AD.keep_vars apr esc_vars in
548-
sideg V.mutex_inits apr_side;
549-
let apr_local = AD.remove_vars apr esc_vars in
550-
{ st with apr = apr_local }
536+
let esc_vars = EscapeDomain.EscapedVars.elements escaped in
537+
let esc_vars = List.filter (fun v -> not v.vglob && AD.varinfo_tracked v && AD.mem_var st.apr (AV.local v)) esc_vars in
538+
let escape_one (x:varinfo) st = write_global ask getg sideg st x x in
539+
List.fold_left (fun st v -> escape_one v st) st esc_vars
551540

552541
let threadenter ask getg (st: apron_components_t): apron_components_t =
553542
{apr = AD.bot (); priv = startstate ()}
@@ -1066,24 +1055,10 @@ struct
10661055
st
10671056

10681057
let escape node ask getg sideg (st: apron_components_t) escaped: apron_components_t =
1069-
let apr = st.apr in
1070-
let esc_vars = List.filter (fun var -> match AV.find_metadata var with
1071-
| Some (Global _) -> false
1072-
| Some Local ->
1073-
(let fundec = Node.find_fundec node in
1074-
let r = AV.to_cil_varinfo fundec var in
1075-
match r with
1076-
| Some r -> EscapeDomain.EscapedVars.mem r escaped
1077-
| _ -> false)
1078-
| _ -> false
1079-
) (AD.vars apr) in
1080-
let apr_side = AD.keep_vars apr esc_vars in
1081-
let apr_side = Cluster.unlock (W.top ()) apr_side in (* top W to avoid any filtering *)
1082-
let tid = ThreadId.get_current ask in
1083-
let sidev = GMutex.singleton tid apr_side in
1084-
sideg V.mutex_inits (G.create_mutex sidev);
1085-
let apr_local = AD.remove_vars apr esc_vars in
1086-
{ st with apr = apr_local }
1058+
let esc_vars = EscapeDomain.EscapedVars.elements escaped in
1059+
let esc_vars = List.filter (fun v -> not v.vglob && AD.varinfo_tracked v && AD.mem_var st.apr (AV.local v)) esc_vars in
1060+
let escape_one (x:varinfo) st = write_global ask getg sideg st x x in
1061+
List.fold_left (fun st v -> escape_one v st) st esc_vars
10871062

10881063
let enter_multithreaded (ask:Q.ask) getg sideg (st: apron_components_t): apron_components_t =
10891064
let apr = st.apr in

tests/regression/46-apron2/12-escape-local-in-pthread-simple.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <assert.h>
55
#include <stdio.h>
66
#include <unistd.h>
7-
7+
int g = 8;
88

99
void *foo(void* p){
1010
sleep(2);
@@ -22,6 +22,8 @@ int main(){
2222
sleep(4); // to make sure that we actually fail the assert when running.
2323
assert(x == 42); //UNKNOWN!
2424
assert(x == 0); //UNKNOWN!
25+
assert(x <= 50);
26+
assert(g == 8);
2527
pthread_join(thread, NULL);
2628
return 0;
2729
}

0 commit comments

Comments
 (0)