Domagoj Babic
2007-Apr-08 20:25 UTC
[LLVMdev] New automated decision procedure for path-sensitive analysis
Dear LLVMers,
This email is intended for those interested in path-sensitive analysis,
integer overflow analysis, static analysis, and (perhaps) loop invariant
computation.
Traditionally, such analyses have been considered too expensive to be
practical, and were mostly an academic curiosity. The core of the
problem is the lack of adequate automated decision procedures which
could quickly determine whether a set of constraints is satisfiable or
not, and if it is satisfiable, find a solution.
Recently, I've released Spear -- automated modular arithmetic theorem
prover, which has proven to be very scalable in my setting.
A nice feature of Spear is that it supports all LLVM integral
instructions, including SDIV/UDIV/MUL/..., which makes it really easy to
use in combination with LLVM. However, Spear itself is not LLVM-based
because many people that are interested in such theorem provers do not
use LLVM.
Here I provide two simple examples to give you a flavour of Spear:
------------ Example 1 ---------------
Assume that you want to generate an instance that corresponds to the
following C-like sequential code:
int f(int a, int b) {
int a1;
if (a%2) { a1 = a + 1; }
else { a1 = a; }
// a1 is even
int c = a1 * a1;
// Square of an even number is divisible by 4
assert(c % 4 == 0);
}
You could check the validity of the assertion by checking the
unsatisfiability of the negated formula (corresponds to checking that
the assertion can never be FALSE):
# Checking a simple assertion
v 1.0
d a:i32 a1:i32 c:i32 inca:i32 tmp1:i32 tmp2:i1 tmp3:i32 assert:i1
c inca + a 1:i32
c tmp1 %s a 2:i32
c tmp2 trun tmp1
c a1 ite tmp2 inca a
c c * a1 a1
c tmp3 %s c 4:i32
c assert = tmp3 0:i32
p = assert 0:i1
Spear proves this query to be unsatisfiable in 0.02 sec on AMD 64 X2
4600+ for 32-bit integers, and in 0.08 sec for 64-bit integers with the
default heuristics.
------------ Example 2 ---------------
The last Fermat's theorem says that for integer n>2 the equation
a^n+b^n=c^n has no solutions for non-zero integers a, b, and c.
However, if a,b,c are bounded integers, the equation can have
non-trivial (non-zero) solutions. Let's try to find one such example:
# Finding a solution of a^4 + b^4 = c^4
v 1.0
d a:i64 b:i64 c:i64 a2:i64 b2:i64 c2:i64 a4:i64 b4:i64 c4:i64 sum:i64
c a2 * a a
c b2 * b b
c c2 * c c
c a4 * a2 a2
c b4 * b2 b2
c c4 * c2 c2
c sum + a4 b4
p = sum c4
Spear finds a non-trivial solution of this query in 24.08 sec on AMD
64 X2 4600+ with the default heuristics and in 3.18 sec with
the fh_1_1 heuristic.
--------------------------------------
The prover and the input format specification are available on:
http://www.cs.ubc.ca/~babic/index_spear.htm
Regards,
Domagoj Babic
P.S.
I hesitated to send the email to the list, but several people in the channel
showed interest and encouraged me to send a release notification.
Zhongxing Xu
2007-Apr-09 02:09 UTC
[LLVMdev] New automated decision procedure for path-sensitive analysis
On 4/9/07, Domagoj Babic <babic.domagoj at gmail.com> wrote:> > > Traditionally, such analyses have been considered too expensive to be > practical, and were mostly an academic curiosity. The core of the > problem is the lack of adequate automated decision procedures which > could quickly determine whether a set of constraints is satisfiable or > not, and if it is satisfiable, find a solution.I think the real difficult thing in path sensitive program analysis (or symbolic execution) is not the lack of decision procedures, but the translation of arbitrary pointer operations and library function calls in C/C++ program into the mathematics supported by the automated theorem prover. Almost every concept in the computer program except memory address has a counterpart in mathematics. I have tried to simulate memory by arrays in symbolic execution. But I found it is inadequate. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20070409/b49a306e/attachment.html>
Domagoj Babic
2007-Apr-09 03:07 UTC
[LLVMdev] New automated decision procedure for path-sensitive analysis
Hi Zhongxing, On 4/8/07, Zhongxing Xu <xuzhongxing at gmail.com> wrote:> I think the real difficult thing in path sensitive program analysis (or > symbolic execution) is not the lack of decision procedures, but the > translation of arbitrary pointer operations and library function calls in > C/C++ program into the mathematics supported by the automated theorem > prover. > Almost every concept in the computer program except memory address has a > counterpart in mathematics. I have tried to simulate memory by arrays in > symbolic execution. But I found it is inadequate.There has been some progress lately (see Rustan Leino's work on the weakest precondition transformer) on handling arrays. Some automated theorem provers even support the theories of arrays (like CVC, Simplify, Yices,...). However, those thm provers do not have a very good support for modular arithmetic. In fact, they most often approximate bounded integers with rationals (reals), and that's one of the reasons why they can't handle operators like MUL ( as they rely on linear arithmetic solvers, like simplex ). Spear takes a different approach - it is bit-precise, handles all operators, but currently doesn't handle arrays directly. However, the other mentioned thm provers handle arrays by encoding them as UIFs + several axioms. As UIFs can be encoded to SAT, I think that the theory of arrays could be as well. So, with a bit of effort, you should be able to use Spear for reasoning about arrays. Cheers, Domagoj Babic
Apparently Analagous Threads
- [LLVMdev] New automated decision procedure for path-sensitive analysis
- [LLVMdev] New automated decision procedure for path-sensitive analysis
- [LLVMdev] New automated decision procedure for path-sensitive analysis
- [LLVMdev] GSoC 2011: Superoptimization for LLVM IR
- [LLVMdev] constructing 'for' statement from LLVM bitcode