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();
        }
    }
}