Pregunta

Para un programa que estoy escribiendo, es útil para mí calcular los tamaños de los archivos, que calculo utilizando las funciones de IOSTream TellG y Seekg, pero esto lleva a una advertencia de -Wstack -Protector. El siguiente código reproduce el "problema":

#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 ++ (banderas: -Fstack-Protector -Wstack-Protector, versión del compilador: 4.4.3 (Ubuntu 4.4.3-4ubuntu5), sistema: Ubuntu 10.04 x86_64) da la advertencia:

F.CC: en funciones 'std :: streamsize get_file_size (std :: ifstream &)':
F.CC:12: ADVERTENCIA: No proteger la función: no hay amortiguación al menos 8 bytes de largo

(Obtengo los mismos resultados cuando uso GCC 4.5.2, descargado y compilado de GNU directamente).

¿Es esto esperado de cómo funciona la protección de la batería de pila (en general o por GCC) y/o cómo funcionan si el ifStream y Seekg/Tellg? Si es así, ¿no se puede ignorar esta advertencia o hay algo mejor que pueda hacer?

Editar:

En realidad, parte del código anterior es redundante. Solo para aclarar lo que está pasando:

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

conduce a G ++ (las mismas especificaciones que anteriormente) Advertencia:

main.cc: en función 'void f1 (std :: ifstream &)':
main.cc:6: Advertencia: no proteger la función: no hay amortiguador al menos 8 bytes de largo
main.cc: en función 'void f2 (std :: ifstream &)':
main.cc:10: Advertencia: no proteger la función: no hay amortiguación al menos 8 bytes de largo

Curiosamente, f3 no desencadena una advertencia.

¿Fue útil?

Solución

Es posible que no vea ver este.

Y el consejo general es Realmente no debería importarte, especialmente en su caso, cuando no asigna ningún amortiguador interno que pueda usarse para realizar un ataque de desbordamiento de buffer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top