【发布时间】:2018-11-30 00:02:58
【问题描述】:
我遇到了堆栈崩溃问题,我很难找到原因。堆栈粉碎错误只是偶尔发生,并且仅在程序执行结束时发生。当我使用带有 gcc 的 'fstack-protector' 选项编译它时,它也完全停止发生。我想知道使用“fstack-protector”选项是否是一个实际的解决方案,或者我只是在隐藏问题?我会发布代码,但它有 3000 行长,我不确定代码的哪一部分负责。
【问题讨论】:
-
是的,你在隐藏问题。
-
-fstack-protector应该将可利用的错误转变为即时崩溃,而不是完全防止堆栈损坏。如果程序在使用-fstack-protector编译时停止崩溃,那么它只是让错误受到干扰而无法显现。请改用valgrind。 -
我建议使用
-fsanitize=address编译并运行程序。它比 valgrind 更擅长分析堆栈,因为它知道堆栈上的实际变量,并且它可以告诉您堆栈上的数组访问何时溢出到另一个堆栈变量中。 github.com/google/sanitizers/wiki/…
标签: c gcc stack-overflow stack-smash