2016-03-30 35 views
2

I-Code-Analyse verwenden (aka FxCop) auf VS2012 und ich habe ein paar Funktionen der FormEntfernen C6054 Fehler mit scanf-Funktionen

void ReadTable(FILE *fd) 
{ 
    char label[32]; 
    /* ... */ 
    fscanf(fd, "%s", label); 
    /* ... */ 
    if (strcmp(label, "TEST") == 0) 
    { 
     /* ... */ 
    } 
} 

Diese immer warning C6054: String 'label' might not be zero-terminated. werfen ich verstehen, warum dies geschieht, da sie‘ t verwenden SAL-Annotationen, um anzuzeigen, dass die Ausgabe von fscanf Null-terminiert wird, aber die Tatsache bleibt.

Gibt es eine Möglichkeit, diese Warnung loszuwerden (ohne die entsprechende Codeanalyse zu deaktivieren)? Oder ist es etwas, womit ich leben muss, wenn ich scanf verwende?

+0

@ user3121023 ich mit, dass jetzt bin Kompilieren test (es dauert eine Weile), aber selbst wenn das funktioniert, ist es keine wirklich erweiterbare Lösung, besonders wenn es einen Fall gibt, in dem "label" dynamisch zugewiesen wird. – Wasabi

Antwort

2

Wenn scanf fehlschlägt, bleibt der Puffer nicht initialisiert. Der Benutzer kann mehr als 32 Zeichen eingeben, die außerhalb der Grenzen liegen. In beiden Fällen wird der Puffer nicht null-terminiert.

Zuerst initialisieren den Puffer richtig:

char label[32] = { 0 }; 

dann stellen Sie sicher, dass Sie höchstens 31 Zeichen lesen und überprüfen Sie den Rückgabewert des Aufrufs:

const int read = fscanf(fd , "%31s" , label); 
if(read <= 0) 
{ 
    //didn't read anything, check feof and ferror 
}