メインコンテンツ

代入が重複しています

代入の左辺と右辺間のメモリ オーバーラップ

説明

この欠陥は、代入の左辺と右辺の間にメモリのオーバーラップがある場合に発生します。たとえば、ある変数がそれ自体に代入される場合や、共用体の 1 つのメンバーが別のメンバーに代入される場合です。

リスク

代入の左辺と右辺にメモリのオーバーラップがあると、動作が冗長または未定義になります。次に例を示します。

  • x=(int)(long)x; のような自己代入は、xvolatile 修飾でない限り冗長です。

  • 1 つの共用体メンバーを別のメンバーに代入すると、未定義の動作の原因となります。

    たとえば、次のコードについて考えます。

    • 代入 u1.a = u1.b の結果は、u1.b が初期化されていないため未定義となります。

    • 代入 u2.b = u2.a の結果は、実装のアライメントとエンディアンに依存します。これは C 標準では定義されていません。

    union {
       char a;
       int b;
    }u1={'a'}, u2={'a'}; //'u1.a' and 'u2.a' are initialized
    
    u1.a = u1.b; 
    u2.b = u2.a;

修正方法

メモリがオーバーラップする 2 つの変数間での代入を回避します。

すべて展開する

#include <string.h>

union Data {
    int i;
    float f;
};

int main( ) {
    union Data data;
    data.i = 0;
    data.f = data.i;

    return 0;
}

この例では、変数 data.idata.f は同じ union の一部であり、同じ場所に格納されています。したがって、メモリ ストレージの一部がオーバーラップします。

結果情報

グループ: プログラミング
言語: C | C++
既定値: オフ
コマンド ライン構文: OVERLAPPING_ASSIGN
影響度: Low

バージョン履歴

R2015b で導入