解決済み

C言語の記述ミス防止

  • 困ってます
  • 質問No.9537044
  • 閲覧数170
  • ありがとう数5
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 48% (16/33)

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

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

  • 回答No.1

ベストアンサー率 50% (1228/2419)

コンピューター カテゴリマスター
>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 */
}
シンプルだが、長い!
でも場合により一番安全!
お礼コメント
EGA4545

お礼率 48% (16/33)

ありがとうございます。
投稿日時 - 2018-09-21 22:08:09
たいせつな将来のこと。あえて、知らない人に聞いてみよう。

その他の回答 (全3件)

  • 回答No.4

ベストアンサー率 13% (206/1496)

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

お礼率 48% (16/33)

ありがとうございます。
GREAP検索だと沢山CASE、BREAKが表示され現実は難しいかと。
投稿日時 - 2018-09-21 22:08:33
  • 回答No.3

ベストアンサー率 43% (7610/17460)

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

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

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

お礼率 48% (16/33)

ありがとうございます。
投稿日時 - 2018-09-21 22:08:22
  • 回答No.2

ベストアンサー率 28% (1333/4670)

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

お礼率 48% (16/33)

最近のコンパイラでも対応して無いです。
投稿日時 - 2018-09-21 22:07:57
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


OKWAVE若者応援スペシャル企画

ピックアップ

ページ先頭へ