gcc 的 -fstack-protector 选项如何防止堆栈崩溃?

How does gcc's -fstack-protector option prevent stack smashing?

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

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

来自 gcc 手册页:

-fstack-protector

Emit extra code to check for buffer overflows, such as stack smashing attacks. This is done by adding a guard variable to functions with vulnerable objects. This includes functions that call "alloca", and functions with buffers larger than 8 bytes. The guards are initialized when a function is entered and then checked when the function exits. If a guard check fails, an error message is printed and the program exits.

你仍然有溢出问题,但增加保护变量显然掩盖了这个问题。如果你 运行 你的程序在 valgrind 下,它应该能够检测到发生了什么。