@@ -153,6 +153,8 @@ object (self)
153153 (* ----------------------------- safe ------------------------------------- *)
154154 (* check_safe
155155 - inv_implies_safe
156+ - inv_xpr_implies_safe
157+ - inv_bounded_xpr_implies_safe
156158 - check_safe_command_line_argument
157159 - check_safe_lval
158160 - check_safe_memlval
@@ -162,6 +164,29 @@ object (self)
162164 - memlval_vinv_memref_basevar_implies_safe
163165 *)
164166
167+ method private inv_xpr_implies_safe (invindex : int ) (x : xpr_t ) =
168+ let deps = DLocal [invindex] in
169+ let msg =
170+ " variable "
171+ ^ (p2s (lval_to_pretty lval))
172+ ^ " has the value "
173+ ^ (x2s x) in
174+ let site = Some (__FILE__, __LINE__, " inv_xpr_implies_safe" ) in
175+ Some (deps, msg, site)
176+
177+ method private inv_bounded_xpr_implies_safe
178+ (invindex : int ) (lb : xpr_t ) (ub : xpr_t ) =
179+ let deps = DLocal [invindex] in
180+ let msg =
181+ " variable "
182+ ^ (p2s (lval_to_pretty lval))
183+ ^ " is bounded by LB: "
184+ ^ (x2s lb)
185+ ^ " and UB: "
186+ ^ (x2s ub) in
187+ let site = Some (__FILE__, __LINE__, " inv_bounded_xpr_implies_safe" ) in
188+ Some (deps, msg, site)
189+
165190 method private inv_implies_safe (inv : invariant_int ) =
166191 let mname = " inv_implies_safe" in
167192 match inv#get_fact with
@@ -177,9 +202,16 @@ object (self)
177202 (String. concat
178203 " _xx_" (List. map self#get_symbol_name localAssigns)) in
179204 let site = Some (__FILE__, __LINE__, mname) in
180- Some (deps,msg, site)
205+ Some (deps, msg, site)
181206 end
182- | _ -> None
207+ | _ ->
208+ match inv#expr with
209+ | Some x -> self#inv_xpr_implies_safe inv#index x
210+ | _ ->
211+ match (inv#lower_bound_xpr, inv#upper_bound_xpr) with
212+ | (Some lb , Some ub ) ->
213+ self#inv_bounded_xpr_implies_safe inv#index lb ub
214+ | _ -> None
183215
184216 method private check_safe_functionpointer (vinfo : varinfo ) =
185217 let vinfovalues = poq#get_vinfo_offset_values vinfo in
@@ -231,6 +263,37 @@ object (self)
231263 false
232264 end ) false vinfovalues
233265
266+ method private memlval_vinv_memref_stackvar_implies_safe
267+ (invindex : int ) (vinfo : varinfo ) =
268+ let mname = " memlval_vinv_memref_stackvar_implies_safe" in
269+ let vinfovalues = poq#get_vinfo_offset_values vinfo in
270+ List. fold_left (fun acc (vinv , voffset ) ->
271+ match acc with
272+ | Some _ -> acc
273+ | _ ->
274+ match vinv#get_fact, voffset with
275+ | NonRelationalFact (_ , FInitializedSet l ), NoOffset ->
276+ (match l with
277+ | [] -> None
278+ | _ ->
279+ let deps = DLocal [invindex; vinv#index] in
280+ let msg =
281+ " local assignment(s) to "
282+ ^ vinfo.vname
283+ ^ " : "
284+ ^ (String. concat
285+ " _xx_" (List. map self#get_symbol_name l)) in
286+ let site = Some (__FILE__, __LINE__, mname) in
287+ Some (deps, msg, site))
288+ | _ ->
289+ begin
290+ poq#set_diagnostic
291+ ~site: (Some (__FILE__, __LINE__, mname))
292+ (" [" ^ vinfo.vname ^ " ]: " ^ (p2s vinv#toPretty));
293+ None
294+ end
295+ ) None vinfovalues
296+
234297 method private memlval_vinv_memref_basevar_implies_safe
235298 (invindex : int ) (v : variable_t ) (memoffset : offset ) =
236299 let mname = " memlval_vinv_memref_basevar_implies_safe" in
@@ -366,8 +429,13 @@ object (self)
366429 1
367430 (" stack variable: "
368431 ^ vinfo.vname
432+ ^ " with offset "
369433 ^ (p2s (offset_to_pretty voffset))) in
370- None
434+ (match (voffset, memoffset) with
435+ | (NoOffset, NoOffset) ->
436+ self#memlval_vinv_memref_stackvar_implies_safe invindex vinfo
437+ | _ -> None )
438+
371439 | CBaseVar v ->
372440 (try
373441 self#memlval_vinv_memref_basevar_implies_safe invindex v memoffset
@@ -458,7 +526,7 @@ object (self)
458526 let _ =
459527 poq#set_diagnostic
460528 ~site: (Some (__FILE__, __LINE__, mname))
461- (" [offset]: " ^ (p2s (offset_to_pretty memoffset))) in
529+ (" [mem- offset]: " ^ (p2s (offset_to_pretty memoffset))) in
462530 List. fold_left (fun acc (inv , offset ) ->
463531 acc ||
464532 match offset with
@@ -566,7 +634,7 @@ object (self)
566634 (* ----------------------- delegation ------------------------------------- *)
567635 (* check_delegation
568636 - check_delegation_lval
569- - memlval_implies_delegation
637+ - check_delegation_memlval
570638 - memlval_vinv_implies_delegation
571639 - memlval_var_implies_delegation
572640
@@ -587,11 +655,11 @@ object (self)
587655 | Lval apilval ->
588656 let pred = PInitialized apilval in
589657 let deps = DEnvC ([invindex], [ApiAssumption pred]) in
590- let site = Some (__FILE__, __LINE__, mname) in
591658 let msg =
592659 " condition "
593660 ^ (p2s (po_predicate_to_pretty pred))
594661 ^ " delegated to the api" in
662+ let site = Some (__FILE__, __LINE__, mname) in
595663 Some (deps, msg, site)
596664 | _ -> None
597665 else
@@ -677,11 +745,11 @@ object (self)
677745 let memlval = (Mem (Lval lval),memoffset) in
678746 let pred = PInitialized memlval in
679747 let deps = DEnvC ([inv#index], [ApiAssumption pred]) in
680- let site = Some (__FILE__, __LINE__, mname) in
681748 let msg =
682749 " condition "
683750 ^ (p2s (po_predicate_to_pretty pred))
684751 ^ " delegated to the api (vinv)" in
752+ let site = Some (__FILE__, __LINE__, mname) in
685753 Some (deps, msg, site)
686754 else
687755 self#memlval_var_implies_delegation inv#index lval memoffset
@@ -694,7 +762,7 @@ object (self)
694762 end
695763 | _ -> None
696764
697- method private memlval_implies_delegation (memlval: lval ) (memoffset: offset ) =
765+ method private check_delegation_memlval (memlval: lval ) (memoffset: offset ) =
698766 match memlval with
699767 | (Var (_vname , vid ), NoOffset) when vid > 0 ->
700768 let vinfo = poq#env#get_varinfo vid in
@@ -719,7 +787,7 @@ object (self)
719787 method private check_delegation_lval =
720788 match lval with
721789 | (Mem (Lval memlval ), memoffset ) ->
722- self#memlval_implies_delegation memlval memoffset
790+ self#check_delegation_memlval memlval memoffset
723791 | (Mem
724792 (BinOp
725793 (_,
746814
747815
748816let check_initialized (poq :po_query_int ) (lval :lval ) =
749- let invs = poq#get_invariants 1 in
817+ let f_priority (inv : invariant_int ) =
818+ match inv#get_fact with
819+ | NonRelationalFact (_ , FInitializedSet _ ) -> true
820+ | _ -> false in
821+ let invs =
822+ CCHInvariantFact. prioritize_invariants f_priority (poq#get_invariants 1 ) in
750823 let _ = poq#set_diagnostic_invariants 1 in
751824 let checker = new initialized_checker_t poq lval invs in
752825 checker#check_safe || checker#check_violation || checker#check_delegation
0 commit comments