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