パスワードを忘れた? アカウント作成
196148 journal

yuriの日記: C言語の switch文のdefault抜け 12

日記 by yuri
  • defaultを(わざと無いのではなく)書き忘れていると思しきコード
  • intなのにreturn;を返しているコード

他にもあるけど編集中のコードにこういうのがあると直したくて仕方がなくなっちゃう。

けど、動いているものを(問題になっている箇所以外は)いじってはならぬというお達しがあるので、コンパイル時に大量の警告を見て悲しい気持ちになる。

警告レベルを下げればいいじゃん!というアドバイスもあるけれど、せっかく色々コンパイラが教えてくれるのを今更取りやめるのも勿体無いきがするのよね。。

コーディング中にちょっとブルーな気持ちになりました。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2010年02月24日 16時17分 (#1723225)
    defaultで抜けるより、case節でbreak;忘れて抜けて下へ突き進む方が怖いです。

    とくに最後の2節目あたりでやるとテスト抜けが多い。
    • by Anonymous Coward

      switch文でのミスってコードカバレッジでも見つけにくくなりますし、
      if文に書き直した方が安全なんでしょうかね。

      • 「if文」は、これはこれで「本当に == 以外の条件マッチを書いてないだろうな?!」と疑心暗鬼にならなくちゃいけないので難しい。

        結局、「どう書くとよいか」じゃなくて、「書いた奴が信頼できる奴かどうか」という問題に過ぎない、というのが私の結論。信頼できるのならば switch/case 文で書ける場合はそのほうが読みやすい。
        # 読みやすいということはより多くの前提が存在するってことで、それらが信頼できなくなると一気に
        # バグが発見しづらくなる。でもそれは、「読みにくく書けばバグが発見しやすくなる」という意味じゃない。

        なので、私の場合、コード全体を見て、信頼できるようなコーダーかどうかをまず調査します。信頼できればよし。できないならば、書き直すことを提案できる根拠がないか探す。
        # 信頼できない奴はライブラリに存在する処理を自前で書いていたりするので、そのあたりを中心に攻める。

        --
        fjの教祖様
        • 人格を見るのではなく、その人がコーディング作業で出力する成果の品質をみるってことですよね?(真顔)

          #その人を見る とかいう芸当が多分できないのでID
          (しかも、私はたぶん失格の部類に入るんじゃないかとガクブル

          コメントありがとうございます。

          • 人格を見るのではなく、その人がコーディング作業で出力する成果の品質をみるってことですよね?(真顔)

            人格ですよ (^o^)、もちろん。コードから著者の人格を読み取るのです。

            もし、その人が「のほほ~ん」とした良い人というか、「竹本泉の漫画に出てきそうなタイプ」だったら、速攻で全コードレビューです。そんな危険な奴のコードなんぞ信じられるかっっ

            逆の例で言うと…例えばスター・ウォーズで言うなら、ダース・シディアスのコードは絶対信頼できる。疑って、疑って、普通の人ならば気が狂うぐらいの猜疑心と心配性の塊のような人のコードは、ほぼ確実に信頼できます。

            フォースにはライトサイドもダークサイドもありますが、ソースには暗黒面とバグの2種類しかありません(断言)。

            --
            fjの教祖様
      • コメントありがとうございます。

        今回は、編集ついでに書きっぷりの気に入らないところも修正しようとしたらヤメレと言われてご機嫌斜めになったというエピソードでして、そんなところに「switch文はifに変えた方が安全かも」って聞いちゃったらますますモヤモヤしちゃうじゃないですかーーーー!!!

        #今度書き直すときは気をつけてみます。
        ##if文にも、else抜けというこわーい罠があるなり。。

        #switch文ともいうし、case文ともいうし、switch-case文ともいう。。
        #まっ通じればいいんですけどね、多様ですなあ。。と思っただけ(^^)

        • Cでは

          switch( value ) {
          case val1:
              ......
              break;
          case val2:
              .......
              break;
          ...
          default:
              .........
              break;
          }

          と書きますが、Pascalでは

          case ( value ) of
          val1: begin
                    .....
                end;
          val2: begin
                    .....
                end;
          val3..val4:
                begin
                    ,,,,
                end;
          else
                begin
                end;
          end;

          の様に書くのです。だから switch-case 文だったり case 文だったりする。

          ちなみに、私は case 文は Pascal 型の方が好き。「case文の最後に break; を書かないことで、処理記述量を減らす」のがCのswitch/case文の良いところだ、と良く言いますが、私25年もCでコード組んでいて、一度も その方が判りやすいコードになる パターンを見たことが無い。ずーっと break 文を書き忘れたのか、意図的なのか、悩まなくちゃいけないような場合ばかり。最終的に判るのは
          「書いた人はわざとそうしたかったらしいが、そのロジックはバグっている」
          とかいう身も蓋もない…

          そんなことで悩まされるぐらいなら、なんども同じこと書く羽目に陥った方が楽じゃっ というのが Pascal 型 case 文が好きな理由ですね。

          --
          fjの教祖様
    • コメントありがとうございます。

      見つけたときの虚無感ったらないですよね。。break忘れ。

      静的解析ツールをかけてないのかって?…げほんげほん、
      ツールも使いますけど、ツールの出番は大抵、何らかの不具合(例えばbreak抜け)が発覚したとき、類似事象を大量のコードから洗い出すために使うことが殆どで、個別のファイルを編集・修正しているときは人手で対応しています、私(の部署)の場合。

      #最後の2節目って何?スパイラルの最後の2回しってことでしょうか?

  • intなのにreturn;を返しているコード

    呼び出し側を調べたほうがよいかと。

    呼び出している側で、戻り値を使っていないのであれば、コメントを関数の先頭と問題の return; 文につけた上で上司に報告して放置(この場合はそもそも戻り値に意味があるのか、あるのに caller が使っていないのが悪いのか、調べる必要がでる)。

    しかし、使っているのであれば危険なので直すよう主張するべき。一旦見失うと、ランダムにしか見えない戻り値がなぜ発生するのかで悩む事になりかねません。

    --
    fjの教祖様
typodupeerror

192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり

読み込み中...