INVARIANT_CONDITION.UNREACH
条件における不変式は、到達不能コードを引き起こします
INVARIANT_CONDITION.UNREACH チェッカーは、ブランチにおいて、到達不能なコード指摘を起こす、選択または反復ステートメントで真偽条件を検索します。これは、原因に関わらず、到達不能コード自身を報告する、UNREACH.GEN または UNREACH.RETURN などの到達不能コードチェッカーと異なります。INVARIANT_CONDITION.UNREACH チェッカーは、到達不能コードを生じた条件のみを報告します。これらのチェッカーは類似した指摘を検出するため (方法はわずかに異なる)、到達不能コードチェッカーがオフになっているときにのみ INVARIANT_CONDITION.UNREACH をオンにすることが妥当に思われます。
脆弱性とリスク
到達不能条件は、記述されたコードとその設計意図との不一致により、意図しないプログラム動作を引き起こす可能性があります。到達不能条件は、コードのメンテナンスやレビュー時に混乱を引き起こすこともあります。
コード例
コピー
enum status_codes {
ST_UNKNOWN = -1,
ST_SUCCESS,
ST_INVALIDARG,
ST_NOTFOUND,
ST_FATAL,
};
extern void report_warn();
extern void report_err();
void report_status(int code)
{
if (code < 0) {
exit(1);
}
if (code >= ST_FATAL) {
report_err();
} else {
report_warn();
if (code == ST_UNKNOWN) { // <== invariant condition
exit(2); // ( <== unreachable code )
}
}
}
ライン 15 における前のチェックにより、変数「コード」はこのパスにある負ではない値により守られているので、Klocwork はライン 22 のcode == ST_UNKNOWN条件を INVARIANT_CONDITION.UNREACH指摘として報告します。ライン 13 においてこの条件により制御されているコードブランチは到達不能です。
この指摘を修正するには、条件がチェックされる順序を変更します。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。