• Imagix 4D ユーザガイド
  • 目次

[無用の代入] レポート

[無用の代入] レポートには、グローバル、静的、ローカルの各変数への代入が記載されます。これらの代入値は、変数が読み取られる前に再設定されたか、もしくは変数の設定後に読み取られていないために、使用されることがありません。無用の代入は、誤ったロジックもしくは欠如したロジックがあることを示す可能性があります。以下に例をあげます。

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