Как можно использовать I Address Sanitizer в lli (LLVM) - PullRequest
0 голосов
/ 12 января 2019

Я хотел бы запустить битовый код с аргументом адресного дезинфицирующего средства, но у меня есть проблема с этим, если я его запусту, произойдет ошибка сегментации.

$cat sample.c
#include <stdlib.h>
void *p;
int main() {
  p = malloc(7);
  return 0;
}

$clang -emit-llvm -fsanitize=address -c -g sample.c

$lli sample.bc
Stack dump:
0.  Program arguments: lli sample.bc
0  lli                      0x000000010c112d9c llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37
1  lli                      0x000000010c11319e SignalHandler(int) + 192
2  libsystem_platform.dylib 0x00007fff603e2b3d _sigtramp + 29
3  libsystem_platform.dylib 000000000000000000 _sigtramp + 2680280288
4  lli                      0x000000010be3ff74 llvm::ExecutionEngine::runStaticConstructorsDestructors(llvm::Module&, bool) + 310
5  lli                      0x000000010beac842 llvm::MCJIT::runStaticConstructorsDestructors(bool) + 388
6  lli                      0x000000010bb715c6 main + 8866
7  libdyld.dylib            0x00007fff601f7ed9 start + 1
Segmentation fault: 11

1 Ответ

0 голосов
/ 13 января 2019

Дезинфицированный код требует специальной поддержки времени выполнения, которая реализована в библиотеке времени выполнения Asan. lli не загружает эту библиотеку по умолчанию (поскольку пользователям обычно она не нужна), поэтому вам нужно явно запросить ее через LD_PRELOAD=libasan.so.VER. Примечание libasan.so - это соглашение GCC, для Clang вам может понадобиться что-то вроде libclang_rt.asan.XXX.

...