yuriの日記: C言語の switch文のdefault抜け 12
日記 by
yuri
- defaultを(わざと無いのではなく)書き忘れていると思しきコード
- intなのにreturn;を返しているコード
他にもあるけど編集中のコードにこういうのがあると直したくて仕方がなくなっちゃう。
けど、動いているものを(問題になっている箇所以外は)いじってはならぬというお達しがあるので、コンパイル時に大量の警告を見て悲しい気持ちになる。
警告レベルを下げればいいじゃん!というアドバイスもあるけれど、せっかく色々コンパイラが教えてくれるのを今更取りやめるのも勿体無いきがするのよね。。
コーディング中にちょっとブルーな気持ちになりました。
よくいわれますが (スコア:1, 興味深い)
とくに最後の2節目あたりでやるとテスト抜けが多い。
Re: (スコア:0)
switch文でのミスってコードカバレッジでも見つけにくくなりますし、
if文に書き直した方が安全なんでしょうかね。
Re:よくいわれますが (スコア:1)
「if文」は、これはこれで「本当に == 以外の条件マッチを書いてないだろうな?!」と疑心暗鬼にならなくちゃいけないので難しい。
結局、「どう書くとよいか」じゃなくて、「書いた奴が信頼できる奴かどうか」という問題に過ぎない、というのが私の結論。信頼できるのならば switch/case 文で書ける場合はそのほうが読みやすい。
# 読みやすいということはより多くの前提が存在するってことで、それらが信頼できなくなると一気に
# バグが発見しづらくなる。でもそれは、「読みにくく書けばバグが発見しやすくなる」という意味じゃない。
なので、私の場合、コード全体を見て、信頼できるようなコーダーかどうかをまず調査します。信頼できればよし。できないならば、書き直すことを提案できる根拠がないか探す。
# 信頼できない奴はライブラリに存在する処理を自前で書いていたりするので、そのあたりを中心に攻める。
fjの教祖様
なるほど。 (スコア:1)
人格を見るのではなく、その人がコーディング作業で出力する成果の品質をみるってことですよね?(真顔)
#その人を見る とかいう芸当が多分できないのでID
(しかも、私はたぶん失格の部類に入るんじゃないかとガクブル
コメントありがとうございます。
いえいえ、人格ですとも(^o^) (スコア:1)
人格ですよ (^o^)、もちろん。コードから著者の人格を読み取るのです。
もし、その人が「のほほ~ん」とした良い人というか、「竹本泉の漫画に出てきそうなタイプ」だったら、速攻で全コードレビューです。そんな危険な奴のコードなんぞ信じられるかっっ。
逆の例で言うと…例えばスター・ウォーズで言うなら、ダース・シディアスのコードは絶対信頼できる。疑って、疑って、普通の人ならば気が狂うぐらいの猜疑心と心配性の塊のような人のコードは、ほぼ確実に信頼できます。
フォースにはライトサイドもダークサイドもありますが、ソースには暗黒面とバグの2種類しかありません(断言)。
fjの教祖様
うっうっ (スコア:1)
コメントありがとうございます。
今回は、編集ついでに書きっぷりの気に入らないところも修正しようとしたらヤメレと言われてご機嫌斜めになったというエピソードでして、そんなところに「switch文はifに変えた方が安全かも」って聞いちゃったらますますモヤモヤしちゃうじゃないですかーーーー!!!
#今度書き直すときは気をつけてみます。
##if文にも、else抜けというこわーい罠があるなり。。
#switch文ともいうし、case文ともいうし、switch-case文ともいう。。
#まっ通じればいいんですけどね、多様ですなあ。。と思っただけ(^^)
pascal か、Cか (スコア:1)
Cでは
と書きますが、Pascalでは
の様に書くのです。だから switch-case 文だったり case 文だったりする。
ちなみに、私は case 文は Pascal 型の方が好き。「case文の最後に break; を書かないことで、処理記述量を減らす」のがCのswitch/case文の良いところだ、と良く言いますが、私25年もCでコード組んでいて、一度も その方が判りやすいコードになる パターンを見たことが無い。ずーっと break 文を書き忘れたのか、意図的なのか、悩まなくちゃいけないような場合ばかり。最終的に判るのは
「書いた人はわざとそうしたかったらしいが、そのロジックはバグっている」
とかいう身も蓋もない…
そんなことで悩まされるぐらいなら、なんども同じこと書く羽目に陥った方が楽じゃっ というのが Pascal 型 case 文が好きな理由ですね。
fjの教祖様
経験あります (スコア:1)
コメントありがとうございます。
見つけたときの虚無感ったらないですよね。。break忘れ。
静的解析ツールをかけてないのかって?…げほんげほん、
ツールも使いますけど、ツールの出番は大抵、何らかの不具合(例えばbreak抜け)が発覚したとき、類似事象を大量のコードから洗い出すために使うことが殆どで、個別のファイルを編集・修正しているときは人手で対応しています、私(の部署)の場合。
#最後の2節目って何?スパイラルの最後の2回しってことでしょうか?
Callerを調べたほうがよいかも (スコア:1)
呼び出し側を調べたほうがよいかと。
呼び出している側で、戻り値を使っていないのであれば、コメントを関数の先頭と問題の return; 文につけた上で上司に報告して放置(この場合はそもそも戻り値に意味があるのか、あるのに caller が使っていないのが悪いのか、調べる必要がでる)。
しかし、使っているのであれば危険なので直すよう主張するべき。一旦見失うと、ランダムにしか見えない戻り値がなぜ発生するのかで悩む事になりかねません。
fjの教祖様
Re:Callerを調べたほうがよいかも (スコア:1, おもしろおかしい)
Re:Callerを調べたほうがよいかも (スコア:1)
コメントありがとうございます。
今回は、手で書きなおしました。
下手に自動化して中身を間違えたらマジで洒落にならない予感がするのと、そんなプリプロセッサを作るだけの器量がありません(;へ;)
#優しく教えて下さいm(__)m
Re:Callerを調べたほうがよいかも (スコア:1)
コメントありがとうございます。
今回の返り値の型が違うreturn文を含むファイルをざざーっと眺めてみたところ、return(int型);という正しい書式と、return;という書式が入り交じっていたので、Aさんが最初正しい表記をしていたのに、そこに追加編集をしたBさんがコピペで型の違うreturnを貼っちゃったんじゃないかな~と思っています。
#あまりにも耐えられなかったので先輩の忠告を無視して修正しちゃいました