JAVA.WAIT.IN.LOOP

wait() メソッドと await() メソッドは必ずループ内で呼び出す

脆弱性とリスク

wait() 条件述語が検証されるようにするには、応答通知を受け取った後に検証を実行しなければなりません。

軽減と防止

応答通知の後に検証が実行されるようにするため、wait() 呼び出しがループ内で行われるようにしてください。

脆弱コード例 1

コピー
package com.klocwork;

public class JAVA_WAIT_IN_LOOP_POSITIVE_1 {
    public void test1(Object obj) throws InterruptedException {
        obj.wait();
    }
}

脆弱コード例 2

コピー
package com.klocwork;

import java.util.concurrent.locks.Condition;

public class JAVA_WAIT_IN_LOOP_POSITIVE_2 {
    public void test1(Condition condition) throws InterruptedException {
        condition.await();
    }
}

修正コード例

コピー
package com.klocwork;

import java.util.concurrent.locks.Condition;

public class JAVA_WAIT_IN_LOOP_NEGATIVE {
    public void test1(Object obj, Condition condition) throws InterruptedException {
        for (;;) {
            obj.wait();
            condition.await();
        }
    }

    public void test2(Object obj, Condition condition) throws InterruptedException {
        do {
            obj.wait();
            condition.await();
        } while (true);
    }
    
    public void test3(Object obj, Condition condition) throws InterruptedException {
        while (true) {
            obj.wait();
            condition.await();
        }
    }
}

外部参考資料