@@ -117,8 +117,7 @@ struct
117117 end
118118 | _ -> Queries.Result. top q
119119
120- let escape_rval ctx (rval :exp ) =
121- let ask = Analyses. ask_of_ctx ctx in
120+ let escape_rval ctx ask (rval :exp ) =
122121 let escaped = reachable ask rval in
123122 let escaped = D. filter (fun v -> not v.vglob) escaped in
124123
@@ -133,17 +132,26 @@ struct
133132 let ask = Analyses. ask_of_ctx ctx in
134133 let vs = mpt ask (AddrOf lval) in
135134 if D. exists (fun v -> v.vglob || has_escaped ask v) vs then (
136- let escaped = escape_rval ctx rval in
135+ let escaped = escape_rval ctx ask rval in
137136 D. join ctx.local escaped
138137 ) else begin
139138 ctx.local
140139 end
141140
141+ let combine_assign ctx (lval :lval option ) (fexp :exp ) f args fc au f_ask : D.t =
142+ let ask = Analyses. ask_of_ctx ctx in
143+ match lval with
144+ | Some lval when D. exists (fun v -> v.vglob || has_escaped ask v) (mpt ask (AddrOf lval)) ->
145+ let rval = Lval (ReturnUtil. return_lval () ) in
146+ let escaped = escape_rval ctx f_ask rval in (* Using f_ask because the return value is only accessible in the context of that function at this point *)
147+ D. join ctx.local escaped
148+ | _ -> ctx.local
149+
142150 let special ctx (lval : lval option ) (f :varinfo ) (args :exp list ) : D.t =
143151 let desc = LibraryFunctions. find f in
144152 match desc.special args, f.vname, args with
145153 | _ , "pthread_setspecific" , [key; pt_value] ->
146- let escaped = escape_rval ctx pt_value in
154+ let escaped = escape_rval ctx ( Analyses. ask_of_ctx ctx) pt_value in
147155 D. join ctx.local escaped
148156 | _ -> ctx.local
149157
0 commit comments