EN JP CN

INFINITE_LOOP.GLOBAL

INFINITE_LOOP.GLOBAL

グローバル変数を持つ無限ループ

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

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

脆弱性とリスク

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

脆弱コード例


1    int global_var;
2    void infinite_loop() {
3       while (1) {
4          if (global_var==0)
5            return;
6       }
7    
} 

Klocwork は、変数 'global' が決して 0 にならないので関数が終了できないため、無限ループのこの例にフラグを立てます。この場合、終了は変数 'global_var' に基づいていますが、これは関数 'infinite_loop' の外でグローバル変数として定義されているため、ループ内で決して変化しません。この例は、無限ループを検索するときには通常、フラグを立てたくない状況ですが、INFINITE_LOOP.GLOBAL を使用すると、このような状況と真にフラグを立てたいコード欠陥のタイプとを分離することができます。