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

最佳答案

此选项不阻止堆栈崩溃,而是检测并停止程序。
从gcc手册页:
-fstack保护器
发出额外的代码来检查缓冲区溢出,如堆栈
粉碎性攻击。这是通过在
具有易受攻击对象的函数。这包括
调用“alloca”,并使用缓冲区大于8字节的函数。这个
当一个函数被输入并被检查时,防护被初始化
当函数退出时。如果保护检查失败,将显示一条错误消息
打印出来,程序退出。
您仍然有一个溢出问题,但是添加保护变量显然掩盖了这个问题。如果您在valgrind下运行程序,它应该能够检测到发生了什么。

10-06 01:01