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

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

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

              do while (0) なしだと

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

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

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

              do while (0) ありだと

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

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

にわかな奴ほど語りたがる -- あるハッカー

処理中...