我正在编写一个程序,需要计算文件大小。我使用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++(标志:-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字节长的缓冲区
(当我使用直接从GNU下载和编译的GCC 4.5.2时,我得到相同的结果。)
这是否符合堆栈破坏保护的工作方式(一般或由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&)’ 中:
main.cc:6: 警告:未保护函数:缓冲区长度不足 8 字节
main.cc: 在函数 ‘void f2(std::ifstream&)’ 中:
main.cc:10: 警告:未保护函数:缓冲区长度不足 8 字节
有趣的是,f3
没有触发警告。
get_file_size
中放置可以被利用的缓冲区,这就是我问这个问题的原因:为什么会出现警告?即使我可以在实践中忽略它,但我仍然希望了解发生了什么,以便受益。 - Zorawar