istream est tellg / seekg ne peut pas être protégé contre écrasement de la pile (g ++)?

StackOverflow https://stackoverflow.com/questions/4864503

  •  27-10-2019
  •  | 
  •  

Question

Pour un programme que je vous écris, il est utile pour moi de calculer la taille des fichiers, que je calcule en utilisant des fonctions de tellg de iostream et seekg, mais cela conduit à un avertissement par -Wstack-protecteur. Le code suivant reproduit le "problème":

#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 ++ (drapeaux: -fstack-protecteur -Wstack-protecteur , la version du compilateur: 4.4.3 (Ubuntu 4.4.3-4ubuntu5) , système: Ubuntu 10.04 x86_64 ) donne l'avertissement:

f.cc: En fonction « std :: streamsize get_file_size (std :: ifstream &) »:
f.cc:12: avertissement: ne pas protéger la fonction: pas de tampon au moins 8 octets

(je reçois les mêmes résultats lorsque j'utilise GCC 4.5.2, téléchargé et compilé de GNU directement.)

Est-ce attendu de la façon dont fonctionne la protection fracassant de la pile (en général ou par GCC) et / ou comment ifstream et seekg / tellg travail? Si oui, ne peut pas cet avertissement est ignoré ou est-il quelque chose de mieux que je peux faire?

Modifier :

En fait, une partie du code ci-dessus est redondant. Juste pour préciser ce qui se passe:

#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);
}

conduit à g ++ (mêmes caractéristiques que ci-dessus) avertissement:

main.cc: En fonction « vide f1 (std :: ifstream &) »:
main.cc:6: avertissement: ne pas protéger la fonction: pas de tampon au moins 8 octets
main.cc: En fonction « f2 void (std :: ifstream &) »:
main.cc:10: avertissement: ne pas protéger la fonction: pas de tampon au moins 8 octets

Il est intéressant de f3 ne déclenche pas un avertissement.

Était-ce utile?

La solution

Vous pourriez wan't voir ce .

Le conseil général est vous devriez vraiment pas soin , en particulier dans votre cas, lorsque vous n'allouez pas de tampons internes qui peuvent être utilisés pour effectuer tampon attaque trop-plein.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top