gcc的-fstack-protector选项如何防止堆栈粉碎?

时间:2018-06-20 18:58:14

标签: c gcc stack-overflow stack-smash

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

1 个答案:

答案 0 :(得分:2)

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

在gcc手册页中:

  

-fstack-protector

     

发出额外的代码以检查缓冲区溢出,例如堆栈        粉碎攻击。这是通过向其中添加一个保护变量来完成的        易受攻击对象的功能。其中包括的功能        调用“ alloca”,并使用大于8个字节的缓冲区运行。的        输入功能然后检查时会初始化防护        函数退出时。如果防护检查失败,则会显示一条错误消息        打印并退出程序。

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