[無用の代入] レポート
[無用の代入] レポートには、グローバル、静的、ローカルの各変数への代入が記載されます。これらの代入値は、変数が読み取られる前に再設定されたか、もしくは変数の設定後に読み取られていないために、使用されることがありません。無用の代入は、誤ったロジックもしくは欠如したロジックがあることを示す可能性があります。以下に例をあげます。
int globalA = 1;
int globalB = 1;
int func2(int paramX, int paramY) {
paramY = globalB;
globalA = paramY;
return paramX;
}
int func1(void) {
int localX, localY, localZ;
localX = 1;
localY = 1;
localZ = 1;
globalB = 2;
localZ = func2(localX, localY);
return localZ;
}
|
本レポートには、変数自体が読み取られる前に今後、再設定されるか(localZ)、あるいは変数が今後読み取られることがない(globalA)、特定の変数の代入が示されます。これらは直接的な無用の代入として認識され、間接的な無用の代入が選択されたとしても、常にリストアップされます。
Useless Assignments
Settings:
Global Variables: displayed
Static Variables: displayed
Local Variables: displayed
Transitively Useless: not displayed
Union/Bitfield Members: separate
Variable File (Line)
Function File (Line)
Assignment
globalA useless_asgn.c (2)
func2 useless_asgn.c (5)
8 globalA = paramY;
localZ useless_asgn.c (13)
func1 useless_asgn.c (12)
17 localZ = 1;
|
間接的な無用の代入の表示を有効にすることで、リストアップの対象となる代入が拡大されます。この場合、paramY および globalB の代入がレポートに記載されることに注意してください。func2 における globalA の代入は、直接的に無用な処理です。paramY の代入は globalA の無用の代入にのみ使用されるため、上流におけるこの代入は間接的に無用な処理と見なされます。さらに1段階上流では、paramY の値の設定における globalB の使用も同様になります。
それぞれの結果に対する説明を付加にすることによってレポートにその理由が記載され、該当の代入が無用となる根拠が理解しやすくなります。
Useless Assignments
Settings:
Global Variables: displayed
Static Variables: displayed
Local Variables: displayed
Transitively Useless: displayed
Union/Bitfield Members: separate
Variable File (Line)
Function File (Line)
Assignment
globalA useless_asgn.c (2)
func2 useless_asgn.c (5)
8 globalA = paramY;
Reason: reaches end of control flow without use
globalB useless_asgn.c (3)
func1 useless_asgn.c (12)
18 globalB = 2;
Reason: reaches end of control flow without use
localZ useless_asgn.c (13)
func1 useless_asgn.c (12)
17 localZ = 1;
Reason: reaches end of control flow without use
paramY useless_asgn.c (5)
func2 useless_asgn.c (5)
7 paramY = globalB;
Reason: transitively useless because useless assignment at line 8 in function func2
|
|