Skip to content

Commit 5497de0

Browse files
Merge pull request #8597 from Z3Prover/copilot/fix-high-severity-bugs-python-api
Fix 13 critical bugs in Python API: assertion removal, division by zero, bounds checking
2 parents e6d32f3 + 8077e3d commit 5497de0

File tree

1 file changed

+36
-17
lines changed

1 file changed

+36
-17
lines changed

src/api/python/z3/z3.py

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -870,7 +870,7 @@ def params(self):
870870
elif k == Z3_PARAMETER_ZSTRING:
871871
result[i] = "internal string"
872872
else:
873-
assert(False)
873+
raise Z3Exception("Unexpected parameter kind")
874874
return result
875875

876876
def __call__(self, *args):
@@ -3374,6 +3374,8 @@ def RatVal(a, b, ctx=None):
33743374
if z3_debug():
33753375
_z3_assert(_is_int(a) or isinstance(a, str), "First argument cannot be converted into an integer")
33763376
_z3_assert(_is_int(b) or isinstance(b, str), "Second argument cannot be converted into an integer")
3377+
if b == 0:
3378+
pass # division by 0 is legal in z3 expressions.
33773379
return simplify(RealVal(a, ctx) / RealVal(b, ctx))
33783380

33793381

@@ -5896,7 +5898,9 @@ def __getitem__(self, arg):
58965898
>>> g[1]
58975899
y > x
58985900
"""
5899-
if arg >= len(self):
5901+
if arg < 0:
5902+
arg += len(self)
5903+
if arg < 0 or arg >= len(self):
59005904
raise IndexError
59015905
return self.get(arg)
59025906

@@ -12014,50 +12018,64 @@ def ctx_ref(self):
1201412018
return self.ctx().ref()
1201512019

1201612020
def add_fixed(self, fixed):
12017-
assert not self.fixed
12018-
assert not self._ctx
12021+
if self.fixed:
12022+
raise Z3Exception("fixed callback already registered")
12023+
if self._ctx:
12024+
raise Z3Exception("context already initialized")
1201912025
if self.solver:
1202012026
Z3_solver_propagate_fixed(self.ctx_ref(), self.solver.solver, _user_prop_fixed)
1202112027
self.fixed = fixed
1202212028

1202312029
def add_created(self, created):
12024-
assert not self.created
12025-
assert not self._ctx
12030+
if self.created:
12031+
raise Z3Exception("created callback already registered")
12032+
if self._ctx:
12033+
raise Z3Exception("context already initialized")
1202612034
if self.solver:
1202712035
Z3_solver_propagate_created(self.ctx_ref(), self.solver.solver, _user_prop_created)
1202812036
self.created = created
1202912037

1203012038
def add_final(self, final):
12031-
assert not self.final
12032-
assert not self._ctx
12039+
if self.final:
12040+
raise Z3Exception("final callback already registered")
12041+
if self._ctx:
12042+
raise Z3Exception("context already initialized")
1203312043
if self.solver:
1203412044
Z3_solver_propagate_final(self.ctx_ref(), self.solver.solver, _user_prop_final)
1203512045
self.final = final
1203612046

1203712047
def add_eq(self, eq):
12038-
assert not self.eq
12039-
assert not self._ctx
12048+
if self.eq:
12049+
raise Z3Exception("eq callback already registered")
12050+
if self._ctx:
12051+
raise Z3Exception("context already initialized")
1204012052
if self.solver:
1204112053
Z3_solver_propagate_eq(self.ctx_ref(), self.solver.solver, _user_prop_eq)
1204212054
self.eq = eq
1204312055

1204412056
def add_diseq(self, diseq):
12045-
assert not self.diseq
12046-
assert not self._ctx
12057+
if self.diseq:
12058+
raise Z3Exception("diseq callback already registered")
12059+
if self._ctx:
12060+
raise Z3Exception("context already initialized")
1204712061
if self.solver:
1204812062
Z3_solver_propagate_diseq(self.ctx_ref(), self.solver.solver, _user_prop_diseq)
1204912063
self.diseq = diseq
1205012064

1205112065
def add_decide(self, decide):
12052-
assert not self.decide
12053-
assert not self._ctx
12066+
if self.decide:
12067+
raise Z3Exception("decide callback already registered")
12068+
if self._ctx:
12069+
raise Z3Exception("context already initialized")
1205412070
if self.solver:
1205512071
Z3_solver_propagate_decide(self.ctx_ref(), self.solver.solver, _user_prop_decide)
1205612072
self.decide = decide
1205712073

1205812074
def add_on_binding(self, binding):
12059-
assert not self.binding
12060-
assert not self._ctx
12075+
if self.binding:
12076+
raise Z3Exception("binding callback already registered")
12077+
if self._ctx:
12078+
raise Z3Exception("context already initialized")
1206112079
if self.solver:
1206212080
Z3_solver_propagate_on_binding(self.ctx_ref(), self.solver.solver, _user_prop_binding)
1206312081
self.binding = binding
@@ -12072,7 +12090,8 @@ def fresh(self, new_ctx):
1207212090
raise Z3Exception("fresh needs to be overwritten")
1207312091

1207412092
def add(self, e):
12075-
assert not self._ctx
12093+
if self._ctx:
12094+
raise Z3Exception("context already initialized")
1207612095
if self.solver:
1207712096
Z3_solver_propagate_register(self.ctx_ref(), self.solver.solver, e.ast)
1207812097
else:

0 commit comments

Comments
 (0)