@@ -108,6 +108,30 @@ object (self)
108108 - memlval_vinv_memref_basevar_implies_safe
109109 *)
110110
111+ method private postcondition_implies_safe
112+ (invindex : int )
113+ (callee : varinfo )
114+ (pcs : annotated_xpredicate_t list ) =
115+ let mname = " postcondition_implies_safe" in
116+ match pcs with
117+ | [] -> None
118+ | _ ->
119+ List. fold_left (fun facc (pc , _ ) ->
120+ match facc with
121+ | Some _ -> facc
122+ | _ ->
123+ match pc with
124+ | XInitialized (ArgAddressedValue (ReturnValue, ArgNoOffset)) ->
125+ let deps =
126+ DEnvC ([invindex], [PostAssumption (callee.vid, pc)]) in
127+ let msg =
128+ " value addressed by return value from "
129+ ^ callee.vname
130+ ^ " is initialized" in
131+ let site = Some (__FILE__, __LINE__, mname) in
132+ Some (deps, msg, site)
133+ | _ -> None ) None pcs
134+
111135 method private inv_implies_safe (inv : invariant_int ) =
112136 let mname = " inv_implies_safe" in
113137 match inv#get_fact with
@@ -125,7 +149,56 @@ object (self)
125149 let site = Some (__FILE__, __LINE__, mname) in
126150 Some (deps, msg, site)
127151 end
128- | _ -> None
152+ | _ ->
153+ match inv#expr with
154+ | Some (XVar v ) when poq#env#is_initial_value v ->
155+ let var = poq#env#get_initial_value_variable v in
156+ if poq#env#is_memory_variable var then
157+ let (memref, offset) = poq#env#get_memory_variable var in
158+ if is_zero_memory_offset offset then
159+ if memref#has_external_base then
160+ let basevar = memref#get_external_basevar in
161+ if poq#env#is_function_return_value basevar then
162+ let callee = poq#env#get_callvar_callee basevar in
163+ let (pcs, epcs) = poq#get_postconditions basevar in
164+ let r =
165+ match epcs with
166+ | [] ->
167+ self#postcondition_implies_safe inv#index callee pcs
168+ | _ -> None in
169+ match r with
170+ | None ->
171+ let pcr =
172+ XInitialized
173+ (ArgAddressedValue (ReturnValue , ArgNoOffset )) in
174+ begin
175+ poq#mk_postcondition_request pcr callee;
176+ poq#set_diagnostic
177+ (" Unable to determine if memory pointed at by the return "
178+ ^ " value from "
179+ ^ callee.vname
180+ ^ " is initialized." );
181+ None
182+ end
183+ | Some _ -> r
184+ else
185+ begin
186+ poq#set_diagnostic_arg
187+ 1 (" memvar:base: " ^ (p2s memref#toPretty));
188+ None
189+ end
190+ else
191+ None
192+ else
193+ begin
194+ poq#set_diagnostic_arg
195+ 1 (" initial-value: " ^ (p2s v#toPretty));
196+ None
197+ end
198+ else
199+ None
200+ | _ ->
201+ None
129202
130203 method private check_safe_functionpointer (vinfo : varinfo ) =
131204 let vinfovalues = poq#get_vinfo_offset_values vinfo in
0 commit comments