Yes, I see the same behavior on my machine: KLEE finds the bug in
unoptimized mode, but does not find it with --optimize because that
access is eliminated by LLVM's optimizations. John, it would be
interesting to look into klee-last/assembly.ll to see if something more
interesting is going on there.
Cristian
On 01/25/2012 09:53 AM, Ott Tinn wrote:
> Hi John,
>
> In this case the linkage of "storage" keeps it from being optimized
> away during the initial compilation but afterwards KLEE's optimization
> pass will internalize it anyway and then run the other optimizations.
> Thus at least on my machine the program that ends up being
> symbolically executed when -optimize is used is the following:
>
> define i32 @main(i32 %argc, i8** nocapture %argv) nounwind {
> entry:
> %i = alloca i32, align 4
> %i1 = bitcast i32* %i to i8*
> call void @klee_make_symbolic(i8* %i1, i32 4, i8* getelementptr
> inbounds ([2 x i8]* @.str, i32 0, i32 0)) nounwind
> ret i32 0
> }
>
> If the internalization is skipped by not using -optimize or
> specifically using -disable-internalize then the bug could be found.
> You can confirm the final code by looking at the assembly.ll file in
> the klee-out-N directory. If you didn't use KLEE's optimization pass
> at all then this is could be something more interesting as David
> suggested.
>
> Ott
>
> On Tue, Jan 24, 2012 at 10:16 PM, John Regehr<[email protected]> wrote:
>> Hi Ott,
>>
>> I'm pretty sure optimizations are not the problem.
>>
>> First, "storage" has external linkage -- the compiler cannot infer that it
>> is not subsequently used.
>>
>> Second, llvm-gcc's output for this code (even with optimizations turned on)
>> is a pretty obvious translation of the C code.
>>
>> John
>>
>>
>>
>> On Tue, 24 Jan 2012, Ott Tinn wrote:
>>
>>> Hi John,
>>>
>>> The most obvious problem I see is that the code sample is too simple -
>>> the compiler optimizations could also see that the value you are
>>> storing to the storage array is never used. Since accessing array
>>> elements that are out of bounds is undefined in C then the compiler
>>> can optimize this away by assuming that it isn't out of bounds. To
>>> make this example work you could try compiling without any
>>> optimizations and without using KLEE's -optimize flag or otherwise
>>> making sure the dangerous operations can't be optimized away.
>>>
>>> Ott
>>>
>>> On Tue, Jan 24, 2012 at 9:18 PM, John Regehr<[email protected]> wrote:
>>>>
>>>> Perhaps interesting to people here:
>>>>
>>>> http://blog.regehr.org/archives/672
>>>>
>>>> While writing this up I discovered that when "i" is symbolic Klee cannot
>>>> find a value for i that makes this code access an OOB array element:
>>>>
>>>> int indices[] = { 0,2,1,5,3,0,-77,0,3,6 };
>>>>
>>>> value_t storage[7];
>>>>
>>>> void stash (int i, value_t v)
>>>> {
>>>> if (i<0 || i>=10) {
>>>> error();
>>>> } else {
>>>> int index = indices[i];
>>>> // assert (index>=0);
>>>> // assert (index<7);
>>>> storage[index] = v;
>>>> }
>>>> }
>>>>
>>>> On the other hand, given the assertions, Klee generates the test case
>>>> where
>>>> i==6.
>>>>
>>>> I infer that Klee does not automatically assert in-boundedness of array
>>>> accesses. But these assertions seem obviously desirable, so I'm trying
>>>> to
>>>> figure out why not. Maybe Klee doesn't have enough runtime information
>>>> to
>>>> make this happen?
>>>>
>>>> John
>>>> _______________________________________________
>>>> klee-dev mailing list
>>>> [email protected]
>>>> http://keeda.Stanford.EDU/mailman/listinfo/klee-dev
> _______________________________________________
> klee-dev mailing list
> [email protected]
> http://keeda.Stanford.EDU/mailman/listinfo/klee-dev
_______________________________________________
klee-dev mailing list
[email protected]
http://keeda.Stanford.EDU/mailman/listinfo/klee-dev