Tellg/seekg istream не может быть защищен от разрушения стека (g++)?
Для программы, которую я пишу, мне полезно вычислять размеры файлов, которые я вычисляю, используя функции 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) и / или как работают stream и 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 ответ
Возможно, вы не захотите это видеть .
И общий совет: вас это действительно не должно волновать, особенно в вашем случае, когда вы не выделяете никаких внутренних буферов, которые можно использовать для выполнения атаки переполнения буфера.