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)のことなんですね。
さいごに
上記issueはとりあえず謎の議論が続いた後、修正版がGitHubに上がって DMD 2.071に入ってるようです。ただ、同じバージョンを使っているのになぜ僕の環境(Windows/32bit)では大丈夫でTravis-CI(Linux/64bit)では駄目なのか、よく分かりませんね。32ビット版と64ビット版の違いがあるんでしょうか。
とりあえずは、ゼロ除算しないように気を付けましょう。現場からは以上です。