fix: out of bounds access when the CNF is too small (#5220)

As reported by @alexkeizer to me.
This commit is contained in:
Henrik Böving 2024-08-31 00:30:03 +02:00 committed by GitHub
parent e04a40ddc1
commit 88c193d71c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 22 additions and 1 deletions

View file

@ -45,8 +45,18 @@ def reconstructCounterExample (var2Cnf : Std.HashMap BVBit Nat) (assignment : Ar
2. The actual BitVec bitwise variables
Hence we access the assignment array offset by the AIG size to obtain the value for a BitVec bit.
We assume that a variable can be found at its index as CaDiCal prints them in order.
Note that cadical will report an assignment for all literals up to the maximum literal from the
CNF. So even if variable or AIG bits below the maximum literal did not occur in the CNF they
will still occur in the assignment that cadical reports.
There is one crucial thing to consider in addition: If the highest literal that ended up in the
CNF does not represent the highest variable bit not all variable bits show up in the assignment.
For this situation we do the same as cadical for literals that did not show up in the CNF:
set them to true.
-/
let (varSet, _) := assignment[cnfVar + aigSize]!
let idx := cnfVar + aigSize
let varSet := if h : idx < assignment.size then assignment[idx].fst else true
let mut bitMap := sparseMap.getD bitVar.var {}
bitMap := bitMap.insert bitVar.idx varSet
sparseMap := sparseMap.insert bitVar.var bitMap

View file

@ -0,0 +1,11 @@
import Std.Tactic.BVDecide
open BitVec
/--
error: The prover found a potential counterexample, consider the following assignment:
y = 0xffffffffffffffff#64
-/
#guard_msgs in
example {y : BitVec 64} : zeroExtend 32 y = 0 := by
bv_decide