Frage

Die statische Analyse-Tool wir C-Code ähnlich dem folgenden als kritische Pufferüberlauf nutzen wird markieren.

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);

Die Fehlermeldung des Werkzeugs ist: Pufferüberlauf (Array-Index Out of Bounds). Das Feld 'buf' Größe ist 1. Array 'buf' 0..64 Index, der die verwenden

Ist das legitim? Ist die Zuordnung des Zeichenfeldes auf die leere Zeichenfolge wirklich in seiner Länge führen zu einem einzigen Byte reduziert wurde, als ob er als char buf [] = ""; definiert wurde?

War es hilfreich?

Lösung

Zuordnung „“ zu buf [size + 1] zurückgesetzt nicht die Größe von buf, aber es ist sinnlos, weil es einen kleinen Teil dupliziert, was die nachfolgende Memset tut (und es verwirrt Ihre statische Analyse-Tool - Sie könnte will einen Fehlerbericht dagegen Datei).

Andere Tipps

Abgesehen von der Tatsache, dass char buf [size + 1] wird nicht kompiliert, da Größe ein Laufzeitwert ist, vorausgesetzt, Sie buf als Größe 65 Array bauen könnte, dann memset (buf, 0, 65) wäre ein nicht Überlauf.

Odds sind Ihr Werkzeug durch Ihre syntaktischen Probleme verwechselt wird.

[Edit: Weitere Informationen]

Auf der Grundlage von Kommentaren zu meiner ursprünglichen Post, schlage ich vor, wie folgt vor:

#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);

Ich glaube, Rob Kennedy ist richtig; Ihr Werkzeug wird mit dem leeren String initializer Wert wie die Array-Größe eher als die statischen Array-Deklaration.

Es ist kein Pufferüberlauf.

Dies ist wahrscheinlich ein sauberer Weg, es zu tun. Sicherlich dauert es weniger Zeilen Code.

#define size 64
char buf[size + 1] = {0};

Es ist legal - der Puffer groß genug ist. Das Tool warnt Sie, dass size_t als int größer sein könnte und versuchen, es zu verwenden, wie Indexer zu unvorhersehbaren Ergebnissen führen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top