問題タブ [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 - JavaVMからのスタックレッドゾーンへの無効なアクセス
私はJavaでこのエラーを引き起こす原因を解明しようとしています:
誰かがこのエラーメッセージに遭遇したことがありますか?それは文字通りJVMを殺し、すべてがそこで止まります。
私は現在このバージョンのJavaを使用しています:(OSX 10.6の場合)
私が探しているのは、これを再びヒットしないようにする方法についてのある種の説明とヒントです。
前もって感謝します!
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 癖。これをチェックしてください:
このアセンブリを生成します:
100 * 4 の配列であるため、スタックのトップは明らかに 400 です。したがって、最初のエントリに書き込むときは、rbp - 400 (行 'b') を実行します。良い。しかし、スタック (行 '4') ポインターから 280 を減算するのはなぜですか? それは配列の真ん中を指していませんか?
後で関数呼び出しを追加すると、gcc は正しいことを行います。
このアセンブリを生成します:
ここでは、適切に 400 を減算します (行 'a')。
関数呼び出しを追加すると、なぜ変化するのですか? gcc は単に怠け者であり、それが問題ではないために正しく機能しないのでしょうか? 何が起こっていますか?明らかに、これは x86_64 用にコンパイルする場合にのみ発生しますが、プレーンな x86 では発生しません。これは x86_64 の「レッドゾーン」と関係がありますか? 正確に何が起こっているのですか?
jpa - 複雑なオブジェクトをマージするときのスタック レッド ゾーンの無効なアクセス
私は遊びを使っています!オブジェクトを外部コンテキスト (実際には Flex) からサービスに渡すプロジェクトのフレームワーク 1.2.4。ゲートウェイはシナモン フレームワーク (http://www.spicefactory.org/pimento/) を使用して、サービスにルーティングされる AMF 要求を処理します。
したがって、切り離されたオブジェクトを受け取ります。単純に呼び出すことで、複雑なマージの問題を回避しようとしています。
単純なオブジェクトのトリックを行いますが、より複雑なオブジェクトになると、次のエラーが発生し、サーバーが単にシャットダウンされます (これはいたずらです)。
これが私のJPAマッピングの簡単な概要です
と
と
(ほとんどのプロパティを削除しました) 受け取ったオブジェクトが複雑すぎることが原因でしょうか?
私はすべてを手作業でやろうとしていますが、「同じコレクションの 2 つの表現が見つかりました」というメッセージが表示され、ちょっとわかりにくい...
どんな助け、考え、指示も大歓迎です!
ありがとう
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 でコンパイル。main() を GDB で逆アセンブルすると、次のようになります。
バッファが 256 バイトのときに 0x98 = 152d のみでサブ rsp を実行するのはなぜですか? データを buffer[0] に移動すると、割り当てられたスタック フレームの外側のデータを使用し、rbp を使用して参照しているように見えるので、サブ rsp,0x98 のポイントは何ですか?
別の質問ですが、これらの行は何をしますか?
RDI ではなく EDI を保存する必要があるのはなぜですか? ただし、Cコードで割り当てられたバッファの最大範囲外にこれを移動していることがわかります。また興味深いのは、2 つの変数の間のデルタが非常に大きい理由です。EDI はわずか 4 バイトなので、2 つの変数を 12 バイトで区切る必要があるのはなぜですか?
assembly - スタックトップより上の GCC アクセスメモリ
SSE計算を行うC関数があります。GCCでコンパイルすると、次のコードが得られます
命令を見てmovaps
ください-それはスタックトップを介したメモリへのアクセスです:
未定義メモリへのアクセスではないですか?そして、なぜ GCC はそのような間違ったコードを生成したのでしょうか?
x86-64 - カーネル コードがレッド ゾーンを使用できない理由
64 ビット カーネル (x86_64 プラットフォーム用) を作成する場合は、ユーザー空間 ABI が使用する 128 バイトのレッド ゾーンを使用しないようにコンパイラに指示することを強くお勧めします。(GCC の場合、コンパイラ フラグは です-mno-red-zone
)。
カーネルが有効になっている場合、カーネルは割り込みに対して安全ではありません。
しかし、それはなぜですか?
c - Linux で x86-64 呼び出し規約に従ってローカル スタックをセットアップする
64ビットLinuxで実行されているgnu Cコードで拡張アセンブリ最適化を行っています。アセンブリコード内からデバッグメッセージを出力したかったので、次のようになりました。この状況で私が何をすべきかを誰かが説明してくれることを願っています。
このサンプル関数を見てください:
関数の 4 つの引数はクラス INTEGER であるため、レジスタを介して渡され、スタックにプッシュされます。私にとって奇妙なことは、gccが実際にどのようにそれを行うかです:
渡された引数はスタックにプッシュされますが、スタック ポインターはデクリメントされません。したがって、 を実行すると、とpushq %rax
の値が上書きされます。私が疑問に思っていること:gccにローカルスタックを適切にセットアップするように依頼する方法はありますか? 関数呼び出しでandを使用することは想定されていませんか?a
b
push
pop