@@ -33,8 +33,10 @@ open XprTypes
3333
3434(* cchlib *)
3535open CCHBasicTypes
36+ open CCHTypesToPretty
3637
3738(* cchpre *)
39+ open CCHMemoryBase
3840open CCHPreTypes
3941
4042(* cchanalyze *)
@@ -67,11 +69,76 @@ object (self)
6769
6870 (* ------------------------------- safe ----------------------------------- *)
6971 (* check_safe
70- - check_invs_safe
72+ - check_safe_invs
7173 - inv_implies_safe
7274 - inv_xpr_implies_safe
75+ - check_safe_lval
76+ - check_safe_memlval
77+ - memlval_implies_safe
78+ -memlval_memref_implies_safe
7379 *)
7480
81+ method private memlval_memref_basevar_implies_safe
82+ (_invindex : int ) (basevar : variable_t ) =
83+ let mname = " memlval_memref_basevar_implies_safe" in
84+ begin
85+ poq#set_diagnostic
86+ ~site: (Some (__FILE__, __LINE__, mname))
87+ (" [memref-basevar]: " ^ (p2s basevar#toPretty));
88+ None
89+ end
90+
91+ method private memlval_memref_implies_safe
92+ (invindex : int ) (memref : memory_reference_int ) =
93+ let mname = " memlval_memref_implies_safe" in
94+ match memref#get_base with
95+ | CBaseVar bvar ->
96+ self#memlval_memref_basevar_implies_safe invindex bvar
97+ | _ ->
98+ begin
99+ poq#set_diagnostic
100+ ~site: (Some (__FILE__, __LINE__, mname))
101+ (" [memref-base]: "
102+ ^ (p2s (memory_base_to_pretty memref#get_base)));
103+ None
104+ end
105+
106+ method private memlval_implies_safe (inv : invariant_int ) (offset : offset ) =
107+ let mname = " memlval_implies_safe" in
108+ match inv#expr with
109+ | Some (XVar v ) when poq#env#is_memory_address v ->
110+ let (memref, _) = poq#env#get_memory_address v in
111+ self#memlval_memref_implies_safe inv#index memref
112+ | Some x ->
113+ begin
114+ poq#set_diagnostic
115+ ~site: (Some (__FILE__, __LINE__, mname)) (" [xpr]: " ^ (x2s x));
116+ None
117+ end
118+ | _ ->
119+ begin
120+ poq#set_diagnostic
121+ ~site: (Some (__FILE__, __LINE__, mname))
122+ (" [inv,offset]: "
123+ ^ (p2s inv#toPretty)
124+ ^ " , "
125+ ^ (p2s (offset_to_pretty offset)));
126+ None
127+ end
128+
129+ method private check_safe_lval =
130+ let vinfovalues = poq#get_vinfo_offset_values self#vinfo in
131+ List. fold_left (fun acc (inv , offset ) ->
132+ acc
133+ || (match self#memlval_implies_safe inv offset with
134+ | Some (deps , msg , site ) ->
135+ begin
136+ poq#record_safe_result ~site deps msg;
137+ true
138+ end
139+ | _ ->
140+ false )) false vinfovalues
141+
75142 method private inv_xpr_implies_safe (invindex : int ) (xpr : xpr_t ) =
76143 let mname = " inv_xpr_implies_safe" in
77144 let numv = poq#env#mk_program_var vinfo NoOffset NUM_VAR_TYPE in
@@ -133,7 +200,7 @@ object (self)
133200 None
134201 end
135202
136- method private check_invs_safe =
203+ method private check_safe_invs =
137204 match invs with
138205 | [] -> false
139206 | _ ->
@@ -147,6 +214,9 @@ object (self)
147214 end
148215 | _ -> false ) false invs
149216
217+ method check_safe =
218+ self#check_safe_invs || self#check_safe_lval
219+
150220 (* --------------------------- violation ---------------------------------- *)
151221 (* check_violation
152222 - inv_implies_violation
@@ -177,9 +247,6 @@ object (self)
177247 None
178248 end
179249
180- method check_safe =
181- self#check_invs_safe
182-
183250 method check_violation =
184251 List. fold_left (fun acc inv ->
185252 acc
0 commit comments