我一直遇到堆栈粉碎问题,但是很难找到原因。堆栈崩溃错误仅偶尔发生,并且仅在程序执行的最后发生。当我在gcc中使用'fstack-protector'选项进行编译时,它也完全停止发生。我想知道使用'fstack-protector'选项是否是实际的解决方案,还是只是隐藏了问题?我会发布代码,但是它有3000行,而且我不确定代码的哪一部分负责。
答案 0 :(得分:2)
此选项不会防止堆栈粉碎,而是会检测到它并暂停程序。
在gcc手册页中:
-fstack-protector
发出额外的代码以检查缓冲区溢出,例如堆栈 粉碎攻击。这是通过向其中添加一个保护变量来完成的 易受攻击对象的功能。其中包括的功能 调用“ alloca”,并使用大于8个字节的缓冲区运行。的 输入功能然后检查时会初始化防护 函数退出时。如果防护检查失败,则会显示一条错误消息 打印并退出程序。
您仍然存在溢出问题,但是添加保护变量显然可以掩盖该问题。如果您在valgrind下运行程序,它应该能够检测到正在发生的事情。