6

Ich habe Clang in meinem Rechner (Ubuntu) installiert, um Speicherlecks in meinem C-Code zu finden. Ich schrieb einen Beispielcode, um das Funktionieren der es zu prüfen, welche wie folgt lautet:So finden Sie Speicherverluste mit Clang

/* File: hello.c for leak detection */ 
#include <stdio.h> 
#include <stdlib.h> 

void *x; 

int main() { 
    x = malloc(2); 
    x = 0; // Memory leak 
    return 0; 
} 

ich einige Optionen im Internet gefunden wie

$ scan-build clang --analyze hello.c 

und

$ scan-build clang -fsanitize=address hello.c 

zu kompilieren Aber keine von ihnen zeigt Anzeichen von Speicherverlust.

Scan-build: Mit '/ usr/bin/Klirren' für die statische Analyse
Scan-build: Entfernen Verzeichnis '/ tmp/Scan-build-2015-07-02-122717-16928-1' weil es keine Berichte enthält.
Scan-Build: Keine Fehler gefunden.

Kann jemand freundlich erklären, wie man Clang für Speicherleckdetektion richtig verwendet.

+0

Verwenden Sie [Valgrind] (http://valgrind.org) beim Testen Ihres Programms. Solche Fehler sind im allgemeinen Fall nicht statisch zu finden (einige Tools können jedoch einige Fehler heuristisch oder konservativ finden). Und '-fsanitize = Adresse' fügt * Laufzeitprüfungen * hinzu, so dass Sie das Programm ausführen müssen. –

+0

hast du versucht '$ scan-build clang -fsanitize = adresse -g hallo.c'? –

+0

$ scan-build clang -fsanitize = adresse -g hallo.c ja ich habe versucht –

Antwort

2

Interessanterweise ist das Klirren statische Analysator findet den Speicherverlust, wenn Sie void *x innerhalb main erklären:

int main() { 
    void *x = malloc(2); 
    x = 0; // Memory leak 
    return 0; 
} 

diesen Code Analyse durch Ausführen von:

scan-build clang -g hello.c 

gibt eine Warnung aus, wie:

hello.c:9:3: warning: Potential leak of memory pointed to by 'x' 
    return 0; 
    ^~~~~~~~