[klee-dev] Question on dereferencing a symbol pointer

Cristian Cadar c.cadar at imperial.ac.uk
Wed Mar 10 09:55:32 GMT 2021


Hi,

The short answer is that KLEE does not support mmap.

However, it shouldn't crash and I cannot reproduce that behaviour: when 
I run it, KLEE reports a memory error at "*(int*)addr = 0;", as I also 
expected.

Best,
Cristian

On 09/03/2021 14:46, Liu, Mingyi wrote:
> Hi klee-dev members,
> 
> I made a pointer symbolic in a program, but I didn't understand why the 
> results were different with the following two scenarios.
> 
> Case 1:
> 
> #include "klee/klee.h"
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/mman.h>
> #include <unistd.h>
> 
> int main(int argc, char* argv[]) {
> 
>    int* ptr;
> 
>    klee_make_symbolic(&ptr, sizeof(ptr), "ptr");
> 
>    void* addr = mmap((void*)(rand() & (~0xfff)), getpagesize(), 
> PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FIXED | MAP_PRIVATE, -1, 0);
> 
>    if (addr == MAP_FAILED) {
>      printf("mmap error\n");
>      exit(-1);
>    }
> 
>    *(int*)addr = 0;
> 
>    printf("ptr=%p\n", ptr);
> 
>    if (ptr == (int*)addr) {
>      printf("enter\n");
>      *ptr = 65;
> *printf("after: *ptr=%s\n", ptr);*
>    }
> 
>    return 0;
> 
> }
> 
> After running klee with the command $ klee -write-kqueries 
> -external-calls=all program.bc , I got 2 paths as expected:
> 
>     KLEE: done: total instructions = 45
>     KLEE: done: completed paths = 2
>     KLEE: done: generated tests = 2
> 
> The output when executing against the second ktest file is shown below:
> 
>     ptr=0x6b8b4000
>     enter
>     after: *ptr=A
> 
> However, in Case 2, the only difference is that I replaced 
> *printf("after: *ptr=**%s**\n", **ptr**);* with *printf("after: 
> *ptr=%d\n", *ptr); *. When running with the same command, the program 
> was aborted with the following messages:
> 
>     klee: /usr/lib/llvm-6.0/include/llvm/Support/Casting.h:92: static
>     bool llvm::isa_impl_cl<To, From*>::doit(const From*) [with To =
>     klee::ConstantExpr; From = klee::Expr]: Assertion `Val && "isa<>
>     used on a null pointer"' failed.
>     #0 0x00007fe5c64b60ea llvm::sys::PrintStackTrace(llvm::raw_ostream&)
>     (/usr/lib/llvm-6.0/lib/libLLVM-6.0.so.1+0x81e0ea)
>     #1 0x00007fe5c64b4366 llvm::sys::RunSignalHandlers()
>     (/usr/lib/llvm-6.0/lib/libLLVM-6.0.so.1+0x81c366)
>     #2 0x00007fe5c64b449b (/usr/lib/llvm-6.0/lib/libLLVM-6.0.so.1+0x81c49b)
>     #3 0x00007fe5c5173fd0 (/lib/x86_64-linux-gnu/libc.so.6+0x3efd0)
>     #4 0x00007fe5c5173f47 gsignal
>     /build/glibc-2ORdQG/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
>     #5 0x00007fe5c51758b1 abort
>     /build/glibc-2ORdQG/glibc-2.27/stdlib/abort.c:81:0
>     #6 0x00007fe5c516542a __assert_fail_base
>     /build/glibc-2ORdQG/glibc-2.27/assert/assert.c:89:0
>     #7 0x00007fe5c51654a2 (/lib/x86_64-linux-gnu/libc.so.6+0x304a2)
>     #8 0x000055d863a75ba0
>     klee::ExprOptimizer::optimizeExpr(klee::ref<klee::Expr> const&,
>     bool) /vagrant/vagrant/xxx/klee/lib/Expr/ArrayExprOptimizer.cpp:193:0
>     #9 0x000055d8639dd657
>     klee::ref<klee::Expr>::operator=(klee::ref<klee::Expr>&&)
>     /vagrant/vagrant/xxx/klee/include/klee/util/Ref.h:184:0
>     #10 0x000055d8639dd657
>     klee::Executor::callExternalFunction(klee::ExecutionState&,
>     klee::KInstruction*, llvm::Function*,
>     std::vector<klee::ref<klee::Expr>,
>     std::allocator<klee::ref<klee::Expr> > >&)
>     /vagrant/vagrant/xxx/klee/lib/Core/Executor.cpp:3366:0
>     #11 0x000055d8639e9668
>     klee::Executor::executeCall(klee::ExecutionState&,
>     klee::KInstruction*, llvm::Function*,
>     std::vector<klee::ref<klee::Expr>,
>     std::allocator<klee::ref<klee::Expr> > >&)
>     /vagrant/vagrant/xxx/klee/lib/Core/Executor.cpp:1441:0
>     #12 0x000055d8639f11e7
>     klee::Executor::executeInstruction(klee::ExecutionState&,
>     klee::KInstruction*)
>     /vagrant/vagrant/xxx/klee/lib/Core/Executor.cpp:2015:0
>     #13 0x000055d8639f27ad klee::Executor::run(klee::ExecutionState&)
>     /vagrant/vagrant/xxx/klee/lib/Core/Executor.cpp:3110:0
>     #14 0x000055d8639f30bc
>     std::enable_if<std::__and_<std::__not_<std::__is_tuple_like<klee::PTree*>
>      >, std::is_move_constructible<klee::PTree*>,
>     std::is_move_assignable<klee::PTree*> >::value, void>::type
>     std::swap<klee::PTree*>(klee::PTree*&, klee::PTree*&)
>     /usr/include/c++/7/bits/move.h:198:0
>     #15 0x000055d8639f30bc std::unique_ptr<klee::PTree,
>     std::default_delete<klee::PTree> >::reset(klee::PTree*)
>     /usr/include/c++/7/bits/unique_ptr.h:369:0
>     #16 0x000055d8639f30bc std::unique_ptr<klee::PTree,
>     std::default_delete<klee::PTree> >::operator=(decltype(nullptr))
>     /usr/include/c++/7/bits/unique_ptr.h:307:0
>     #17 0x000055d8639f30bc
>     klee::Executor::runFunctionAsMain(llvm::Function*, int, char**,
>     char**) /vagrant/vagrant/xxx/klee/lib/Core/Executor.cpp:4261:0
>     #18 0x000055d8639c23f3 main
>     /vagrant/vagrant/xxx/klee/tools/klee/main.cpp:1555:0
>     #19 0x00007fe5c5156b97 __libc_start_main
>     /build/glibc-2ORdQG/glibc-2.27/csu/../csu/libc-start.c:344:0
>     #20 0x000055d8639ce7ea _start (./xxxx/klee+0x6c7ea)
>     Aborted (core dumped)
> 
> 
> Could anyone please explain to me why that assertion failed? Or is it a 
> bug?
> 
> Thanks in advance!
> 
> Best,
> Mingyi
> 
> _______________________________________________
> klee-dev mailing list
> klee-dev at imperial.ac.uk
> https://mailman.ic.ac.uk/mailman/listinfo/klee-dev
> 



More information about the klee-dev mailing list