"""reduce the value associated to x in s under the hypothesis that x > expr"""
ifsisNone:
returns
v=eval_aexp(s,expr)
ifvisNone:
returnNone
ifisinstance(v,Top):
returns
matchv:
casesign.POS|sign.SPOS|sign.Z:
lower=sign.SPOS
case_:
lower=sign.INT
res=sign_meet(s[x],lower)
ifresisNone:
returnNone
returns|{x:res}
defreduce_state(s:state,c:BoolExpr)->state:
ifsisNone:
returns
matchc:
# To be completed (see course's slides)
case_:
returns
classSign_interp(Transfer[state]):
variables:frozenset[str]
def__init__(self,instr:Instr):
self.variables=variables_of_instr(instr)
defbottom(self)->state:
returnNone
definit_state(self)->state:
returndict.fromkeys(self.variables,sign.INT)
defjoin(self,s1:state,s2:state)->state:
ifs1isNone:
returns2
ifs2isNone:
returns1
res:abstract_env={}
forvarinself.variables:
v1=s1[var]
v2=s2[var]
res[var]=sign_join(v1,v2)
returnres
defincluded(self,s1:state,s2:state)->bool:
ifs1isNone:
returnTrue
ifs2isNone:
returnFalse
forvarinself.variables:
ifnotsign_leq(s1[var],s2[var]):
returnFalse
returnTrue
deftr_skip(self,s:state)->state:
returns
deftr_set(self,s:state,v:str,e:ArithExpr)->state:
raiseNotImplementedError
deftr_test(self,s:state,c:BoolExpr)->state:
raiseNotImplementedError
deftr_err(self,s:state,e:Expr)->state:
ifsisNone:
returns
ifisinstance(e,ArithExpr):
raiseNotImplementedError
ifisinstance(e,BoolExpr):
raiseNotImplementedError
defanalyze(i:Instr)->None:
cfg=Cfg(i)
res=fixpoint_iteration(Sign_interp(i),cfg)
fornodeincfg.g.nodes:
print(f"State at {node}:")
s=res[node]
ifsisnotNone:
forv,sins.items():
print(f"{v}: {s}")
"""
# Évaluation des expressions
L'analyse de signe montre que l'expression `y * (x - x/y)` peut être évaluée de manière sûre uniquement lorsque x et y sont strictement positifs ou lorsque x est positif et y est non-zéro, mais dans ce cas le résultat peut être n'importe quel entier. Dans tous les autres cas, soit on a une erreur certaine (division par zéro ou variables non définies), soit on a une erreur potentielle (TOP) car le résultat peut être n'importe quel signe.