我正在学习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无法检测到此错误?提前谢谢!
答案 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支持 MemorySanitizer,AddressSanitizer UndefinedBehaviorSanitizer。它们在projects / compiler-rt / lib目录中定义。 MemorySanitizer是您正在寻找的,它是未初始化读取的检测器。
您可以删除KLEE函数调用并直接检查clang。
UIApplication.sharedApplication().applicationIconBadgeNumber = 0