Mi aplicación usa bibliotecas estáticas compiladas con gcc: Boost (C++ 11 lambdas (con función boost bind y boost)) Bullet; bibliotecas compartidas del sistema, como SDL, y una biblioteca compartida compilada con clang. ¿Es posible que tal zoológico arruine AdressSanitizer?
Sí si no están instrumentados:
https://code.google.com/p/address-sanitizer/wiki/AddressSanitizer
Para usar AddressSanitizer, deberá compilar y vincular su programa usando clang con el interruptor -fsanitize=address.
La biblioteca de tiempo de ejecución ASan debe estar presente en su programa, por lo que su ejecutable principal debe estar vinculado con el indicador -fsanitize=dirección. La vinculación de bibliotecas no instrumentadas e instrumentadas juntas puede funcionar, a menos que el código instrumentado se ejecute antes de que se inicialice la biblioteca de tiempo de ejecución (creo que es imposible en Linux en este momento). Tenga en cuenta que AddressSanitizer no podrá encontrar problemas de direccionamiento en el código que no haya sido instrumentado por Clang.
Los desinfectantes Clang se pueden usar de la siguiente manera
Descargue la cadena de herramientas clang desde aquí http://releases.llvm.org/download.html
$ wget http://releases.llvm.org/9.0.0/clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz $ tar -Jxvf clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz $ CLANG=$PWD/clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-16.04programa de muestra
$ cat hello.c #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int *a = (int *) malloc(sizeof(int)*2); int n = atoi(argv[1]); a[n] = 10; return 0; }Compile el programa con desinfectante de direcciones
$ $CLANG/bin/clang -O0 -g -fno-omit-frame-pointer -fsanitize=address -o hello hello.cCorrer
$ ASAN_SYMBOLIZER_PATH=$CLANG/bin/llvm-symbolizer ./hello 12 ================================================================= ==48489==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000040 at pc 0x0000004c2981 bp 0x7ffe3f888c30 sp 0x7ffe3f888c28 WRITE of size 4 at 0x602000000040 thread T0 #0 0x4c2980 in main /b/syrajendra/clang-libs/hello.c:8:8 #1 0x7f0349c3a82f in __libc_start_main /build/glibc-Cl5G7W/glibc- 2.23/csu/../csu/libc-start.c:291 #2 0x41b2f8 in _start (/b/syrajendra/clang-libs/hello+0x41b2f8) Address 0x602000000040 is a wild pointer. SUMMARY: AddressSanitizer: heap-buffer-overflow /b/syrajendra/clang- libs/hello.c:8:8 in main Shadow bytes around the buggy address: 0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =>0x0c047fff8000: fa fa 00 fa fa fa fa fa[fa]fa fa fa fa fa fa fa 0x0c047fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb Shadow gap: cc ==48489==ABORTING