Skip to content

Commit 31c49f2

Browse files
committed
CHC: fix memory variable creation
1 parent 2355e80 commit 31c49f2

File tree

6 files changed

+82
-37
lines changed

6 files changed

+82
-37
lines changed

CodeHawk/CHC/cchanalyze/cCHAssignmentTranslator.ml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,26 @@ object (self)
8181
let assign =
8282
if chifVar#isTmp then
8383
let memoryvars = env#get_memory_variables in
84+
let _ =
85+
chlog#add
86+
"abstract memory variables"
87+
(LBLOCK [
88+
pretty_print_list
89+
memoryvars (fun v -> v#toPretty) "" ", " ""]) in
8490
CCMD (ABSTRACT_VARS memoryvars)
8591
else if env#has_constant_offset chifVar then
8692
make_c_cmd (ASSIGN_NUM (chifVar, numExp))
8793
else
8894
let memoryvars = env#get_memory_variables_with_base chifVar in
95+
let _ =
96+
chlog#add
97+
"abstract memory variables with base"
98+
(LBLOCK [
99+
STR "base: ";
100+
chifVar#toPretty;
101+
STR "; ";
102+
pretty_print_list
103+
memoryvars (fun v -> v#toPretty) "[" ", " "]"]) in
89104
CCMD (ABSTRACT_VARS memoryvars) in
90105
[rhsCode; assign]
91106
with

CodeHawk/CHC/cchanalyze/cCHEnvironment.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ object(self)
522522

523523
method get_memory_variables_with_base (v:variable_t) =
524524
let memvars = self#get_memory_variables in
525-
if self#is_memory_address v then
525+
if self#is_memory_address v || self#is_memory_variable v then
526526
let memref = self#get_memory_reference v in
527527
List.filter (fun mv ->
528528
memref#index = (self#get_memory_reference mv)#index) memvars

CodeHawk/CHC/cchanalyze/cCHExpTranslator.ml

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ open CHLanguage
3333
open CHNumerical
3434
open CHPretty
3535

36+
(* chutil *)
37+
open CHLogger
38+
3639
(* xprlib *)
3740
open Xprt
3841
open XprTypes
@@ -157,16 +160,16 @@ object (self)
157160
else
158161
env#mk_program_var vinfo eoffset NUM_VAR_TYPE
159162
| (Var _, _) -> env#mk_temp NUM_VAR_TYPE
160-
| (Mem e,offset) ->
163+
| (Mem e, offset) ->
161164
match self#translate_exp context e with
162165
| XVar v when env#is_memory_address v ->
163-
let (memref,moffset) = env#get_memory_address v in
166+
let (memref, moffset) = env#get_memory_address v in
164167
env#mk_memory_variable
165168
memref#index (add_offset moffset offset) NUM_VAR_TYPE
166169
| XVar v when env#is_initial_value v ->
167170
let memref =
168171
env#get_variable_manager#memrefmgr#mk_external_reference
169-
v (type_of_lval fdecls lval) in
172+
v (type_of_exp fdecls e) in
170173
env#mk_memory_variable memref#index offset NUM_VAR_TYPE
171174
| XVar _ -> env#mk_temp NUM_VAR_TYPE
172175
| _ -> env#mk_temp NUM_VAR_TYPE
@@ -193,7 +196,8 @@ object (self)
193196
begin
194197
match memxpr with
195198
| XVar v when env#is_initial_value v || env#is_function_return_value v ->
196-
let memref = vmgr#memrefmgr#mk_external_reference v ftype in
199+
let memtype = type_of_exp fdecls e in
200+
let memref = vmgr#memrefmgr#mk_external_reference v memtype in
197201
XVar (env#mk_memory_address_value memref#index offset)
198202
| XVar v when env#is_memory_address v ->
199203
let (memref, moffset) = env#get_memory_address v in
@@ -435,7 +439,8 @@ object (self)
435439
begin
436440
match memxpr with
437441
| XVar v when env#is_initial_value v || env#is_function_return_value v ->
438-
let memref = vmgr#memrefmgr#mk_external_reference v ftype in
442+
let memtype = type_of_exp fdecls e in
443+
let memref = vmgr#memrefmgr#mk_external_reference v memtype in
439444
XVar (env#mk_memory_address_value memref#index offset)
440445
| XVar v when env#is_memory_address v -> XVar v
441446
| _ ->
@@ -693,7 +698,8 @@ object (self)
693698
begin
694699
match memxpr with
695700
| XVar v when env#is_initial_value v || env#is_function_return_value v ->
696-
let memref = vmgr#memrefmgr#mk_external_reference v ftype in
701+
let memtype = type_of_exp fdecls e in
702+
let memref = vmgr#memrefmgr#mk_external_reference v memtype in
697703
XVar (env#mk_memory_address_value memref#index offset)
698704
| XVar v when env#is_memory_address v -> XVar v
699705
| _ ->
@@ -765,7 +771,7 @@ object (self)
765771
| XVar v when env#is_initial_value v ->
766772
let memref =
767773
env#get_variable_manager#memrefmgr#mk_external_reference
768-
v (type_of_lval fdecls lval) in
774+
v (type_of_exp fdecls e) in
769775
env#mk_memory_variable memref#index offset SYM_VAR_TYPE
770776
| _ ->
771777
env#mk_temp SYM_VAR_TYPE

CodeHawk/CHC/cchanalyze/cCHGenerateAndCheck.ml

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,20 @@
3131
open CHAtlas
3232
open CHCommon
3333
open CHLanguage
34-
open CHPEPRDictionary
3534
open CHPretty
3635

3736
(* chutil *)
3837
open CHLogger
39-
open CHPrettyUtil
40-
open CHTiming
4138
open CHTimingLog
42-
open CHXmlDocument
43-
open CHXmlReader
4439

4540
(* cchlib *)
4641
open CCHBasicTypes
47-
open CCHContext
48-
open CCHFileEnvironment
4942
open CCHSettings
5043
open CCHUtilities
5144

5245
(* cchpre *)
53-
open CCHCallsite
54-
open CCHPPO
5546
open CCHPreFileIO
5647
open CCHPreTypes
57-
open CCHProofObligation
5848
open CCHProofScaffolding
5949

6050
(* cchanalyze *)
@@ -75,7 +65,6 @@ module H = Hashtbl
7565

7666
let fenv = CCHFileEnvironment.file_environment
7767

78-
let prr p l = fixed_length_pretty ~alignment:StrRight p l
7968
let function_to_be_analyzed = ref ""
8069

8170
let max_callcount = 100
@@ -210,6 +199,7 @@ let process_function gspecs fname =
210199
let functionTranslator =
211200
gspec.ig_get_function_translator env orakel opsProvider in
212201
let (optSem, sys) = functionTranslator#translate fundec in
202+
(* let _ = pr_debug [sys#toPretty] in *)
213203
let semantics =
214204
match optSem with
215205
| Some sem -> sem | _ -> default_opsemantics in

CodeHawk/CHC/cchanalyze/cCHPOCheckIndexUpperBound.ml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,12 @@ object (self)
183183
method private xpr1_implies_existential_violation invindices x1 x2 =
184184
match x1 with
185185
| XVar v -> self#var1_implies_existential_violation invindices v x2
186+
| XOp (XPlus, [XVar v; xincr]) ->
187+
let xincr = simplify_xpr (XOp (XPlus, [x2; xincr])) in
188+
self#var1_implies_existential_violation invindices v xincr
189+
| XOp (XMinus, [XVar v; xdecr]) ->
190+
let xincr = simplify_xpr (XOp (XMinus, [x2; xdecr])) in
191+
self#var1_implies_existential_violation invindices v xincr
186192
| _ -> None
187193

188194
method private xprlist_implies_existential_violation invindices xl x2 =

CodeHawk/CHC/cchanalyze/cCHPOQuery.ml

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -420,24 +420,52 @@ object (self)
420420
let id = po#index in
421421
let locinvio = invio#get_location_invariant cfgcontext in
422422
let facts = locinvio#get_invariants in
423-
let vars = List.fold_left (fun acc f ->
424-
match f#get_fact with
425-
| NonRelationalFact (v, _i) ->
426-
if env#check_variable_applies_to_po v ~argindex po#is_ppo id then
427-
if List.exists (fun vv -> v#equal vv) acc then
428-
acc
429-
else
430-
v :: acc
431-
else
432-
acc
433-
| _ -> acc) [] facts in
434-
List.fold_left (fun acc v ->
435-
let invs = locinvio#get_var_invariants v in
436-
List.fold_left (fun acc1 inv ->
437-
if List.exists (fun inv' -> inv#index = inv'#index) acc1 then
438-
acc1
439-
else
440-
inv :: acc1) acc invs) [] vars
423+
match facts with
424+
| [] ->
425+
begin
426+
self#set_diagnostic
427+
("no invariant facts in proof obligation context");
428+
[]
429+
end
430+
| _ ->
431+
let vars =
432+
List.fold_left (fun acc f ->
433+
match f#get_fact with
434+
| NonRelationalFact (v, _i) ->
435+
if env#check_variable_applies_to_po v ~argindex po#is_ppo id then
436+
if List.exists (fun vv -> v#equal vv) acc then
437+
acc
438+
else
439+
v :: acc
440+
else
441+
acc
442+
| _ -> acc) [] facts in
443+
match vars with
444+
| [] ->
445+
begin
446+
self#set_diagnostic
447+
("no invariants found on variables that apply to proof obligation");
448+
[]
449+
end
450+
| _ ->
451+
let invs =
452+
List.fold_left (fun acc v ->
453+
let invs = locinvio#get_var_invariants v in
454+
List.fold_left (fun acc1 inv ->
455+
if List.exists (fun inv' -> inv#index = inv'#index) acc1 then
456+
acc1
457+
else
458+
inv :: acc1) acc invs) [] vars in
459+
match invs with
460+
| [] ->
461+
begin
462+
self#set_diagnostic
463+
("none of the variables has associated invariants: "
464+
^ (p2s
465+
(pretty_print_list vars (fun v -> v#toPretty) "[" "," "]")));
466+
[]
467+
end
468+
| _ -> invs
441469

442470
method get_invariants_lb (argindex:int) =
443471
List.sort (fun i1 i2 -> i1#compare_lb i2) (self#get_invariants argindex)

0 commit comments

Comments
 (0)