Frage

Für ein Programm, das ich schreibe, ist es für mich nützlich, Dateigrößen zu berechnen, die ich durch die Verwendung von iSstreams TellG- und Seekg -Funktionen berechnet, aber dies führt zu einer Warnung nach -Wstack -Protector. Der folgende Code reproduziert das "Problem":

#include <iostream>

std::streamsize get_file_size(std::ifstream& ifs) { // line 12 (in warning, below)
  const std::streamsize start = ifs.tellg();
  ifs.seekg(0,std::ios::end);
  const std::streamsize end = ifs.tellg();
  ifs.seekg(start);
  return (end-start);
}

G ++ (Flaggen: -Fstack-Protektor -Wstack-Protektor, Compiler -Version: 4.4.3 (Ubuntu 4.4.3-4ubuntu5), System: Ubuntu 10.04 x86_64) gibt die Warnung:

F.cc: In der Funktion 'std :: streamSize get_file_size (std :: ifstream &)':
F.cc:12: Warnung: Nicht schützen Funktion: Kein Puffer mindestens 8 Bytes lang

(Ich bekomme die gleichen Ergebnisse, wenn ich GCC 4.5.2 verwende, direkt von GNU heruntergeladen und zusammengestellt wurde.)

Ist dies erwartet, wie Stack Smashing Protection (im Allgemeinen oder von GCC) funktioniert und/oder wie ifstream und suchg/Tellg funktionieren? Wenn ja, kann diese Warnung nicht ignoriert werden oder gibt es etwas Besseres, was ich tun kann?

Bearbeiten:

Tatsächlich ist ein Teil des obigen Codes überflüssig. Nur um zu klären, was los ist:

#include <iostream>

void f1(std::ifstream& ifs) { // line 6
    ifs.tellg();
}

void f2(std::ifstream& ifs) { // line 10
    // call seekg(std::streampos)
    ifs.seekg(0);
}

void f3(std::ifstream& ifs) {
    // call seekg(std::streamoff, std::ios_base::seekdir)
    ifs.seekg(0,std::ios::beg);
}

führt zu G ++ (gleiche Spezifikationen wie oben) Warnung:

Main.cc: In der Funktion 'void f1 (std :: ifstream &)':
Main.cc:6: Warnung: Nicht schützende Funktion: Kein Puffer mindestens 8 Bytes lang
Main.cc: In der Funktion 'void f2 (std :: ifstream &)':
Main.cc:10: Warnung: Nicht schützen Funktion: Kein Puffer mindestens 8 Bytes lang

Interessant, f3 löst keine Warnung aus.

War es hilfreich?

Lösung

Sie könnten nicht sehen Dies.

Und der allgemeine Rat ist Sie sollten es wirklich egal sein, Insbesondere in Ihrem Fall, wenn Sie keine internen Puffer zuordnen, mit denen Pufferüberlaufangriffe durchgeführt werden können.

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