ループ本体が空である無限ループはCPUサイクルを消費するだけで何も行わない。最適化を行うコンパイラや just-in-time システム (JIT)はそのようなループを削除することが言語仕様上許されている。空のループ削除は、プログラマにとっては予期しない動作であるかもしれない。したがって、ループ本体が空であるような無限ループを使用してはならない。
違反コード
以下の違反コードは、ループ内の処理で何ら命令を実行しない。最適化を行うコンパイラやJITはこのようなループを削除する可能性がある。
public int nop() { while (true) {} }
適合コード (Thread.sleep())
以下の適合コードでは、無意味な無限ループを使用する代わりに、whileループの中でThread.sleep()メソッドを呼び出している。ループには意味のある処理が書かれているため、最適化により削除されることはない。
public final int DURATION=10000; // 単位はミリ秒 public void nop() throws InterruptedException { while (true) { // 意味のある処理 Thread.sleep(DURATION); } }
適合コード (yield())
以下の例ではThread.yield()を呼び出している。このメソッドを実行するスレッドは処理を休止し、他のスレッドが実行できるようにする。
public void nop() { while (true) { Thread.yield(); } }
リスク評価
ルール | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
---|---|---|---|---|---|
MSC01-J | 低 | 低 | 中 | P2 | L3 |
関連ガイドライン
CERT C Secure Coding Standard | MSC40-C. Do not use an empty infinite loop |
参考文献
[API 2006] |
翻訳元
これは以下のページを翻訳したものです。
MSC01-J. Do not use an empty infinite loop (revision 12)