Here comes the output
main.cpp
#include <QDebug> #include <QLibrary> int main(int, char **) { QLibrary l("libshared"); qDebug() << l.load(); return 0; }shared.cpp
#include "shared.h" static Foo f; Foo::Foo() { int *a = 0; *a = 33; }shared.h
class Foo { public: Foo(); };
export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.4 export ASAN_OPTIONS=symbolize=1 g++ -shared -o libshared.so shared.cpp -g3 -fPIC g++ -fsanitize=address main.cpp -g3 -I /usr/include/qt4/QtCore/ \ -I /usr/include/qt4/ -lQtCoreAnd then we run it!
$ LD_LIBRARY_PATH=. ./a.out ASAN:SIGSEGV ================================================================= ==7048== ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x7f199c1326aa sp 0x7fff37e557c0 bp 0x7fff37e557c0 T0) AddressSanitizer can not provide additional info. #0 0x7f199c1326a9 in Foo::Foo() /home/tsdgeos/test/shared.cpp:8 #1 0x7f199c1326da in __static_initialization_and_destruction_0(int, int) /home/tsdgeos/test/shared.cpp:3 #2 0x7f199c1326ef in _GLOBAL__sub_I_shared.cpp /home/tsdgeos/test/shared.cpp:9 #3 0x7f19a132b139 (/lib64/ld-linux-x86-64.so.2+0x10139) #4 0x7f19a132b222 (/lib64/ld-linux-x86-64.so.2+0x10222) #5 0x7f19a132fc6f (/lib64/ld-linux-x86-64.so.2+0x14c6f) #6 0x7f19a132aff3 (/lib64/ld-linux-x86-64.so.2+0xfff3) #7 0x7f19a132f3ba (/lib64/ld-linux-x86-64.so.2+0x143ba) #8 0x7f199d1a602a (/lib/x86_64-linux-gnu/libdl.so.2+0x102a) #9 0x7f19a132aff3 (/lib64/ld-linux-x86-64.so.2+0xfff3) #10 0x7f199d1a662c (/lib/x86_64-linux-gnu/libdl.so.2+0x162c) #11 0x7f199d1a60c0 (/lib/x86_64-linux-gnu/libdl.so.2+0x10c0) #12 0x7f199e0156b7 (/usr/lib/x86_64-linux-gnu/libQtCore.so.4+0x16e6b7) #13 0x7f199e010599 (/usr/lib/x86_64-linux-gnu/libQtCore.so.4+0x169599) #14 0x4011c0 in main /home/tsdgeos/test/main.cpp:8 #15 0x7f199d5e8ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) #16 0x401078 in _start (/home/tsdgeos/test/a.out+0x401078) SUMMARY: AddressSanitizer: SEGV /home/tsdgeos/test/shared.cpp:8 Foo::Foo() ==7048== ABORTING
So it seems that "plugins are just libraries" applies here :)
Thanks Albert :)
ReplyDeleteYou apply ASAN to a clear NULL pointer dereference leading to a segmentation fault. This is something that the catchsegv command handled for years.
ReplyDeleteWouldn't a more realistic test be:
Foo::Foo()
{
int a[1];
a[2] = 3;
}
In case you link to the library you have stack corruption. In case you compile the library with ASAN you will get the ASAN warning?
You are right, need to compile the library with ASAN in that case to catch that, otherwise it won't work.
ReplyDeleteUpdated at http://tsdgeos.blogspot.com/2014/03/asan-and-libraries-2nd-part.html
ReplyDeleteJust used this to get some stuff fixed, thanks :)!
ReplyDelete