C++ istream';s tellg/seekg无法防止堆栈崩溃(g+;+;)?

C++ istream';s tellg/seekg无法防止堆栈崩溃(g+;+;)?,c++,g++,istream,ssp,C++,G++,Istream,Ssp,对于我正在编写的程序,计算文件大小对我很有用,我使用iostream的tellg和seekg函数计算文件大小,但这会导致-Wstack-protector发出警告。以下代码再现了“问题”: #包括 std::streamsize get_file_size(std::ifstream&ifs){//第12行(在下面的警告中) const std::streamsize start=ifs.tellg(); ifs.seekg(0,标准::ios::结束); const std::streamsi

对于我正在编写的程序,计算文件大小对我很有用,我使用iostream的tellg和seekg函数计算文件大小,但这会导致-Wstack-protector发出警告。以下代码再现了“问题”:

#包括
std::streamsize get_file_size(std::ifstream&ifs){//第12行(在下面的警告中)
const std::streamsize start=ifs.tellg();
ifs.seekg(0,标准::ios::结束);
const std::streamsize end=ifs.tellg();
如果seekg(启动);
返回(结束-开始);
}
g++(标志:-fstack-protector-Wstack-protector,编译器版本:4.4.3(Ubuntu 4.4.3-4ubuntu5),系统:Ubuntu 10.04 x8664)给出警告:

f、 抄送:在函数“std::streamsize get_file_size(std::ifstream&)”中:
f、 cc:12:警告:没有保护功能:没有至少8字节长的缓冲区

(当我使用GCC4.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);
}
#包括
void f1(标准::ifstream和ifs){//第6行
如果s.tellg();
}
空f2(标准::ifstream和ifs){//第10行
//呼叫seekg(标准::streampos)
如果seekg(0);
}
无效f3(标准::ifstream和ifs){
//调用seekg(std::streamoff,std::ios_base::seekdir)
如果seekg(0,标准::ios::beg);
}
导致g++(与上述规格相同)警告:

main.cc:在函数“void f1(std::ifstream&)”中:
main.cc:6:警告:未保护功能:没有至少8字节长的缓冲区
main.cc:在函数“void f2(std::ifstream&)”中:
main.cc:10:警告:没有保护功能:没有至少8字节长的缓冲区

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

您可能不想看到


一般的建议是,您真的不应该在意,尤其是在您的情况下,当您没有分配任何可用于执行缓冲区溢出攻击的内部缓冲区时。

感谢您的链接(尽管我认为是阅读了该页,才导致我在程序构建中包含-Wstack protector!)。我没有在
get\u file\u size
中放置任何可以利用的缓冲区,这就是我提出这个问题的原因:为什么会出现警告?即使我可以在实践中忽略它,为了我的利益,我还是更愿意了解正在发生的事情。@Zorawar嗯,我不太擅长实用的缓冲区溢出技术,因此,我想我们必须等待一位具有特定技能的人来解释如何利用这一点)也许我应该通过提及我在一个名为“NSA项目X类人语言翻译”的文件中找到代码来促进参与?(开玩笑的NSA!是军情六处发来的…)
#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);
}