问题标签 [red-zone]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
5840 浏览

java - Invalid access of stack red zone from Java VM

I'm trying to figure out what can cause this error in Java:

Has anyone ever encountered this error message? It's literally killing the JVM and everything stops there.

I'm currently using this version of Java:(on OS X 10.6)

All I'm looking for is some sort of explanation and tips on how to avoid hitting this again.

Thanks in advance!

0 投票
5 回答
2131 浏览

c - 破坏红色区域的内联汇编

我正在编写一个密码学程序,核心(一个宽乘法例程)是用 x86-64 汇编编写的,既是为了速度,又是因为它广泛使用adc了从 C 语言不容易访问的指令。我不想内联这个函数,因为它很大并且在内部循环中被调用了好几次。

理想情况下,我还想为这个函数定义一个自定义调用约定,因为它在内部使用所有寄存器(除了rsp),不会破坏它的参数,并在寄存器中返回。现在,它已适应 C 调用约定,但这当然会使其速度变慢(大约 10%)。

为了避免这种情况,我可以调用它,asm("call %Pn" : ... : my_function... : "cc", all the registers);但有没有办法告诉 GCC 调用指令与堆栈混淆?否则 GCC 只会将所有这些寄存器放在红色区域中,而顶部的寄存器将被破坏。我可以用 -mno-red-zone 编译整个模块,但我更喜欢告诉 GCC,比如说,红色区域的前 8 个字节将被破坏,这样它就不会在那里放任何东西。

0 投票
2 回答
1667 浏览

gcc - 为什么在分配没有后续函数调用的大数组时,GCC 会向堆栈指针减去错误的值?

真是奇怪的 gcc 怪癖。看一下这个:

产生这个程序集:

堆栈的顶部显然是 400,因为它是一个 100 * 4 的数组。因此,当它写入第一个条目时,它会执行 rbp - 400(“b”行)。好的。但是为什么它从堆栈(第'4'行)指针中减去280?那不是指向数组的中间吗?

如果我们之后添加一个函数调用,gcc 会做正确的事情:

产生这个程序集:

在这里,它正确地减去了 400(行 'a')。

为什么添加函数调用时会发生变化?gcc 只是懒惰,因为没关系而没有做对吗?发生了什么?显然,这只发生在为 x86_64 编译时,而不是为普通 x86 编译时。这与 x86_64 的“redzone”有什么奇怪的关系吗?究竟发生了什么?

0 投票
1 回答
299 浏览

jpa - 合并复杂对象时堆栈红色区域的访问无效

我正在使用游戏!框架 1.2.4 用于将对象从外部上下文(实际上是 Flex)传递到服务的项目。网关使用 cinnamon 框架 (http://www.spicefactory.org/pimento/) 来处理要路由到服务的 AMF 请求。

因此,我收到了分离的对象,并且我试图通过简单地调用来避免进入复杂的合并问题:

它可以解决简单对象的问题,但是当涉及到更复杂的对象时,我遇到了以下错误,该错误只是关闭了服务器(这很顽皮)

这是我的 JPA 映射的简化概述

(我删除了大部分属性)会不会是因为我收到的对象太复杂了?

我正在尝试手动完成所有操作,但也遇到了“找到同一个集合的两个表示”,这有点难以弄清楚......

非常感谢任何帮助、想法和方向!

谢谢

0 投票
2 回答
300 浏览

java - Grails:堆栈红色区域的无效访问

我在 OS X (10.7.4) 上运行 Grails 2.0.4 应用程序。该应用程序启动时没有任何问题,但是当我尝试在浏览器中访问主页时,出现堆栈红色区域错误:

并且服务器关闭。

该应用程序使用这些插件:

  • 代码覆盖率 (1.2.5)
  • 密码 (0.17)
  • 休眠 (2.0.4)
  • jQuery (1.7.1)
  • 邮件 (1.0)
  • 插件配置(0.1.5)
  • 石英2 (0.2.2)
  • 验证码 (0.5.2)
  • 参考代码(0.3.0)
  • 资源 (1.1.5)
  • 弹簧缓存(1.3.1)
  • svn (1.0.1)
  • 雄猫 (2.0.4)
  • webxml (1.4.1),和
  • yui-minify-resources (0.1.5)

有没有人碰巧有任何提示,Grailswise,如何解决这个问题?

谢谢!

0 投票
1 回答
3232 浏览

assembly - 为什么 x86-64 GCC 函数序言分配的堆栈比局部变量少?

考虑以下简单程序:

在 x86-64 机器上使用 GCC 4.7.0 编译。用 GDB 反汇编 main() 给出:

当缓冲区为 256 字节时,为什么它只使用 0x98 = 152d 子 rsp?当我将数据移动到缓冲区 [0] 时,它似乎只是使用分配的堆栈帧之外的数据并使用 rbp 来引用,那么 sub rsp,0x98 的意义何在?

另一个问题,这些行有什么作用?

为什么需要保存 EDI 而不是 RDI?但是,我看到它将其移到了 C 代码中分配的缓冲区的最大范围之外。同样有趣的是为什么两个变量之间的差异如此之大。既然 EDI 只有 4 个字节,为什么需要将两个变量分开 12 个字节呢?

0 投票
1 回答
610 浏览

assembly - GCC 访问堆栈顶部上方的内存

我有 C 函数可以进行一些 SSE 计算。当我用 GCC 编译它时,我得到下一个代码

查看movaps说明 - 它是堆栈顶部的访问内存:

不是访问未定义的内存吗?为什么 GCC 会生成这样不正确的代码?

0 投票
2 回答
223 浏览

c - x86-64 代码生成上的堆栈红色分区不正确

这是 Linux 内核函数的编译器输出(使用 编译-mno-red-zone):

注意编译器已经溢出到堆栈之后的“subq $184, %rsp” (溢出是疯狂的,顺便说一句,因为它溢出了一个常量值!)

Linus 2 天前向 gcc 报告了这个错误。但我不明白错误是什么。 为什么这是subq错的?

编辑:错误报告在这里:抱歉在 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61904之前没有包含这个

0 投票
3 回答
5149 浏览

x86-64 - 为什么内核代码不能使用红区

强烈建议在创建 64 位内核(对于 x86_64 平台)时,指示编译器不要使用用户空间 ABI 所使用的 128 字节红色区域。(对于 GCC,编译器标志是-mno-red-zone)。

如果启用,内核将不是中断安全的。

但这是为什么呢?

0 投票
1 回答
119 浏览

c - 在 linux 上根据 x86-64 调用约定设置本地堆栈

我正在对在 64 位 linux 上运行的 gnu C 代码进行一些扩展的汇编优化。我想从汇编代码中打印调试消息,这就是我遇到以下问题的方式。我希望有人能解释我在这种情况下应该做什么。

看看这个示例函数:

由于该函数的四个参数属于 INTEGER 类,因此它们将通过寄存器传递,然后压入堆栈。对我来说奇怪的是 gcc 是如何做到的:

传递的参数被压入堆栈,但堆栈指针不会递减。因此,当我这样做时,和pushq %rax的值将被覆盖。我想知道:有没有办法让 gcc 正确设置本地堆栈?我根本不应该在函数调用中使用and吗?abpushpop