4

アーキテクチャ ARM9. プログラミング言語 C.

サードパーティのスタックがあり、呼び出しの 1 つがpBufferメモリ位置への pointer( ) を取ります。スタック内では、渡されたポインターを自由に移動し、必要に応じてアクセスできます。残念ながら、彼らは渡されたポインターをオフセットし、奇数/一致しないメモリ位置からこれを実行しようとした別の関数にそれを渡しました

         ((uint16 *)pBuffer)[index] = value;

wherevalueは typeuint16であり、index境界がチェックされ、indexespBufferです。これにより、アラインされていないメモリ アクセス例外が発生します。ヒープ上をpBuffer指します。char *

前述のように、サードパーティのスタックを覗くことができても、コードを公式に更新することはできません。そのため、プロバイダーに通知し、次のリリースで更新を提供します。

これに対する回避策があるかどうかを理解したいと思います。非整列アクセスに違反せずに上記の割り当てを実行するにはどうすればよいですか? そのような問題を解決するための最良のアプローチは何ですか。

4

3 に答える 3

7

値をバイトごとにコピーします。(符号なし) char ポインターにキャストし、一度に 1 バイトずつコピーします。

きれいではありませんが、多くのオプションがあるようには思えません。

于 2009-03-23T15:59:19.600 に答える
1

三つの可能性があり、あなたの質問からはどれが当てはまるか判断できません。

ケース 1: インデックスは常に奇数です。解決策: memmove() pBuffer が 1 バイトを超える場合 ケース 2: インデックスが奇数になる場合があり、いつになるかを事前に予測できます。解決策: インデックスが奇数になることがわかっている場合は、memmove() pBuffer を 1 バイト以上にします。ケース 3: インデックスが奇数になることがあり、いつになるか予測できません。コードに障害が発生するため、これは残念です。

于 2009-03-23T16:06:42.953 に答える