问题标签 [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.
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!
c - 破坏红色区域的内联汇编
我正在编写一个密码学程序,核心(一个宽乘法例程)是用 x86-64 汇编编写的,既是为了速度,又是因为它广泛使用adc
了从 C 语言不容易访问的指令。我不想内联这个函数,因为它很大并且在内部循环中被调用了好几次。
理想情况下,我还想为这个函数定义一个自定义调用约定,因为它在内部使用所有寄存器(除了rsp
),不会破坏它的参数,并在寄存器中返回。现在,它已适应 C 调用约定,但这当然会使其速度变慢(大约 10%)。
为了避免这种情况,我可以调用它,asm("call %Pn" : ... : my_function... : "cc", all the registers);
但有没有办法告诉 GCC 调用指令与堆栈混淆?否则 GCC 只会将所有这些寄存器放在红色区域中,而顶部的寄存器将被破坏。我可以用 -mno-red-zone 编译整个模块,但我更喜欢告诉 GCC,比如说,红色区域的前 8 个字节将被破坏,这样它就不会在那里放任何东西。
gcc - 为什么在分配没有后续函数调用的大数组时,GCC 会向堆栈指针减去错误的值?
真是奇怪的 gcc 怪癖。看一下这个:
产生这个程序集:
堆栈的顶部显然是 400,因为它是一个 100 * 4 的数组。因此,当它写入第一个条目时,它会执行 rbp - 400(“b”行)。好的。但是为什么它从堆栈(第'4'行)指针中减去280?那不是指向数组的中间吗?
如果我们之后添加一个函数调用,gcc 会做正确的事情:
产生这个程序集:
在这里,它正确地减去了 400(行 'a')。
为什么添加函数调用时会发生变化?gcc 只是懒惰,因为没关系而没有做对吗?发生了什么?显然,这只发生在为 x86_64 编译时,而不是为普通 x86 编译时。这与 x86_64 的“redzone”有什么奇怪的关系吗?究竟发生了什么?
jpa - 合并复杂对象时堆栈红色区域的访问无效
我正在使用游戏!框架 1.2.4 用于将对象从外部上下文(实际上是 Flex)传递到服务的项目。网关使用 cinnamon 框架 (http://www.spicefactory.org/pimento/) 来处理要路由到服务的 AMF 请求。
因此,我收到了分离的对象,并且我试图通过简单地调用来避免进入复杂的合并问题:
它可以解决简单对象的问题,但是当涉及到更复杂的对象时,我遇到了以下错误,该错误只是关闭了服务器(这很顽皮)
这是我的 JPA 映射的简化概述
和
和
(我删除了大部分属性)会不会是因为我收到的对象太复杂了?
我正在尝试手动完成所有操作,但也遇到了“找到同一个集合的两个表示”,这有点难以弄清楚......
非常感谢任何帮助、想法和方向!
谢谢
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,如何解决这个问题?
谢谢!
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 个字节呢?
assembly - GCC 访问堆栈顶部上方的内存
我有 C 函数可以进行一些 SSE 计算。当我用 GCC 编译它时,我得到下一个代码
查看movaps
说明 - 它是堆栈顶部的访问内存:
不是访问未定义的内存吗?为什么 GCC 会生成这样不正确的代码?
c - x86-64 代码生成上的堆栈红色分区不正确
这是 Linux 内核函数的编译器输出(使用 编译-mno-red-zone
):
注意编译器已经溢出到堆栈之后的“subq $184, %rsp” (溢出是疯狂的,顺便说一句,因为它溢出了一个常量值!)
Linus 2 天前向 gcc 报告了这个错误。但我不明白错误是什么。 为什么这是subq
错的?
编辑:错误报告在这里:抱歉在 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61904之前没有包含这个
x86-64 - 为什么内核代码不能使用红区
强烈建议在创建 64 位内核(对于 x86_64 平台)时,指示编译器不要使用用户空间 ABI 所使用的 128 字节红色区域。(对于 GCC,编译器标志是-mno-red-zone
)。
如果启用,内核将不是中断安全的。
但这是为什么呢?
c - 在 linux 上根据 x86-64 调用约定设置本地堆栈
我正在对在 64 位 linux 上运行的 gnu C 代码进行一些扩展的汇编优化。我想从汇编代码中打印调试消息,这就是我遇到以下问题的方式。我希望有人能解释我在这种情况下应该做什么。
看看这个示例函数:
由于该函数的四个参数属于 INTEGER 类,因此它们将通过寄存器传递,然后压入堆栈。对我来说奇怪的是 gcc 是如何做到的:
传递的参数被压入堆栈,但堆栈指针不会递减。因此,当我这样做时,和pushq %rax
的值将被覆盖。我想知道:有没有办法让 gcc 正确设置本地堆栈?我根本不应该在函数调用中使用and吗?a
b
push
pop