c – istream的tellgseekg无法防止堆栈粉碎(g)?

c – istream的tellgseekg无法防止堆栈粉碎(g)?,第1张

概述对于我正在编写的程序,我有必要计算文件大小,我使用iostream的tellg和seekg函数计算,但这会导致-Wstack-protector发出警告.以下代码重现了“问题”: #include <iostream>std::streamsize get_file_size(std::ifstream& ifs) { // line 12 (in warning, below) cons 对于我正在编写的程序,我有必要计算文件大小,我使用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&)’中:
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)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1225384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存