istream的tellg / seekg无法防止堆栈粉碎(g ++)?

时间:2011-02-01 15:34:29

标签: c++ g++ istream ssp

对于我正在编写的程序,对我来说计算文件大小很有用,我通过使用iostream的tellg和seekg函数来计算,但这会导致-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 ++(flags: -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&amp;)'中: f.cc:12:警告:不保护功能:没有至少8字节的缓冲区

(当我使用GCC 4.5.2时,我得到了相同的结果,直接从GNU下载和编译。)

这是预期堆栈粉碎保护的工作方式(通常还是GCC)和/或ifstream和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&amp;)'中:
main.cc:6:警告:不保护功能:无缓冲区至少8字节长 main.cc:在函数'void f2(std :: ifstream&amp;)'中:
main.cc:10:警告:不保护功能:无缓冲区至少8字节长

有趣的是,f3不会触发警告。

1 个答案:

答案 0 :(得分:1)

您可能不会看到this.

一般的建议是 你真的不应该关心 ,特别是在你没有分配任何可用于执行缓冲区的内部缓冲区的情况下溢出攻击。