パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

iOS7.0.6で修正された「最悪のセキュリティバグ」はありがちなコーディングミスで発生していた」記事へのコメント

  • 警告を無視しちゃいかんという教訓を得たと。

    こんな感じに、if分を一行にまとめてしまえば、こんな不具合出なかった気がします。

    if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail;
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail;
    if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail;

    一行が長くなるのを嫌ったのかな?

    • by Anonymous Coward

      #define ErrorCheck(f) do { if ((err = f) != 0) goto fail; } while (0)

      ErrorCheck(SSLHashSHA1.update(&hashCtx, &serverRandom));
      ErrorCheck(SSLHashSHA1.update(&hashCtx, &signedParams));
      ErrorCheck(SSLHashSHA1.final(&hashCtx, &hashOut));

      ってやりたくなるんだけど、ダメ?

      • by Anonymous Coward

        do while いるの?

        • by Anonymous Coward

          do whileがなかったら、
          if ( foo == true )
              ErrorCheck()
          else
              ErrorCheck()
          これが
          if ( foo == true )
              if(~) goto fail;
          else
              if(~) goto fail;
          になってしまう。凡ミスを防ぐための処理。
          fooがtrueでない場合にelseのほうを実行してほしいのに、マクロ展開すると、fooがfalseだとなにも実行されないという。
          まぁ、これもカッコつけろよって話なんだけど。

          • by Anonymous Coward

            doとwhile(0)が必要な理由になってないんだけど・・・

            • by Anonymous Coward on 2014年02月24日 19時34分 (#2550949)

              マクロ関数を普通の関数のように最後に ; を付けて適切に展開されるようにするため。

              do while (0) なしだと

              if ()
                  ErrorCheck(...);
              else
                  ErrorCheck(...);

              if ()
                  { ... };
              else
                  { ... };

              となり、 if の終わりの {} の後の ; が空文となるので、 else の行で文法エラーとなる。

              do while (0) ありだと

              if ()
                  ErrorCheck(...);
              else
                  ErrorCheck(...);

              if ()
                  do { ... } while (0);
              else
                  do { ... } while (0);

              と、 if と else が適切に対応する形になるよう展開される。

              親コメント
              • by Anonymous Coward

                do~while(0)を使う理由はわかったが、
                if、elseには必ず{~}をつける、というルールを徹底した方が良い。
                レビューの度にこういう議論をしたくない。

              • by Anonymous Coward

                if()
                  ErrorCheck()
                else
                  ErrorCheck()

                でおk

              • by Anonymous Coward

                要は、マクロを思うように展開してくれないけど、それでもマクロを使いたいから余分な処理を付け足したということ?
                余分な処理をつけることに罪悪感無いのかなあ。

              • by Anonymous Coward

                #2550910だけど、私もそう思う。
                if文はカッコがないとコンパイルエラーにしちゃえばいいのにねぇ。

                考えてみたら、defineマクロにgoto入れられてたら、do while関係なしに投げ捨てたくなるわ。

                スマホで書き込んでるから、説明簡素化しすぎて伝えられなくてごめん。
                詳細に書いてくれた人ありがとう。

              • by Anonymous Coward

                Cでのイディオムのひとつです。
                いわゆるバッドノウハウの最たるものですけど。
                余分な処理()ってwwwww
                オプティマイザが消しちゃいますよ。
                なので「余分な処理()」に関しては全然抵抗ありません。

              • by Anonymous Coward

                > if文はカッコがないとコンパイルエラーにしちゃえばいいのにねぇ。
                #2553818参照

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

処理中...