Tellg / seekg istream не может быть защищен от разрушения стека (g ++)? - PullRequest
4 голосов
/ 01 февраля 2011

Для программы, которую я пишу, мне полезно рассчитать размеры файлов, которые я вычисляю, используя функции tellg и seekg iostream, но это приводит к предупреждению -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 :: streamsize get_file_size (std :: ifstream &) ’:
f.cc:12: предупреждение: не защищающая функция: нет буфера длиной не менее 8 байт

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

Ожидается ли это от того, как работает защита от разбиения стека (в целом или GCC) и / или как работают streamstream и seekg / 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 не вызывает предупреждение.

1 Ответ

1 голос
/ 01 февраля 2011

Возможно, вы не захотите видеть этого.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...