こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の記述ミス防止

C言語で組込み系のソフトを開発しています。
ルネサスのマイコンRL78でエミュはCS+を使用しています。
switch-case文でbreakを書き忘れてfallthroughを起こしました。
break忘れを防止する記述方法はないでしょうか?
MISRA-Cを導入すれば良いですが、それ以外の手段を探しています。
宜しくお願いします。

投稿日時 - 2018-09-13 22:44:03

QNo.9537044

困ってます

質問者が選んだベストアンサー

>break忘れを防止する記述方法はないでしょうか?
基本「ありえない」と思います。
switch( xxx ) {
case 0:
処理1
case 1:
処理2
break;
}
これは、xxxが0なら、処理1と処理2を実行
xxxが1なら、処理2のみを実行。という書き方です。
これをコンパイラが、自動判断することは、無理でしょうね。

ちなみ、ルネサスのコンパイラって、Switchあまり多用しないほうがいいですよ。H8クラスの小型CPU程度の小さいソースならともかく、
SHクラスのやや大きいソースを書くと、結構Switchがまともなソースを
はいてないみたいで、無茶苦茶な動作します。
そのコンパイラでも同じかは、わかりませんが、純正のコンパイラだと、
Switchの「末尾」をくっつけようとするようで、それで無関係な処理が
呼ばれることもありましたね。
ってことで、私なりの回答ですが、
if (x==0) {
}else
if (x==1) {
}else
if (x==2) {
}else
if (x==3) {
}else
{
/* ここがdefault */
}
シンプルだが、長い!
でも場合により一番安全!

投稿日時 - 2018-09-13 23:22:29

お礼

ありがとうございます。

投稿日時 - 2018-09-21 22:08:09

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

正規表現か何かのスクリプトや、もっと単純にgrepでも良いと思いますが、"case"と"break"の数をカウントするなんて単純な方法では駄目ですかね。

投稿日時 - 2018-09-16 02:19:15

お礼

ありがとうございます。
GREAP検索だと沢山CASE、BREAKが表示され現実は難しいかと。

投稿日時 - 2018-09-21 22:08:33

ANo.3

>break忘れを防止する記述方法はないでしょうか?

「全case節に漏れなくbreak句が付く場合はswitch文を使わず、if else ifで書く」という方法しかありません。

switch文を使うのは「意図的にbreak句を付けずに、次のcase節に雪崩れ込む必要がある場合だけ」にしましょう。

投稿日時 - 2018-09-14 00:30:58

お礼

ありがとうございます。

投稿日時 - 2018-09-21 22:08:22

ANo.2

書き忘れではなく意図的な場合もあるので難しいところですが、
splintなどの解析ツールを使うとか。
GNU Cだとコンパイルオプションで警告できるようにもできますけど(最近のCコンパイラだと大抵そういう機能ありそうな気がしますが)

投稿日時 - 2018-09-13 23:22:46

お礼

最近のコンパイラでも対応して無いです。

投稿日時 - 2018-09-21 22:07:57

あなたにオススメの質問