5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

switch文 break漏れ 警告

Last updated at Posted at 2018-11-13

目次

C/C++のswitch文では、case文の最後にbreak文を設定しなくても、コンパイルエラーにはなりません。
これをフォールスルーといい、意図的に処理を統一して使用するケースでは便利なのですが、誤ってbreak文を入れ忘れた場合にはバグが埋め込まれてしまいます。

そのため、コンパイラで警告を出す方法がないか調べた所、gcc7からはフォールスルーのWarningが追加されたようなので下記使用イメージを記載します。

 前提条件

$ g++ --version
  g++ (GCC) 8.1.0
            ^^^^^★ここがバージョン7以上でないとコンパイラが
                   対応していないため、バージョンアップして下さい

  ※gccをバージョンアップする場合、以下が参考になります。
   https://qiita.com/knutpb1205/items/fc6dbc15fbd052f7560a

エラー例

$ vi sample.cpp
       :
switch(aaa)
{
    case 2:
        bbb=2;
        ★ここがbreak漏れ
    case 3:
        bbb=3;
       break;

コンパイル

### コンパイルオプションに -Wextra か -Wimplicit-fallthrough=3を指定する
$ g++ -Wall -Wextra sample.cpp
         or
$ g++ -Wall -Wimplicit-fallthrough=3 sample.cpp

  sample.cpp: In function ‘int main()’:
  sample.cpp:50:16: warning: this statement may fall through [-Wimplicit-fallthrough=]
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                    ★ちゃんと警告が出ている
               bbb=2;
  sample.cpp:52:9: note: here
           case 3:
           ^~~~

ただ、こうすると今度は意図的にフォールスルーしたい箇所でも警告が出てしまいますが、
対象外の場所には特定のコメント文 or C++17の***[[fallthrough]]属性***を挿入することで警告をスキップできます

警告スキップコメント挿入後(コメント文)

$ vi sample.cpp
       :
switch(aaa)
{
    case 2:
        bbb=2;
        /* Falls through. */
        ^^^^^^^^^^^^^^^^^^^^
        ★上記のコメントを入れるとスキップ出来る。
    case 3:
        bbb=3;
       break;

警告スキップコメント挿入後([[fallthrough]]属性)

$ vi sample.cpp
       :
switch(aaa)
{
    case 2:
        bbb=2;
        [[fallthrough]];
        ^^^^^^^^^^^^^^^^
        ★上記の属性を入れるとスキップ出来る。
    case 3:
        bbb=3;
       break;

※コメント分の種類は以下を参照して下さい
■RED HAT DEVELOPPER(-Wimplicit-fallthrough in GCC 7)
 https://developers.redhat.com/blog/2017/03/10/wimplicit-fallthrough-in-gcc-7/

■cpprefjp - C++日本語リファレンス([[fallthrough]]属性)
 https://cpprefjp.github.io/lang/cpp17/fallthrough.html

5
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?