代入が重複しています
代入の左辺と右辺間のメモリ オーバーラップ
説明
この欠陥は、代入の左辺と右辺の間にメモリのオーバーラップがある場合に発生します。たとえば、ある変数がそれ自体に代入される場合や、共用体の 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 で導入