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

2038年問題まであと8億秒」記事へのコメント

  • >「32ビットの符号付二進数の桁あふれ」という理由を理解するには、ある程度の専門知識を必要とする

    「とりあえず31ビットの二進数の桁あふれ」という説明で良いんじゃないの?
    残りの1ビットはどこへいった?と聞いてくる人がいたら、それは符号ビットだよと答えれば良いし、そう質問する人はそういう説明を理解出来る人だろうからそれでいいでしょ

    • by s02222 (20350) on 2012年09月13日 11時14分 (#2230652)
      実はそれに加えてプログラミングに関する専門知識が必要です。C言語標準の場合、符号付整数の桁あふれは、未定義動作なので。

      time_t t = foo + bar;

      などとやった場合、コンパイラは「foo + barは、MAX_INT以下である」という前提でコンパイルしても良いことになっています。 「C言語 未定義動作 バグ」ぐらいでWebを検索するといろいろ具体例が出てきますが、例えばこれ [intransient.info]とか。

      time_t tomorrow = now + 60*60*24; //現在時刻nowから、丁度1日後の日時を求める

      if(tomorrow < now) {// 足してるのに小さくなっていると言うことはオーバーフローしたはず! 2038年問題!
      //対処コード
      }

      とか書くと、コンパイラは「正の整数を足してるんだから、値が小さくなるはずがない。C言語の規約で、オーバーフローするような計算はしちゃいかんことになっているから、オーバーフローが原因で負になる可能性も無い。よって、このif文の条件は常に非成立。if文の中身と条件判定を削除して高速化できるぜやっほー」、とやっても良かったりします。

      なので、ぱっと見に分かりにくいバグをはらんでたり、対処したつもりが何故か利かなかったりする可能性があります。 ややこしいので「その最適化はするな」というコンパイラオプションもあるので、とりあえずそれをONにして回った方がいいでしょうね。

      # ここまでintのオーバーフローが注目を集めたら、「これが未定義動作ってひどくね?」という方向へも話が飛び火したりしないのかな。
      親コメント
      • by Anonymous Coward

        あるいは実行時エラーでプログラムを停止する可能性もありますね。
        実際、規格上はゼロ除算の結果も「未定義」で、古いAndroidはゼロ除算でエラーを起こさず黙って間違った結果のまま実行を続けたりしてくれましたが規格上は完全に合法です。

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

処理中...