1

我遇到了一个堆栈粉碎问题,我很难找到原因。堆栈粉碎错误只是偶尔发生,并且仅在程序执行结束时发生。当我使用带有 gcc 的 'fstack-protector' 选项编译它时,它也完全停止发生。我想知道使用“fstack-protector”选项是否是一个实际的解决方案,或者我只是在隐藏问题?我会发布代码,但它有 3000 行长,我不确定代码的哪一部分负责。

4

1 回答 1

2

此选项不会阻止堆栈粉碎,而是检测它并停止程序。

从 gcc 手册页:

-fstack-保护器

发出额外的代码来检查缓冲区溢出,例如堆栈粉碎攻击。这是通过将保护变量添加到具有易受攻击对象的函数来完成的。这包括调用“alloca”的函数,以及缓冲区大于 8 字节的函数。进入函数时初始化守卫,然后在函数退出时检查。如果保护检查失败,则会打印一条错误消息并退出程序。

您仍然有溢出问题,但添加保护变量显然掩盖了这个问题。如果您在valgrind下运行程序,它应该能够检测到正在发生的事情。

于 2018-06-20T19:21:32.523 回答