AddressSanitizer (ASAN) unter Debian/GCC ohne Output



  • Hi, wie immer muss unter Linux alles in unendliches rumgefrickel ausarten. Diesmal versuche ich den AdressSanitizer ASAN von LLVM mit GCC unter Visual Studio Code (vscode) ans Laufen zu bekommen. Folgendes habe ich bereits versucht:

    MakeFile Auszug:

    add_definitions("-std=c++11")
    #add_definitions("-lstdc++_s")
    add_definitions("-D__GXX_EXPERIMENTAL_CXX0X__")
    add_definitions("-D__cplusplus=201103L")
    add_definitions("-DNDEBUG")
    add_definitions("-O3")
    add_definitions("-Wall")
    add_definitions("-c")
    add_definitions("-g3")
    add_definitions("-s")
    add_definitions("-fmessage-length=0")
    add_definitions("-m64")
    add_definitions("-fPIC")
    add_definitions("-lasan")
    #add_definitions("-llsan")
    add_definitions("-fsanitize=address")
    add_definitions("-fno-omit-frame-pointer")
    
    set(CMAKE_BUILD_TYPE "Debug")
    
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lGL -lGLU -lX11 -lasan -fsanitize=address -fno-omit-frame-pointer")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lGL -lGLU -lX11 -lasan -fsanitize=address -fno-omit-frame-pointer") 
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lGL -lGLU -lX11 -lasan -fsanitize=address -fno-omit-frame-pointer")
    

    Ich weiß, etwas chaotisch, aber viel hilft viel :)...

    Habe die Variablen

    export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.5
    export ASAN_OPTIONS=symbolize=1
    

    angelegt und mit

    echo $ASAN_SYMBOLIZER_PATH
    echo $ASAN_OPTIONS
    

    zur Verifikation ausgeben lassen. Mich vergewissert, dass die "llvm-symbolizer-3.5" Datei auch existiert, sowie zusätzlich noch eine Verknüpfung auf "llvm-symbolizer" angelegt.

    Mich mit

    ldd ./TestApplication
    

    vergewissert dass auch die lsan.so im Executable verlinkt wurde.

    Aktuelles Debian mit GCC 4.9.2 sowie über apt-get LLVM/clang installiert.

    Ich bekomme allerdings überhaupt keine output vom ASAN. Nichts.

    Aufrufen tue ich das Programm mit

    $ ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.5 ASAN_OPTIONS=symbolize=1 ./MyTestApplication
    

    Einen memory leak habe ich auch eingebaut.

    int main()
    {
    	setvbuf(stdout, NULL, _IONBF, 0);
    	setvbuf(stderr, NULL, _IONBF, 0);
    
    	int* value = new int(42);
    
    	printf(_T("Value: %d\n"), *value);
    
    	printf(_T("Hello World.\n"));
    	std::cin.get();
    	return 0;
    }
    


  • Jemand eine Idee warum es nicht funktioniert?



  • Aktuelles Debian

    Hat es leider nie gegeben. Wir sind aktuell bei gcc 7.1 und clang 4.0.

    Installiere ein Ubuntu oder eine andere vernünftige Distribution mit halbwegs aktueller Software und dann funktioniert es auch. Zu Zeiten von gcc 4.9 war die Technik bestenfalls im frühen Alpha-Stadium, voller Fehler und für praktische Zwecke untauglich. Unfug wie llvm-symbolizer ist inzwischen auch nicht mehr nötig.



  • ;torstein schrieb:

    Aktuelles Debian

    Hat es leider nie gegeben. Wir sind aktuell bei gcc 7.1 und clang 4.0.
    nötig.

    Der war gut :D. Finde die Politik von Debian auch schwachsinnig. Überlege seit längerem zu Fedora zu wechseln. Aber das ist ein anderes Thema...

    Habe es jetzt trotzdem ans Laufen bekommen. Falls es jemanden interessiert. Meine cmake Einstellungen (Sorry, bin kein cmake Experte):

    add_definitions("-std=c++14")
    add_definitions("-DNDEBUG")
    add_definitions("-Wall")
    add_definitions("-c")
    add_definitions("-s")
    add_definitions("-fmessage-length=0")
    add_definitions("-m64")
    add_definitions("-fPIC")
    
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lGL -lGLU -lX11 -fsanitize=leak -O3 -fno-omit-frame-pointer -g3")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lGL -lGLU -lX11 -fsanitize=leak -O3 -fno-omit-frame-pointer -g3")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lGL -lGLU -lX11 -fsanitize=leak -O3 -fno-omit-frame-pointer -g3")
    

    Der entscheidende Punkt war aber, dass ich mit

    -fsanitize=address
    

    kompiliert hatte. Der Sanitizer gibt aber nur Outputmeldungen aus wenn auch ein Fehler gefunden wird 🙄. Daher wurde im obigen Fall keine Output ausgegeben da auf keine falsche Adresse zugegriffen wurde. Ich hätte mit

    -fsanitize=leak
    

    kompilieren müssen :). Man hätte ja mal wenigstens eine Log Message "LeakSanitizer: No leaks found" oder sowas ausgeben können. Hat mich am Ende einen Abend gekostet das rauszufinden...