目次
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