Thanks Stefan but your code doesn't work either.
$ klee test.o
KLEE: output directory = "klee-out-0"
WARNING: Linking two modules of different data layouts!
WARNING: Linking two modules of different target triples!
WARNING: Linking two modules of different data layouts!
WARNING: Linking two modules of different target triples!
WARNING: Linking two modules of different data layouts!
WARNING: Linking two modules of different target triples!
KLEE: done: total instructions = 27
KLEE: done: completed paths = 1
KLEE: done: generated tests = 1
The metadata is debug related. In the last days I built several LLVM
versions with different flags. The <badref>s might be an issue from
there. However, if we compare the LLVM code compiled without the '-g'
flag set, the sources should look similar (except that you use a 64bit
machine and mine is 32bit). (I've attached my version without metadata.)
What about the STP queries?
# Query 0 -- Type: InitialValues, Instructions: 13
(query [] false)
# OK -- Elapsed: 0.000226092
# Solvable: true
Is a "false" query really solvable?
# Query 1 -- Type: InitialValues, Instructions: 13
array arr1[4] : w32 -> w8 = symbolic
(query [] (Eq false
(Slt 10
(ReadLSB w32 0 arr1))) []
[arr1])
# OK -- Elapsed: 0.00159706
# Solvable: false
Shouldn't this query (c > 10) be solvable?
I don't understand where the problem comes from. I had klee already
running on my system and it worked fine. The only serious change in my
system (that I'm aware of) is a distribution related update to GCC 4.5.0.
Heinz
On 05/20/2010 09:33 PM, Stefan Bucur wrote:
> Your code seems to have some problems, although I don't know how they
> affect the Klee operation. I compiled your code with my LLVM 2.6
> installation, and it resulted:
>
> define i32 @main(i32 %argc, i8** %argv) nounwind {
> entry:
> %argc_addr = alloca i32 ;<i32*> [#uses=2]
> %argv_addr = alloca i8** ;<i8***> [#uses=2]
> %retval = alloca i32 ;<i32*> [#uses=2]
> %c = alloca i32 ;<i32*> [#uses=3]
> %0 = alloca i32 ;<i32*> [#uses=3]
> %"alloca point" = bitcast i32 0 to i32 ;<i32> [#uses=0]
> call void @llvm.dbg.func.start({ }* bitcast
> (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram to { }*))
> %1 = bitcast i32* %argc_addr to { }* ;<{ }*> [#uses=1]
> call void @llvm.dbg.declare({ }* %1, { }* bitcast
> (%llvm.dbg.variable.type* @llvm.dbg.variable to { }*))
> store i32 %argc, i32* %argc_addr
> %2 = bitcast i8*** %argv_addr to { }* ;<{ }*> [#uses=1]
> call void @llvm.dbg.declare({ }* %2, { }* bitcast
> (%llvm.dbg.variable.type* @llvm.dbg.variable10 to { }*))
> store i8** %argv, i8*** %argv_addr
> %3 = bitcast i32* %c to { }* ;<{ }*> [#uses=1]
> call void @llvm.dbg.declare({ }* %3, { }* bitcast
> (%llvm.dbg.variable.type* @llvm.dbg.variable12 to { }*))
> call void @llvm.dbg.stoppoint(i32 4, i32 0, { }* bitcast
> (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*))
> %c1 = bitcast i32* %c to i8* ;<i8*> [#uses=1]
> call void @klee_make_symbolic(i8* %c1, i64 4, i8* getelementptr
> inbounds ([2 x i8]* @.str13, i64 0, i64 0)) nounwind
> call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast
> (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*))
> %4 = load i32* %c, align 4 ;<i32> [#uses=1]
> %5 = icmp sgt i32 %4, 10 ;<i1> [#uses=1]
> br i1 %5, label %bb, label %bb2
> ; No predecessors!
> call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast
> (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*))
> br label %bb
>
> bb: ; preds = %6, %entry
> call void @llvm.dbg.stoppoint(i32 6, i32 0, { }* bitcast
> (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*))
> store i32 1, i32* %0, align 4
> br label %bb3
> ; No predecessors!
> call void @llvm.dbg.stoppoint(i32 6, i32 0, { }* bitcast
> (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*))
> br label %bb2
>
> bb2: ; preds = %7, %entry
> call void @llvm.dbg.stoppoint(i32 7, i32 0, { }* bitcast
> (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*))
> store i32 0, i32* %0, align 4
> br label %bb3
>
> bb3: ; preds = %bb2, %bb
> call void @llvm.dbg.stoppoint(i32 7, i32 0, { }* bitcast
> (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*))
> %8 = load i32* %0, align 4 ;<i32> [#uses=1]
> store i32 %8, i32* %retval, align 4
> br label %return
>
> return: ; preds = %bb3
> %retval4 = load i32* %retval ;<i32> [#uses=1]
> call void @llvm.dbg.stoppoint(i32 7, i32 0, { }* bitcast
> (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*))
> call void @llvm.dbg.region.end({ }* bitcast
> (%llvm.dbg.subprogram.type* @llvm.dbg.subprogram to { }*))
> ret i32 %retval4
> }
>
> You can see that the llvm.dbg.* calls do not have the "metadata
> <badref>", but some valid parameters instead.
>
> In any case, I attached in this message the test.o file that works for
> me (it generates 2 paths with Klee). You should try it out and see if
> it works with your Klee setup, as well. If it does, then there is a
> problem with the way you set up LLVM on your machine.
>
> Stefan
>
> On Thu, May 20, 2010 at 9:17 PM, Heinz Riener<hriener at student.tugraz.at>
> wrote:
>> Hi Stefan,
>>
>> for me the llvm code looks correct: There is an icmp instruction and one
>> way from entry over bb to bb3 and one way from entry over bb2 to bb3.
>>
>> $ cat test.o.ll
>> ...
>> define i32 @main(i32 %argc, i8** %argv) nounwind {
>> entry:
>> %argc_addr = alloca i32 ;<i32*> [#uses=1]
>> %argv_addr = alloca i8** ;<i8***> [#uses=1]
>> %retval = alloca i32 ;<i32*> [#uses=2]
>> %0 = alloca i32 ;<i32*> [#uses=3]
>> %c = alloca i32 ;<i32*> [#uses=2]
>> %"alloca point" = bitcast i32 0 to i32 ;<i32> [#uses=0]
>> call void @llvm.dbg.declare(metadata<badref>, metadata !0)
>> store i32 %argc, i32* %argc_addr
>> call void @llvm.dbg.declare(metadata<badref>, metadata !9)
>> store i8** %argv, i8*** %argv_addr
>> call void @llvm.dbg.declare(metadata<badref>, metadata !10)
>> %c1 = bitcast i32* %c to i8* ;<i8*> [#uses=1]
>> call void @klee_make_symbolic(i8* %c1, i32 4, i8* getelementptr inbounds
>> ([2 x i8]* @.str, i32 0, i32 0)) nounwind
>> %1 = load i32* %c, align 4 ;<i32> [#uses=1]
>> %2 = icmp sgt i32 %1, 10 ;<i1> [#uses=1]
>> br i1 %2, label %bb, label %bb2
>>
>> bb: ; preds = %entry
>> store i32 1, i32* %0, align 4
>> br label %bb3
>>
>> bb2: ; preds = %entry
>> store i32 0, i32* %0, align 4
>> br label %bb3
>>
>> bb3: ; preds = %bb2, %bb
>> %3 = load i32* %0, align 4 ;<i32> [#uses=1]
>> store i32 %3, i32* %retval, align 4
>> br label %return
>>
>> return: ; preds = %bb3
>> %retval4 = load i32* %retval ;<i32> [#uses=1]
>> ret i32 %retval4
>> }
>> ...
>>
>> Heinz
>>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test.o
Type: application/x-object
Size: 712 bytes
Desc: not available
Url :
http://keeda.Stanford.EDU/pipermail/klee-dev/attachments/20100520/7c281ab3/attachment-0001.bin
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: test.o.ll
Url:
http://keeda.Stanford.EDU/pipermail/klee-dev/attachments/20100520/7c281ab3/attachment-0001.cc