リバースエンジニアリングしようとしているプログラムのia32 assembly
コードがあります。c
1つの方法では、行があるように見えます"sscanf(input_phrase, "%d %c %d", ebp-4, ebp-9, ebp-8);"
(input_phraseがc
文字列でebp
あり、ポインターである場合)。charが16ビットであるとすると、charを格納するスペースは、2番目のintを格納するスペースとオーバーラップする必要があります(テストの結果、これが当てはまることがわかりました)。このコードがどのように機能するかについての正確な定義はありますか、それとも予測不可能ですか?
質問する
239 次
3 に答える
2
実際の質問に対する答えは「そうではない」です。仕様に記載されているかどうかは完全にはわかりませんがscanf
、「ああ、これは重複しているので、やります」という概念がないことは100%確信しています。何か違う」-あなたは単に未定義の振る舞いをします。そのようなことを試みた結果は完全に予測不可能です[最初の読み取りで重複するものは何でも、最後に読み取られたものが上書きされる可能性が非常に高いですが、クラッシュや第三次世界大戦が勃発する可能性もあります!]
char
幸い、 Cのaはサイズが1であると定義されているため、示されているコードはその動作を呼び出しません。したがって、競合はありません。
于 2013-03-09T10:05:37.857 に答える
1
C標準は文字の単位でサイズをカウントするため、文字のサイズは定義上1です。奇妙なハードウェア(シグナルプロセッサ、pdp-10など)を使用していない限り、これも通常のサイズに対応します。 、8ビットバイト。x86アーキテクチャを使用しているため、変数が重複していると誤解されているようです。
于 2013-03-09T07:40:42.887 に答える
0
x86では、char
サイズは8ビット(1バイト)になります。したがって、スタック上では、変数は次のように配置されます。
CJJJJIIII
^ebp
ここI
で、は最初のint、C
は文字、J
は2番目のintです。重複はありません。
于 2013-03-09T08:05:05.947 に答える