Skip to content

Commit cf75904

Browse files
committed
ASTI: restore warning for invariant with disequality
1 parent 56a6e20 commit cf75904

File tree

3 files changed

+36
-27
lines changed

3 files changed

+36
-27
lines changed

chb/astinterface/ASTInterfaceBasicBlock.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ def trampoline_payload_ast(self, astree: "ASTInterface") -> AST.ASTStmt:
206206
BX LR
207207
------------
208208
209-
fallthrough / continue:
209+
case 2: fallthrough / continue:
210210
<condition>
211211
MOVxx R1, #1
212212
LSL R0, R1, #1

chb/astinterface/ASTInterfaceFunction.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,8 @@ def set_invariants(self) -> None:
323323
fact.initial_value,
324324
instr.xdata,
325325
instr.iaddr,
326-
self.astinterface)
326+
self.astinterface,
327+
anonymous=True)
327328

328329
if str(var).startswith("astmem_tmp"):
329330
chklogger.logger.info(

chb/invariants/XXprUtil.py

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ def xxpr_memory_address_value_to_ast_expr(
185185
xpr: X.XXpr,
186186
xdata: "InstrXData",
187187
iaddr: str,
188-
astree: ASTInterface) -> AST.ASTExpr:
188+
astree: ASTInterface,
189+
anonymous: bool = False) -> AST.ASTExpr:
189190

190191
if not xpr.is_memory_address_value:
191192
chklogger.logger.error(
@@ -631,7 +632,7 @@ def vinitmemory_value_to_ast_lval_expression(
631632
"AST conversion of vinitmemory value %s with basevar %s and "
632633
+ "offset %s at address %s unsuccessful because of lack of type "
633634
+ "of basevar",
634-
str(vconstvar), str(astbase), str(astbasetype), str(coff), iaddr)
635+
str(vconstvar), str(astbase), str(coff), iaddr)
635636
return astree.mk_temp_lval_expression()
636637

637638
if astbasetype.is_pointer:
@@ -702,7 +703,6 @@ def xvariable_to_ast_def_lval_expression(
702703
if (
703704
xvar.is_initial_memory_value
704705
and not xdata.function.has_var_disequality(iaddr, xvar)):
705-
706706
asmvar = cast("VAuxiliaryVariable", xvar.denotation)
707707
vminitvar = cast("VInitialMemoryValue", asmvar.auxvar)
708708
return vinitmemory_value_to_ast_lval_expression(
@@ -711,15 +711,14 @@ def xvariable_to_ast_def_lval_expression(
711711
if (
712712
xvar.is_initial_memory_value
713713
and xdata.function.has_var_disequality(iaddr, xvar)):
714-
chklogger.logger.info(
715-
"AST def conversion of initial memory value %s that may have "
716-
+ "changed reverted to original variable at %s",
717-
str(xvar), str(iaddr))
718-
asmvar = cast("VAuxiliaryVariable", xvar.denotation)
719-
vminitvar = cast("VInitialMemoryValue", asmvar.auxvar)
720-
xxvar = vminitvar.variable
721-
return xvariable_to_ast_def_lval_expression(
722-
xxvar, xdata, iaddr, astree, size=size, anonymous=anonymous)
714+
715+
if (not anonymous):
716+
chklogger.logger.warning(
717+
"AST def conversion of initial memory value %s that may have "
718+
+ "changed reverted to original variable at %s",
719+
str(xvar), str(iaddr))
720+
721+
return astree.mk_temp_lval_expression()
723722

724723
if xvar.is_function_return_value:
725724
asmvar = cast("VAuxiliaryVariable", xvar.denotation)
@@ -769,7 +768,8 @@ def xvariable_to_ast_def_lval_expression(
769768
if ssavalue is not None:
770769
return ssavalue
771770
else:
772-
return astree.mk_vinfo_lval_expression(vinfo)
771+
return astree.mk_vinfo_lval_expression(
772+
vinfo, anonymous=anonymous)
773773
else:
774774
chklogger.logger.error(
775775
"Rdef: %s has not yet been introduced at address %s",
@@ -871,7 +871,7 @@ def xunary_to_ast_def_expr(
871871
if xpr.is_var:
872872
xvar = cast(X.XprVariable, xpr).variable
873873
astxvar = xvariable_to_ast_def_lval_expression(
874-
xvar, xdata, iaddr, astree)
874+
xvar, xdata, iaddr, astree, anonymous=anonymous)
875875
if not astxvar.is_ast_lval_expr:
876876
chklogger.logger.error(
877877
"Expected to receive an lval expression for %s at %s",
@@ -994,8 +994,10 @@ def xbinary_to_ast_def_expr(
994994
anonymous: bool = False) -> AST.ASTExpr:
995995

996996
def default() -> AST.ASTExpr:
997-
astxpr1 = xxpr_to_ast_def_expr(xpr1, xdata, iaddr, astree)
998-
astxpr2 = xxpr_to_ast_def_expr(xpr2, xdata, iaddr, astree)
997+
astxpr1 = xxpr_to_ast_def_expr(
998+
xpr1, xdata, iaddr, astree, anonymous=anonymous)
999+
astxpr2 = xxpr_to_ast_def_expr(
1000+
xpr2, xdata, iaddr, astree, anonymous=anonymous)
9991001
if operator in [
10001002
"plus", "minus", "mult", "div",
10011003
"band", "land", "lor", "bor", "asr",
@@ -1010,7 +1012,8 @@ def default() -> AST.ASTExpr:
10101012

10111013
if xpr1.is_var and xpr2.is_constant:
10121014
xvar = cast(X.XprVariable, xpr1).variable
1013-
astxpr1 = xvariable_to_ast_def_lval_expression(xvar, xdata, iaddr, astree)
1015+
astxpr1 = xvariable_to_ast_def_lval_expression(
1016+
xvar, xdata, iaddr, astree, anonymous=anonymous)
10141017
astxpr2 = xxpr_to_ast_expr(xpr2, xdata, iaddr, astree)
10151018
if operator in ["plus", "minus"]:
10161019
ty1 = astxpr1.ctype(astree.ctyper)
@@ -1022,7 +1025,8 @@ def default() -> AST.ASTExpr:
10221025
cast(AST.ASTTypPtr, ty1),
10231026
astxpr2,
10241027
iaddr,
1025-
astree)
1028+
astree,
1029+
anonymous=anonymous)
10261030
return astree.mk_binary_expression(operator, astxpr1, astxpr2)
10271031
else:
10281032
return default()
@@ -1224,22 +1228,25 @@ def xxpr_to_ast_def_expr(
12241228
anonymous=anonymous)
12251229

12261230
if xpr.is_constant:
1227-
return xxpr_to_ast_expr(xpr, xdata, iaddr, astree)
1231+
return xxpr_to_ast_expr(xpr, xdata, iaddr, astree, anonymous=anonymous)
12281232

12291233
if xpr.is_memory_address_value:
1230-
return xxpr_memory_address_value_to_ast_expr(xpr, xdata, iaddr, astree)
1234+
return xxpr_memory_address_value_to_ast_expr(
1235+
xpr, xdata, iaddr, astree, anonymous=anonymous)
12311236

12321237
if xpr.is_stack_address:
1233-
return stack_address_to_ast_expr(xpr, xdata, iaddr, astree)
1238+
return stack_address_to_ast_expr(
1239+
xpr, xdata, iaddr, astree, anonymous=anonymous)
12341240

12351241
if xpr.is_var:
12361242
xvar = cast(X.XprVariable, xpr).variable
12371243
return xvariable_to_ast_def_lval_expression(
1238-
xvar, xdata, iaddr, astree, size=size)
1244+
xvar, xdata, iaddr, astree, size=size, anonymous=anonymous)
12391245

12401246
if xpr.is_compound:
12411247
xpr = cast(X.XprCompound, xpr)
1242-
return xcompound_to_ast_def_expr(xpr, xdata, iaddr, astree, size=size)
1248+
return xcompound_to_ast_def_expr(
1249+
xpr, xdata, iaddr, astree, size=size, anonymous=anonymous)
12431250

12441251
else:
12451252
chklogger.logger.error(
@@ -1273,7 +1280,8 @@ def stack_variable_to_ast_lval(
12731280
astree: ASTInterface,
12741281
size: int = 4,
12751282
ctype: Optional[AST.ASTTyp] = None,
1276-
memaddr: Optional[X.XXpr] = None) -> AST.ASTLval:
1283+
memaddr: Optional[X.XXpr] = None,
1284+
anonymous: bool = False) -> AST.ASTLval:
12771285

12781286
if offset.is_constant_value_offset:
12791287
if size == 4:
@@ -1461,7 +1469,7 @@ def global_variable_to_ast_lval(
14611469
indexoffset = cast("VMemoryOffsetIndexOffset", offset.offset)
14621470
indexvar = indexoffset.indexvariable
14631471
offsetxpr = xvariable_to_ast_def_lval_expression(
1464-
indexvar, xdata, iaddr, astree)
1472+
indexvar, xdata, iaddr, astree, anonymous=anonymous)
14651473
astoffset: AST.ASTOffset = astree.mk_expr_index_offset(offsetxpr)
14661474
return astree.mk_vinfo_lval(vinfo, astoffset, anonymous=anonymous)
14671475

0 commit comments

Comments
 (0)