NetBSD6.X (i386)が2038年問題に対応、その余波

2,037 views

Published on

NetBSD6.X (i386)が2038年問題に対応しましたが、その余波で clu2c が同OSで動かなくなりました。そのりゆうについて述べます。

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,037
On SlideShare
0
From Embeds
0
Number of Embeds
19
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

NetBSD6.X (i386)が2038年問題に対応、その余波

  1. 1. NetBSD 6.X (i386)が2038年問題に対応その余波東平洋史
  2. 2. こんなん動態保存してます
  3. 3. clu2c(くるーつーしー)とは何ですか?プログラミング言語CLUの処理系• プログラミング言語CLUで書かれたプログラムをCで書かれたプログラムに変換(CLU to C)• Cで書かれたプログラムを実行形式(a.out)にコンパイルCLUのプログラムCのプログラムclu2cライブラリclulink実行形式a.out
  4. 4. clu2cでの戻り値の処理• Cの関数の戻り値– 正常終了か例外発生するかのフラグ• CLUの戻り値– 大域変数に格納retval_area[0]retval_area[1]…オブジェクトintポインタ
  5. 5. 整数型とビット数データモデルシステム long longlongポインタILP32 NetBSD 5.X(i386)32 64 32ILP32 NetBSD 6.X(i386)32 64 32LP64 64bit Linux 64 64 64LP64 NetBSD 6.X(amd64)64 64 64
  6. 6. clu2cでのint型(CLU)とビット数データモデルシステムint型(CLU)戻り値用大域変数ポインタILP32NetBSD 5.X(i386)32 32 32ILP32NetBSD 6.X(i386)32 32 32LP64 64bit Linux 64 64 64LP64NetBSD 6.X(amd64)64 64 64
  7. 7. 稼働確認済みの環境(一部)• Cygwin• Ubuntu 13.04– i386– amd64• OpenSUSE 12.3– 32bit– 64bit• FreeBSD 9.1– i386• NetBSD 5.2– I386– amd64• NetBSD 6.0.1– i386– amd64• NetBSD 6.1– i386– amd64
  8. 8. 稼働確認済みの環境(NetBSD)• NetBSD 6.0.1–i386–amd64• NetBSD 6.1–i386–amd64• NetBSD 5.2–I386–amd64
  9. 9. NetBSD 6.Xでは64bitでのみ可動
  10. 10. その前に
  11. 11. 西暦2038年問題(C言語のtime_t型)• 西暦2038年1月19日3時14分7秒(UTC)過ぎにC言語のtime_t型を使ったプログラムが誤作動– 西暦1970年1月1日0時0分0秒(UTC)からの経過秒数で時間を表現– 32ビット符号つきの整数で実装した場合に問題発生– 西暦2038年1月19日3時14分7秒(UTC)⇒西暦1901年12月13日20時45分7(UTC)•2^31 – 1 = 2147483647 の次を -2^31 = -2147483648 と認識0 1111111111111111111111111111111 = 2^31 - 11 0000000000000000000000000000000 = -2^311 1111111111111111111111111111111 = -1先頭のビットが1の時はマイナスの数になる
  12. 12. NetBSD 6.X になって…In addition to many other features, NetBSD6.0 includes significant developments invarious ports. Some highlights:• time_t is now a 64-bit quantity on allNetBSD ports. This means that theNetBSD world no longer ends in 2037.<http://www.netbsd.org/releases/formal-6/NetBSD-6.0.html>
  13. 13. NetBSD 6.X のtime_t型 は64bit
  14. 14. clu2cでのtime_t型intとして扱う使用例get_atime = proc(S: _external_struct_stat) returns(int)% effects Returns the `st_atime member of S.end get_atimeget_mtime = proc(S: _external_struct_stat) returns(int)% effects Returns the `st_mtime member of S.end get_mtime
  15. 15. 整数型とtime_t型とビット数データモデルシステム time_tCLUのint戻り値用大域変数ポインタILP32NetBSD 5.X(i386)32 32 32 32ILP32NetBSD 6.X(i386)64 32 32 32LP64 64bit Linux 64 64 64 64LP64NetBSD 6.X(amd64)64 64 64 64
  16. 16. 整数型とtime_t型とビット数データモデルシステム time_tCLUのint戻り値用大域変数ポインタILP32NetBSD 6.X(i386)64 32 32 32ココだけ違う
  17. 17. というわけで
  18. 18. NetBSD 6.X で clu2c が動かない理由• Cの time_t 型が64bitになった– NetBSD 5.X までは 32bit• clu2cはCの time_t 型をCLUの int 型 として扱っていた• 32bit アプリケーションではCLUの int 型を32bitにしていた
  19. 19. 解決策(実装作業中)• Cの time_t 型専用の型を作成• CLUの time_t 型の具体表現を32/64bit両対応にCの time_t 型ポインタ32bit or 64bit32bit
  20. 20. おしまい(^.^)/~~~

×