a wandering wolf

Does a wandering wolf dreams of a wondering, sometimes programming sheep?

このエントリーをはてなブックマークに追加

D言語のプログラムがリターンコード -8 で落ちる

はじめに

3年ぶりくらいにD言語の記事を書きます。

最近、とあるD言語のプロダクトを書いております。昨夜、新しいコミットをGitHubにプッシュしたところ、連携させているTravis-CIがテストプログラムを実行しようとして、謎のエラーを吐いて落ちました。

Job #7.1 - Gab-km/darjeeling - Travis CI

手元の環境(Windows 7/32bit/DMD 2.071.0)で動かしたときは問題ありませんでした。 Program exited with code -8 などと言われましても、果たしてこれが意味するところはいったい何なんでしょうか?

Issue 15573

ぐぐる大先生にお伺いしても、 exit code -8 に関する情報はなかなか出てきません。ようやくたどり着いた情報がこちら。

digitalmars.D.bugs - [Issue 15573] New: safe code using TLS works in debug; crashes in

DigitalMarsのITSにこのissueが登録されておりました。このissueではDMDの場合でだけ発生しているとのことですが、いくつか共通点があります:

  • Linux環境
  • x86_64
  • Program exited with code -8
  • ゼロ除算してる

おや?という感じです。僕が失敗したコミットには、テスト用にゼロ除算のコード(直接 1/0 みたいにやると、そもそもコンパイルに弾かれるので、0をいったん変数に入れたりしてます)があります。

これはもしやと思って、テストコードを修正しました。ここでやりたかったのは、 Exception ではなく Error を発生させたい、というだけです。なので、最初は簡単にゼロ除算でやってのけようとしましたが、 Error インスタンスを直接投げるようにしてみました。

このコードをコミットしてプッシュしたところ、なんと言うことでしょう、Travis-CIはその仕事をやりきったのです…。

ところで、このスレッドを追いかけて知ったんですが、Exit code -8 ってSIGFPE (floating point exception)のことなんですね。

Man page of SIGNAL

さいごに

上記issueはとりあえず謎の議論が続いた後、修正版がGitHubに上がって DMD 2.071に入ってるようです。ただ、同じバージョンを使っているのになぜ僕の環境(Windows/32bit)では大丈夫でTravis-CI(Linux/64bit)では駄目なのか、よく分かりませんね。32ビット版と64ビット版の違いがあるんでしょうか。

とりあえずは、ゼロ除算しないように気を付けましょう。現場からは以上です。