相关疑难解决方法(0)

检测到堆栈粉碎

我正在执行我的a.out文件.执行后程序运行一段时间然后退出并显示以下消息:

**** stack smashing detected ***: ./a.out terminated*
*======= Backtrace: =========*
*/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)Aborted*
Run Code Online (Sandbox Code Playgroud)

可能的原因是什么?如何纠正?

c stack exception

225
推荐指数
5
解决办法
37万
查看次数

Alloca实施

如何在D,C和C++等语言中使用内联x86汇编程序实现alloca()?我想创建一个稍微修改过的版本,但首先我需要知道标准版本是如何实现的.从编译器中读取反汇编并没有帮助,因为它们执行了很多优化,我只想要规范形式.

编辑:我想困难的部分是我希望它具有正常的函数调用语法,即使用裸函数或其他东西,使它看起来像普通的alloca().

编辑#2:啊,到底是什么,你可以假设我们没有省略帧指针.

c c++ assembly memory-management d

28
推荐指数
4
解决办法
8771
查看次数

alloca() 如何与其他堆栈分配交互?

让我们从一个简单的堆栈分配示例开始:

void f() {
    int a, b;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确的话。a那么和的地址b与栈基址(即寄存器 )有固定的偏移量ebp。如果我们以后需要它们,这就是编译器找到它们的方式。

但请考虑以下代码。

void f(int n) {
    int a;
    alloca(n);
    int b;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果编译器不做任何优化,堆栈将为a->n->b. 现在 的偏移量b取决于n。那么编译器做了什么?

模仿alloca() 在内存级别如何工作?。我尝试了以下代码:

#include <stdio.h>
#include <alloca.h>

void foo(int n)
{
    int a;
    int *b = alloca(n * sizeof(int));
    int c;
    printf("&a=%p, b=%p, &c=%p\n", (void *)&a, (void *)b, (void *)&c);
}

int main()
{
    foo(5);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是&a=0x7fffbab59d68, b=0x7fffbab59d30, …

c x86 alloca stack-frame

0
推荐指数
1
解决办法
182
查看次数

标签 统计

c ×3

alloca ×1

assembly ×1

c++ ×1

d ×1

exception ×1

memory-management ×1

stack ×1

stack-frame ×1

x86 ×1