YAMAHA RTシリーズに関連する話題
2001年9月9日問題
新規作成日 | 2001/Aug/30 |
最終変更日 | 2023/Jan/12 |
文書サイズ | 4.9KB |
2001年9月9日問題には対応していますか?
ヤマハRTシリーズでは2001年9月9日問題は存在しません。 2001年9月9日になっても特別な対応を取る必要はありません。
2001年9月9日問題とは、UNIX由来のtime()関数が返す戻り値が、 日本時間で2001年9月9日10時46分40秒に1,000,000,000となることにより 起きる問題のことを指します。time()関数の戻り値の扱い方により、 以下のような問題が起きる可能性があると指摘されています。
char timestr[10]; /* * バッファオーバーフローが発生する * この後の動作は予想できない */ sprintf(timestr, "%ld", time(NULL)); /* * こうすればバッファオーバーフローは発生しない * ただし、timestrにセットされる文字列は正しくない */ snprintf(timestr, sizeof(timestr), "%ld", time(NULL));
char time1[12], time2[12]; sprintf(time1, "%ld", time(NULL)); do_something(); sprintf(time2, "%ld", time(NULL)); if (strcmp(time1, time2) <= 0) { /* * 通常、上の条件文は必ず真であり、このブロックに進入することに * なるが、time1とtime2の間に問題の時刻が入っていると、条件は偽 * となる */ }
ヤマハRTシリーズはtime()関数相当の機能を持っていないため、time()関数に由来する 2001年9月9日問題は発生しません。
time()関数はUNIX由来の関数で、世界標準時の1970年1月1日0時0分0秒から 現在の時刻までの経過秒数を返す関数です。例えば、日本時間の2001年1月1日 0時0分0秒は、978274800となります。
初期のUNIXでは、time()関数の型はintとされ、表せる範囲が0〜2^31-1に限定されて いました。そのため、time()関数の戻り値が2^31-1となる2038年1月19日3時14分07秒 (世界標準時)以降が表現できないため、これをUNIXの2038年問題とも呼びます。 実際には、time()関数を持つOSのほとんどはすでにその型を符号付き 64ビット整数に変更しており、 2038年問題が発生するOSは古いものに限られています。
ただし、アプリケーションソフトの方でtime()関数の戻り値を32ビット整数として 保存している場合にはやはり問題が発生することが考えられます。 大きな話題となった2000年問題も、実際には1970年代にはその存在が知られており、 30年もあるのだからその間に問題を抱えているアプリケーションソフトはなくなって いるだろうとの楽観論が語られていたという話もありますので、 2038年問題もその時になってまた大騒ぎにならなければいいのですが…。
[ 関連FAQ ]
[ 関連情報 ]
[ FAQ for RT-Series ]
[ FAQ for TOPIC / files ]