あと、WATCOMのターゲットはWindowsなので、UNIX関連はまた別になるけど
- voidの関数が値を返すようなreturnをするとコンパイルエラー
- これはGCCやMSVCが甘すぎるのだと思う。正直こうあってほしい。
- small、medium、large、hugeがマクロとして定義されてる
- Linux版GCCのgetcとかputcのマクロ並に邪悪です。速攻undef。
- 構造体の初期化で使えるのは定数のみ
- 結構使っている箇所があった。正直許せよこれくらいと思った。
- NaNが0より大きい
- これははまった。数字じゃないのに、そんなの返すなよ。多分コンパイラのバグ(と思う)。
- 左シフトで桁あふれすると0になる
- Cの規格では未定義動作なのでコンパイラの警告を無視していた僕が悪いのだが。
- 静的領域や大域変数は4バイト境界に配置
- 8バイトを期待したコードを書いていると困る。doubleを噛ませても問答無用だった。__farキーワードで回避
- exp、log、powが微妙
- まだ原因を特定してないけど、上記の数学関数がOverflowやらRange errorやらDomain errorを投げる。GCCとMSVCは投げない。多分シフトの桁あふれと関連してるのだろう。中身があんまり賢くないようだ。
- externされている大域変数の参照が不正
- __farキーワードのせいなのか、LoadLibraryの問題なのかは分からない。後者はWin32 APIだからちょっと考え難いか。前者かな?リンカーという線もあるが。
- modfにINFINITYを渡すとNaNを返す
- GCCとMSVCは0を返す。
- 根本的にNaNの扱いがおかしい
- NAN==0.0が真になるとかありえないだろう。他にもいろいろ偽を返すべきところで真を返す。
- logに-INFINITYを渡すとDomain error
- だけならいいんだけど、そのまま-inf.0を返しやがる。+nan.0を期待しているのだが・・・
- エクスポートされる関数の名前がおかしい
- 普通は_nameなんだけど、name_と逆になる。dllexportがおかしい?。__cdeclをつける必要あり。
また、動的モジュールのロードがおかしいのか分からないけど、拡張モジュールがまったくテストできない。
あまりメジャーな処理系ではないらしく、資料もそんなにないし、マニュアルでは痒いところに手が届かない(8バイト境界とか)。2日で何とかなるとは思っていなかったが、想像以上に癖がありすぎて挫折しそう。
とりあえずブランチ切ってコミット。他の処理系で問題なく動くならマージしようかな。とりあえず入れておけば誰か(一人プロジェクトなのに?)が突っ込みいれてくれるかもしれない。
No comments:
Post a Comment