質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
2038年問題

2038年問題とは、UNIX環境下のシステムが時刻を格納する変数のオーバーフローで誤作動を起こす可能性があると言われる問題。2038年1月19日3時14分7秒になると引き起こされると考えられています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2953閲覧

std::chrono::steady_clockは2038年問題等に対応しているか

hiroki_s

総合スコア13

2038年問題

2038年問題とは、UNIX環境下のシステムが時刻を格納する変数のオーバーフローで誤作動を起こす可能性があると言われる問題。2038年1月19日3時14分7秒になると引き起こされると考えられています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/11/04 02:23

編集2020/11/06 05:14

C++のstd::chrono::steady_clockを使用して経過時間の差分を計測したいと考えているのですが、chronoで2038年問題のような「bit幅が不十分な整数型の利用によって生じる問題」は発生しうるでしょうか?(質問がわかりにくかったためyohhoyさんの表現をお借りしました)

問題になるような実装はしないと思うのですが、裏付ける物を見つけられなかったため質問しました。

組み込みシステムでの利用を考えており、詳細は以下の通りです。

  • CPU: Arm(32bit)
  • OS: Linux(Yocto) カーネル3.2以降
  • コンパイラ: gccのC++14に対応している物

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

C++のstd::chrono::steady_clockを使用して経過時間の差分を計測したいと考えているのですが、chronoは2038年問題に対応しているのでしょうか?(2038年問題の時刻をまたぐ際に正常に計算できるか)

C++標準ライブラリのstd::chrono::steady_clockは、基点(epoch)を特に定めない「時間逆行しない時計(clock)」としか定義されません。(外部サーバとの時刻同期操作などの要因によって、通常の“システム時計”はプログラムからみて時間逆行する可能性があります。)

2038年問題 は「UNIX epoch(1970-01-01T00:00:00Z)からの経過時間を32bit幅符号付き整数型で表現 するケースで生じうる問題」を指します。UNIX epochと異なる基点をもつ時計においては、狭義の2038年問題とは無関係です。
C++標準ライブラリではstd::chrono::system_clockや、C++20で追加されるutc_clockがUNIX epochと同じ基点を持ちます。

2038年問題を「bit幅が不十分な整数型の利用によって生じる問題」と広く解釈した場合、厳密にはC++標準ライブラリの実装品質(Quality of Implementation)依存となります。とはいえ、2038年問題が認識されてから実装されたライブラリにおいて、そのような低品質な実装が存在するとは考えにくいでしょう。

投稿2020/11/06 04:45

編集2020/11/06 04:53
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki_s

2020/11/06 05:23

ご回答ありがとうございます。 わかりにくい質問ですみません。「bit幅が不十分な整数型の利用によって生じる問題」です。 実装依存とのことですが、このあたりの資料をご存じでしたら教えていただけるとありがたいです。 おっしゃるように、そんな低品質な実装はしてないと思うのですが、出来たら裏付けが欲しいなと思っていまして。
yohhoy

2020/11/06 07:08 編集

文字通り実装依存ですので、ご利用の環境で直接確認する以外にすべはないです。 例えばこちらの環境では 63bit幅(符号ビットあわせて64bit幅)で表現されており、292年はカウンタが回り切りません。 https://wandbox.org/permlink/XyAaCWU7KLEHTKqy 補足:64bit幅整数型を使っていますが分解能がナノ秒=10^-9となっているため、最大値は 2**63 / (10**9) / 60 / 60 / 24 / 365 ≒ 292年 となります。
hiroki_s

2020/11/09 04:50

ご回答ありがとうございます。 実動作とコード確認してみたいと思います。
guest

0

おそらく可能です

std::chrono::steady_clockの返却する型time_pointの最大サイズは、以下で確認できます

time_pointのMaxサイズ

これはWikipeに西暦3000億年まで保存できるサイズとして紹介されています

Wikipedia

不安であれば、
PCの時間を2038年になるようにして確認すればよいと思います

投稿2020/11/04 05:05

Moineau26518805

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki_s

2020/11/04 05:23

ご回答ありがとうございます。 サイズ的に問題ないのは承知していたのですが、内部の処理も問題ないでしょうか?問題ないように作ると思いますが、確信がないので念のため… PCの時刻変更については、steady_clockだと時刻に影響を受けないので確認することが出来ません。(実動作は確認していないので後で確認してみます)
Moineau26518805

2020/11/04 05:54 編集

ドキュメントには、 steady_clockのエポックは未規定だが、多くの実装ではプログラム起動時間が時間ゼロのエポックとして定義され、その時間からの時間間隔がカウントされる。とされています https://cpprefjp.github.io/reference/chrono/steady_clock.html つまり、UNIX時間の開始時刻の代わりにプログラムの開始時刻を開始時刻として、そこからの経過秒数をカウントします そのカウントされている時間が 2,147,483,647秒を超えるとエラーになるかという話だとすると、 返却されている型のサイズ的には可能ですが、 確認する手段はわからないです(エポックの初期値を弄れれば可能) 実時間の2038年がカウントに影響あるかは PCの時間をずらして動作させ、動くのであれば問題ないと思います
hiroki_s

2020/11/09 04:51

ご回答ありがとうございます。 エポック初期値の変更を検討してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問