ich einen „Bug“ in meinem Code (die einzigen ;-) gefunden, die dadurch ausgelöst wird, und dass durch -Wall
nicht erkannt wird. Ich habe es auf die folgenden
struct elem {
struct elem *prev;
struct elem *next;
};
#define ELEM_INITIALIZER(NAME) { .prev = &(NAME), .next = &(NAME), }
struct head {
struct elem header;
};
#define HEAD_INITIALIZER(NAME) { .header = ELEM_INITIALIZER(NAME.header) }
int main(int argc, char ** argv) {
struct head myhead = HEAD_INITIALIZER(myhead);
}
gekocht Dies ist eine relativ einfache Implementierung einer verketteten Liste, aber das ist hier nicht wichtig. Die Variable myhead
wird in einer üblichen Anwendung des Ausdrucks nicht verwendet, aber für den Compiler wird sie verwendet, da innerhalb des Initialisierers die Adresse eines Feldes genommen wird.
clang
analysiert korrekt diese als
/tmp 11:58 <722>% clang --analyze test-clang.c
test-clang.c:25:15: warning: Value stored to 'myhead' during its initialization is never read
struct head myhead = HEAD_INITIALIZER(myhead);
^ ~~~~~~~~~~~~~~~~~~~~~~~~
1 diagnostic generated.
Edit: Dies wird nicht erkannt von gcc
, open64
oder clang
mit -Wall
, sondern erkennt ich ein anderes gefunden, die auch Stapelspeicher Proliferations
char const* myBuggyFunction(void) {
return (char[len + 1]){ 0 };
}
clang
mit --analyze
.
Macht den Job, danke :) Ich muss sagen, ich kam mit den offensichtlichsten und kreativsten blutigen Speicherlecks, die ich mir ausdenken konnte, und ließ sie alle passieren. Offensichtlich weiß es genug zu wissen, dass ich es getestet habe. – detly
@detly: hat Spaß gemacht, gelernt, klingelt es :) für meine Neugier was sind Lecks in einem Kontext der statischen Analyse? –
Nun, ich bin nicht 100% sicher, aber ich hatte den Eindruck, dass viele statische Analyse-Tools, einschließlich Clang, potentielle Laufzeitspeicherprobleme erkennen können (zB 'p = malloc (...); p = q;') . Da könnte ich mich irren. – detly