メインコンテンツ

メモリ編成の前提条件が無効です

変数のアドレスに対する加算または減算によってアドレスが計算されている

説明

この欠陥は、スタック内の変数のアドレスが、別の非配列変数のアドレスに対して加算または減算することによって計算された場合に発生します。

リスク

スタック内の変数のアドレスが、別の変数のアドレスに対し加算または減算を行うことによって計算される場合は、特定のメモリ編成が仮定されています。仮定に誤りがある場合、計算されたアドレスへのアクセスが無効になることがあります。

修正方法

メモリ編成についての仮定に依存したアクセスは実行しないようにします。

すべて展開する

void func(void) {
    int var1 = 0x00000011, var2;
    *(&var1 + 1) = 0;
}

この例で、プログラマは、&var1 + 1var2 のアドレスを提供するという仮定に依存しています。したがって、[メモリ編成の前提条件が無効です]+ 演算に表示されます。さらに、[範囲外にアクセスするポインター] エラーもデリファレンスに表示されます。

修正 — メモリ編成に依存しない

1 つの修正方法として、別々に宣言された変数にアクセスする目的で、アドレスについて直接計算を実行しないようにします。

結果情報

グループ: プログラミング
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: INVALID_MEMORY_ASSUMPTION
影響度: Medium

バージョン履歴

R2015b で導入