#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&)’中:
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&)’中:
main.cc:6:警告:没有保护功能:没有缓冲区至少8个字节长
main.cc:在函数’voID f2(std :: ifstream&)’中:
main.cc:10:警告:没有保护功能:没有缓冲区至少8个字节长
有趣的是,f3不会触发警告.
解决方法 你可能不会看到 this.一般的建议是你真的不应该关心,特别是在你的情况下,当你没有分配任何可用于执行缓冲区溢出攻击的内部缓冲区时.
总结以上是内存溢出为你收集整理的c – istream的tellg / seekg无法防止堆栈粉碎(g)?全部内容,希望文章能够帮你解决c – istream的tellg / seekg无法防止堆栈粉碎(g)?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)