4 Stimmen

istream's tellg/seekg kann nicht vor Stack Smashing geschützt werden (g++)?

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.

1voto

Yippie-Ki-Yay Punkte 21200

Sie möchten vielleicht Folgendes sehen dies.

Und der allgemeine Rat lautet es sollte Sie wirklich nicht interessieren Dies gilt insbesondere in Ihrem Fall, wenn Sie keine internen Puffer zuweisen, die für einen Pufferüberlauf-Angriff verwendet werden können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X