Cを使用してARM9上の非整列メモリアクセス例外の回避策は何ですか?
質問
アーキテクチャARM9。プログラミング言語Cます。
我々は、サードパーティのスタックを有し、コールの一方がメモリ位置へのポインタ(pBuffer
)をとります。スタック内では、彼らが渡されたポインタを移動し、彼らが望むようにそれにアクセスするのは自由です。残念ながら、それらはポインタで渡さオフセットとの奇数/ unalighed のメモリ位置
((uint16 *)pBuffer)[index] = value;
value
は型uint16
であり、index
は境界がチェックされ、インデックスがpBuffer
あります。これは、非整列メモリアクセス例外が発生します。ヒープ上pBuffer
するchar *
ポイントます。
で述べたように、我々は、サードパーティ製のスタックにのぞくことができたとしても、我々は正式にコードを更新することはできません。だから我々は、プロバイダに通知し、彼らは次のリリースでアップデートを提供しています。
私は仕事は、このために周りがあれば理解したいです。どのように私は非整列アクセスに違反することなく、上記の割り当てを実行しますか?このような問題を解決する最善のアプローチは、どのようなものです。
解決
バイトで値のバイトをコピーします。 (符号なし)char型ポインタにキャストし、次に一度にバイトをコピーします。
これはかなりありませんが、あなたは多くのオプションを持っているように、それは鳴りません。
他のヒント
があり3つの可能性がある、と私はこれまでのケースである、あなたの質問から判断することはできません。
ケース1:インデックスは常に奇数です。解決法:1バイト以上MEMMOVE()pBuffer ケース2:インデックスは時々奇妙であり、それがされるときにフロントを予測することができます。解決法:1バイト以上MEMMOVE()pBufferあなたは、インデックスが奇数になります知っています。 ケース3:インデックスは時々奇妙であり、それがされるときに予測することはできません。これは、残念なことですので、コードのでしょうの故障ます。
あなたの周りの仕事として、pBufferのコントロールにある場合、あなたはのuint32_tの配列として宣言(またはあなたのアーキテクチャのアライメントに一致するものは何でも)可能性があります。 uint32_tとしてバッファを宣言すると、コンパイラは、正しいアライメントを選択します。あなたのターゲット関数を呼び出すとき* uint8_tするためにそれをキャストすることができます。
これはあなたが投稿サンプルコードで動作するはずですが、それでもサードパーティのコードがバッファにオフセット任意の非整列を適用した場合に失敗することがあります。