Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc';s-fstack保护器选项防止堆叠损坏?_C_Gcc_Stack Overflow_Stack Smash - Fatal编程技术网

gcc';s-fstack保护器选项防止堆叠损坏?

gcc';s-fstack保护器选项防止堆叠损坏?,c,gcc,stack-overflow,stack-smash,C,Gcc,Stack Overflow,Stack Smash,我遇到了一个堆栈崩溃问题,我很难找到原因。堆栈粉碎错误只会偶尔发生,并且只发生在程序执行的最后。当我使用gcc的“fstack protector”选项编译它时,它也会完全停止。我想知道使用“fstack protector”选项是一个实际的解决方案,还是我只是在隐藏问题?我会发布代码,但它有3000行长,我不确定代码的哪一部分负责。此选项不会阻止堆栈崩溃,而是检测它并停止程序 从gcc手册页: -fstack保护器 发出额外代码以检查缓冲区溢出,例如堆栈溢出 粉碎性攻击。这是通过将保护变量添加

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

此选项不会阻止堆栈崩溃,而是检测它并停止程序

从gcc手册页:

-fstack保护器

发出额外代码以检查缓冲区溢出,例如堆栈溢出 粉碎性攻击。这是通过将保护变量添加到 具有易受攻击对象的函数。这包括 调用“alloca”,并使用缓冲区大于8字节的函数。这个 当输入函数并检查时,将初始化防护 当函数退出时。如果保护检查失败,将显示错误消息 被打印,程序退出


您仍然存在溢出问题,但是添加保护变量显然掩盖了这个问题。如果在其下运行程序,应该能够检测到发生了什么。

是的,您正在隐藏问题。
-fstack protector
应该将可利用的错误转化为提示崩溃,而不是完全防止堆栈损坏。如果程序在使用
-fstack-protector
编译时停止崩溃,那么它只是受到了干扰而没有表现出来。试试
valgrind
。我建议使用
-fsanize=address
编译并运行程序。它比valgrind更擅长分析堆栈,因为它知道堆栈上的实际变量,并且可以告诉您堆栈上的数组访问何时溢出到另一个堆栈变量中。