Istream Tellg/SEECKG не может быть защищен от разбивания стека (G ++)?

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

  •  27-10-2019
  •  | 
  •  

Вопрос

Для программы, которую я пишу, мне полезно рассчитать размеры файлов, которые я рассчитываю, используя функции iostream tellg и eakeg, но это приводит к предупреждению от -wstack -protector. Следующий код воспроизводит «проблему»:

#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 ++ (флаги: -fstack-protector -wstack-protector, версия компилятора: 4.4.3 (Ubuntu 4.4.3-4ubuntu5), система: Ubuntu 10.04 x86_64) дает предупреждение:

f.cc: в функции 'std :: streamzize get_file_size (std :: ifstream &)':
F.CC:12: Предупреждение: не защищать функцию: без буфера не менее 8 байтов длиной

(Я получаю те же результаты, когда использую GCC 4.5.2, загружен и скомпилирован из GNU напрямую.)

Ожидается ли это от того, как работает защита от разбивания стека (в целом или по GCC) и/или как работают ifstream и seakg/tellg? Если да, то не может быть игнорировано это предупреждение или есть что -то лучшее, что я могу сделать?

Редактировать:

На самом деле, некоторые из приведенных выше кода избыточны. Просто чтобы прояснить, что происходит:

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

приводит к тому, что G ++ (те же спецификации, что и выше), предупреждение:

main.cc: в функции 'void f1 (std :: ifstream &)':
main.cc:6: предупреждение: не защищать функцию: без буфера не менее 8 байтов длиной
main.cc: в функции 'void f2 (std :: ifstream &)':
main.cc:10: предупреждение: не защищать функцию: без буфера не менее 8 байтов длиной

Интересно, f3 не вызывает предупреждения.

Это было полезно?

Решение

Ты не можешь видеть это.

И общий совет Тебе не должно наплевать, Особенно в вашем случае, когда вы не распределяете какие -либо внутренние буферы, которые можно использовать для выполнения атаки переполнения буфера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top