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, а затем выполняю KLEE для битового кода. Следующее - все выходные данные:

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 ответ

TLTR: KLEE не реализовал эту функцию. Clang может проверить это напрямую.

В настоящее время KLEE поддерживает проверку переполнения add/sub/mul/div. Чтобы использовать эту функцию, вы должны скомпилировать исходный код с помощью clang -fsanitize=signature-integer-overflow или clang -fsanitize=unsigned-integer-overflow .

Идея заключается в том, что вызов функции вставляется в байт-код (например, __ubsan_handle_add_overflow), когда вы используете дезинфицирующее средство clang. Затем KLEE обработает проверку переполнения, как только встретит вызов функции.

Clang поддержка MemorySanitizer, AddressSanitizer https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html. Они определены в каталоге projects/compiler-rt/lib. MemorySanitizer - это то, что вы ищете, это детектор неинициализированных операций чтения.

Вы можете удалить вызов функции KLEE и проверить с помощью clang напрямую.

➜  ~ clang -g -fsanitize=memory st.cpp
➜  ~ ./a.out
==16031==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x490954  (/home/hailin/a.out+0x490954)
    #1 0x7f21b72f382f  (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    #2 0x41a1d8  (/home/hailin/a.out+0x41a1d8)

SUMMARY: MemorySanitizer: use-of-uninitialized-value (/home/hailin/a.out+0x490954)
Exiting
Другие вопросы по тегам