1

リバースエンジニアリングしようとしているプログラムのia32 assemblyコードがあります。c1つの方法では、行があるように見えます"sscanf(input_phrase, "%d %c %d", ebp-4, ebp-9, ebp-8);"(input_phraseがc文字列でebpあり、ポインターである場合)。charが16ビットであるとすると、charを格納するスペースは、2番目のintを格納するスペースとオーバーラップする必要があります(テストの結果、これが当てはまることがわかりました)。このコードがどのように機能するかについての正確な定義はありますか、それとも予測不可能ですか?

4

3 に答える 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 に答える