Für ein Programm, das ich schreibe, ist es nützlich, die Dateigrößen zu berechnen, was ich mit den Funktionen tellg und seekg von iostream mache, aber das führt zu einer Warnung von -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++ (Flags: -fstack-protector -Wstack-protector , Compiler-Version: 4.4.3 (Ubuntu 4.4.3-4ubuntu5) , System: Ubuntu 10.04 x86_64 ) gibt die Warnung aus:
f.cc: In Funktion 'std::streamsize get_file_size(std::ifstream&)':
f.cc:12: warning: not protecting function: no buffer at least 8 bytes long
(Ich erhalte die gleichen Ergebnisse, wenn ich GCC 4.5.2 verwende, heruntergeladen und kompiliert von GNU direkt).
Wird dies erwartet, wie Stack Smashing Schutz funktioniert (im Allgemeinen oder von GCC) und/oder wie ifstream und seekg/tellg arbeiten? Wenn ja, kann diese Warnung nicht ignoriert werden oder gibt es etwas Besseres, was ich tun kann?
編集 :
Eigentlich ist ein Teil des obigen Codes überflüssig. Nur um zu verdeutlichen, was hier vor sich geht:
#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 einer Warnung von g++ (dieselben Spezifikationen wie oben):
main.cc: In der Funktion 'void f1(std::ifstream&)':
main.cc:6: warning: not protecting function: no buffer at least 8 bytes long
main.cc: In Funktion 'void f2(std::ifstream&)':
main.cc:10: warning: not protecting function: no buffer at least 8 bytes long
Interessanterweise, f3
löst keine Warnung aus.