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

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

          今回のケースでは必要ないけど、#2550910がいうような凡ミスを防ぐために習慣的に付けるよね。多少のタイプ量以上のオーバーヘッドもないし。

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

            後から読むときもループなのか、終了条件は・・・ループじゃねえのか!なんでdo while付いてんだ!ってオーバーヘッドがあるじゃん。
            #2550910がいうミスを防ぐなら括弧だけでいいのに

            親コメント
            • by Anonymous Coward

              do while (0)は使い古されたテクニックだから、そういうもんだと一度覚えればいいだけだが。
              こういうBad Know Howを嫌うのも仕方ないけど、Cだからね。
              で、括弧だけではダメな理由は、

              if (foo == true)
                  ErrorCheck();
              else
                  ...

              がコンパイルエラーになること。やってみそ。

            • by Anonymous Coward
              複文からなるマクロはdo while(0)で囲むというのはまあ普通のイディオムではあるのだけど、元コメみたいなアホが理解しないでコピペで使ってどこか別の場所で惨事を引き起すだろうから、やっぱり技巧的なマクロはコーディング規約で使用禁止にすべきかもしれないな。

あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall

処理中...