JPCERT コーディネーションセンター

MSC01-J. 空の無限ループを使用しない

ループ本体が空である無限ループは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)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter