c – istream的tellg / seekg无法防止堆栈粉碎(g)?
对于我正在编写的程序,我有必要计算文件大小,我使用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&)’中: (当我使用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&)’中: 有趣的是,f3不会触发警告. 解决方法
你可能不会看到
this.
一般的建议是你真的不应该关心,特别是在你的情况下,当你没有分配任何可用于执行缓冲区溢出攻击的内部缓冲区时. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |