我正在完成家庭作业(因此我无法发布代码),并且我很少收到此运行时错误:
* 检测到堆栈粉碎 * : 终止
中止(核心转储)
当我之后再次运行可执行文件时,一切正常。是否有原因为什么此错误仅有时出现?作为引用,我试图完成的作业让我们将文件中的数据加载到两个 vector 中,并对数据进行二进制和线性搜索,以查看 vector 1 中的数据是否出现在 vector 2 中。
谢谢!
编辑:附加信息:当我收到此错误时,输入数据没有任何变化。我可以运行完全相同的可执行文件,一次使用完全相同的输入数据并让它工作,第二次运行它,得到堆栈粉碎错误,然后运行完全相同的东西,让它再次正常工作。
最佳答案
*** stack smashing detected ***
顾名思义,当您粉碎堆栈时会发生错误,这意味着您有缓冲区溢出并且金丝雀被不同的值覆盖。
这是 gcc/g++ 实现的一种安全机制,用于防止缓冲区溢出漏洞利用 -fstack-protector
.
要避免此错误,请禁用 fstack-protector
在 gcc 中编译代码时使用
g++ myProgram.c -o myProgram -fno-stack-protector
编辑 1
但是,禁用堆栈保护将消除此错误,但您可能会收到
segmentation fault
由于覆盖堆栈。如果这是一项计算机安全任务,您正在处理缓冲区溢出漏洞,那么您需要找出绕过这些安全机制,如果您不熟悉它,那么不知何故,您正在溢出缓冲区,而无需查看代码,我可以'对问题究竟出在哪里没有太多评论。
查看来自 vector 1 的数据是否出现在 vector 2 中 这确实看起来像是缓冲区溢出类型的分配,您需要相互覆盖数组的内容。
这个错误的事实并不一致,因为有时金丝雀不会被覆盖(程序的良好运行)或被相同的确切值覆盖,有时金丝雀会被不同的值覆盖导致此错误。
您需要配置编译器以使其更容易发生缓冲区溢出。
编辑 2
您的程序行为是随机的,因为您可能没有禁用 ASLR(地址空间布局随机化)。当你编译你的程序时,你的编译器 gcc/g++ 会针对安全机制优化你的可执行文件,以防止缓冲区溢出漏洞。
Address space layout randomization (ASLR) is a computer security technique involved in preventing exploitation of memory corruption vulnerabilities. In order to prevent an attacker from reliably jumping to, for example, a particular exploited function in memory, ASLR randomly arranges the address space positions of key data areas of a process, including the base of the executable and the positions of the stack, heap and libraries.
这意味着地址空间分配是随机的,并且 vector 之间的字节每次都不同。有时溢出的缓冲区不会到达金丝雀,有时会。
为了每次都获得一致的行为,您还需要禁用 ASLR。 ASLR 支持由您的操作系统提供。要禁用 ASLR,在 Linux 上通过设置
randomize_va_space
禁用它。到 0. 可以通过echo 0 > /proc/sys/kernel/randomize_va_space
关于c++ - *** 检测到堆栈粉碎 *** : <unknown> terminated Aborted (core dumped) Error only occurring sometimes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61115393/