代入が重複しています
代入の左辺と右辺間のメモリ オーバーラップ
説明
この欠陥は、代入の左辺と右辺の間にメモリのオーバーラップがある場合に発生します。たとえば、ある変数がそれ自体に代入される場合や、共用体の 1 つのメンバーが別のメンバーに代入される場合です。
リスク
代入の左辺と右辺にメモリのオーバーラップがあると、動作が冗長または未定義になります。次に例を示します。
x=(int)(long)x;
のような自己代入は、x
がvolatile
修飾でない限り冗長です。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 つの変数間での代入を回避します。
例
結果情報
グループ: プログラミング |
言語: C | C++ |
既定値: オフ |
コマンド ライン構文: OVERLAPPING_ASSIGN |
影響度: Low |
バージョン履歴
R2015b で導入