Skip to content

Instantly share code, notes, and snippets.

@martin-neuhaeusser
Created August 27, 2015 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save martin-neuhaeusser/e67999b63f749e5ecf1e to your computer and use it in GitHub Desktop.
Save martin-neuhaeusser/e67999b63f749e5ecf1e to your computer and use it in GitHub Desktop.
SMT-LIBv2 formula with classical and Flanagan & Saxe style weakest preconditions
(set-logic QF_UFBV)
; This push is essential for our problem:
; It forces Z3 to use the "solver 2", which is used in our application
(push)
(declare-fun register-call () (_ BitVec 8))
(declare-fun register-b () (_ BitVec 8))
(declare-fun register-a () (_ BitVec 8))
(declare-fun register-conv () (_ BitVec 8))
(declare-fun pred () Bool)
(declare-fun register-b-0-0-1 () (_ BitVec 8))
(declare-fun register-a-0-0-1 () (_ BitVec 8))
(declare-fun register-conv-0-0-1 () (_ BitVec 8))
(assert (let ((a!1 (bvsle ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b)))
register-call))
(a!2 ((_ sign_extend 24)
((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b)))))
(a!4 (= ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b)))
#x00)))
(let ((a!3 (= ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-conv) a!2))
#x00)))
(=> pred (or a!1 (not a!3) a!4 (bvsle register-call #x00))))))
(assert (let ((a!1 (= ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b)))
#x00))
(a!2 (= register-b-0-0-1
((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b)))))
(a!3 (= register-conv-0-0-1
((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-conv)
((_ sign_extend 24) register-b-0-0-1)))))
(a!4 ((_ sign_extend 24)
((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a-0-0-1)
((_ sign_extend 24) register-b-0-0-1))))))
(let ((a!5 (bvsle ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-conv-0-0-1)
a!4))
register-call))
(a!6 (= ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-conv-0-0-1) a!4))
#x00)))
(let ((a!7 (or (not pred)
(not (and (not a!1)
a!2
(= register-a-0-0-1
register-conv)
a!3))
a!5
a!6
(bvsle register-call #x00))))
(not a!7)))))
(check-sat)
(set-logic QF_UFBV)
; This push is essential for our problem:
; It forces Z3 to use the "solver 2", which is used in our application
(push)
(declare-fun register-call () (_ BitVec 8))
(declare-fun register-b () (_ BitVec 8))
(declare-fun register-a () (_ BitVec 8))
(declare-fun register-conv () (_ BitVec 8))
(declare-fun pred () Bool)
(assert (let ((a!1 (bvsle ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b)))
register-call))
(a!2 ((_ sign_extend 24)
((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b)))))
(a!4 (= ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b)))
#x00)))
(let ((a!3 (= ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-conv) a!2))
#x00)))
(=> pred (or a!1 (not a!3) a!4 (bvsle register-call #x00))))))
(assert (let ((a!1 (= ((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b)))
#x00))
(a!2 ((_ sign_extend 24)
((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-a)
((_ sign_extend 24) register-b))))))
(let ((a!3 ((_ sign_extend 24)
((_ extract 7 0)
(bvsrem ((_ sign_extend 24) register-conv) a!2)))))
(let ((a!4 (or (not pred)
a!1
(bvsle ((_ extract 7 0) (bvsrem a!3 a!3)) register-call)
(= ((_ extract 7 0) (bvsrem a!3 a!3)) #x00)
(bvsle register-call #x00))))
(not a!4)))))
(check-sat)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment