EN JP CN

INFINITE_LOOP.MACRO

INFINITE_LOOP.MACRO

マクロ内の無限ループ

INFINITE_LOOP チェッカーは終了しないループのインスタンスを検出します。このチェッカーはループの終了を制御する変数を追跡し、条件が変わらない場合に欠陥のフラグを立てます。反復によってループ条件の有効値が変化しない場合、ループは終了しません。

INFINITE_LOOP.MACRO チェッカーはマクロに含まれる無限ループを検出します。INFINITE_LOOP.MACRO チェッカーの一般的な使用目的は、終了条件がローカル変数に基づくループのチェックと、このタイプの無限ループのチェックとを区別することです。重大な無限ループを INFINITE_LOOP.LOCAL でチェックする場合に、INFINITE_LOOP.MACRO チェッカーをオフにできるので便利です。

脆弱性とリスク

無限ループはプログラムが無限にハングアップしたりクラッシュしたりする原因になり、CPU やメモリリソースの過剰な使用によってサービス拒否 (DoS) 攻撃を許すことになります。

脆弱コード例


1    #define HALT() do { } while (1)
2    void infinite_loop() {
3       HALT();
4    } 

Klocwork は、関数が終了できないため、無限ループのこの例にフラグを立てます。この場合は、停止を起こさせるためにコード内に置かれているマクロ HALT にループが含まれています。この例は、無限ループを検索するときには通常、フラグを立てたくない状況ですが、INFINITE_LOOP.MACRO を使用すると、このような状況と真にフラグを立てたいコード欠陥のタイプとを分離することができます。