KLEE没有找到未初始化的变量错误

时间:2017-01-17 12:31:30

标签: klee

我正在学习KLEE,我写了一个简单的代码:

#include "klee/klee.h"
#include <stdio.h>
#include <stdlib.h>

int test(int *p)
{
    int *q = (int *) malloc(sizeof(int));

    if ((*p) == (*q)) {
       printf("reading uninitialized heap memory");
    }
    return 0;
}


int main()
{
    int *p = (int *) malloc(sizeof(int));
    test(p);
    return 0;
}

首先,我生成LLVM bitcode,然后执行KLEE到bitcode。 以下是所有输出:

KLEE: output directory is "/Users/yjy/WorkSpace/Test/klee-out-13"
Using STP solver backend
KLEE: WARNING: undefined reference to function: printf
KLEE: WARNING ONCE: calling external: printf(140351601907424)
reading uninitialized heap memory
KLEE: done: total instructions = 61
KLEE: done: completed paths = 4
KLEE: done: generated tests = 4

我想KLEE应该给我一个q指针未初始化的错误,但它没有。为什么KLEE不会给我一个错误或警告? KLEE无法检测到此错误?提前谢谢!

1 个答案:

答案 0 :(得分:1)

TLTR :KLEE尚未实现此功能。 Clang可以直接检查这个。

KLEE目前支持add / sub / mul / div溢出检查。要使用此功能,必须使用clang -fsanitize = signed-integer-overflow或clang -fsanitize = unsigned-integer-overflow编译源代码。

这个想法是当你使用clang清理器时,函数调用被插入到字节码中(例如__ubsan_handle_add_overflow)。然后,KLEE将在遇到函数调用后处理溢出检查。

Clang支持  MemorySanitizerAddressSanitizer UndefinedBehaviorSanitizer。它们在projects / compiler-rt / lib目录中定义。 MemorySanitizer是您正在寻找的,它是未初始化读取的检测器。

您可以删除KLEE函数调用并直接检查clang。

UIApplication.sharedApplication().applicationIconBadgeNumber = 0