加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:55:35 所属栏目:百科 来源:网络整理
导读:对于我正在编写的程序,我有必要计算文件大小,我使用iostream的tellg和seekg函数计算,但这会导致-Wstack-protector发出警告.以下代码重现了“问题”: #include iostreamstd::streamsize get_file_size(std::ifstream ifs) { // line 12 (in warning,below) c
对于我正在编写的程序,我有必要计算文件大小,我使用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.

一般的建议是你真的不应该关心,特别是在你的情况下,当你没有分配任何可用于执行缓冲区溢出攻击的内部缓冲区时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读