OpenWatcom/Changes_in_1.5

OpenWatcom/Changes_in_1.5

このへん→http://www.openwatcom.org/index.php/C_Compilers_Release_Changes

例によって(無断で)てきとーに日本語訳。
OpenWatcom/Changes_in_1.4 も見たほうがいい鴨。

おまけ:Safer C Library に関連して、VC++ 2005 の CRT のセキュリティ強化

  • ISO/IEC TR 24731 "Extensions to the C Library, Part I: Bounds-checking interfaces" のサポートを C ライブラリに追加。 C コンパイラは __STDC_LIB_EXT1__ を(200509L に)定義する。 Safer C Library として知られる関数群である。 関数のくわしい説明については C Library Reference をご覧ください。
  • C99 モードでは、for ループの開始時に定義されたものだけでなく、ブロック内に書かれた定義もサポートされる。
  • C コンパイラは標準 C に要求されるマクロを定義する。 この中にはホスト環境とターゲット環境が同じであるとことを示す __STDC_HOSTED__(内容は 1)や C94/C99 サポートを示す __STDC_VERSION__(199409L か 199901L)が含まれ、コンパイル時のスイッチによって内容が変わる。
  • C コンパイラに __restrict キーワード追加。 C99 の restrict と同じだが、こちらは C99 モードでなくても常に使える。
  • C99 モードでは int を返す main 関数で明示的な return 文が必ずしも必要ではなくなった。 標準 C99 に従い、関数終了時に return 文がない場合は 'return 0;' があるものとする。
  • C コンパイラが修正され、__based(__self) ポインタ使用時にポインタを見失なわなくなった。 based 配列も正しく参照できるようになった。
  • 16ビット C++ コンパイラがポインタを __segment 型にキャストしてももう落ちない。 型キャスト実装がまともになった。
  • 16ビット C コンパイラの __segment 型も正しくキャストするよう修正され、ポインタのセグメント部分を返す。
  • C コンパイラが修正され、デフォルトの _DATA や _CONST を参照するセグメント名つき based セグメント( __based(__segname(name) ) )を正しくサポートするようになった。
  • コンパイラとライブラリヘッダが修正され、-ec スイッチでデフォルトコーリングコンバージョンを変更したときも標準ライブラリを正しく使えるようになった。
  • C コンパイラが修正され、#pragma data_seg で作成したセグメントはもはや DGROUP の一部ではない。 一般的に、pragma が使われるのは、出力モジュール中で物理的に切り離されたセグメント内にデータセグメントを置く必要があるときだけである。
  • 警告 W137, "Extern function 'fn' redeclared as static" を C コンパイラに新規追加。 既存のエラー E1072, "Storage class disagrees with previous definition of 'symbol'" は 'static' を 'extern' に再定義したときだけでなく 'extern' を 'static' としたときにも発生するようになった。 シンボルのリンケージ変更は未定義のふるまいを引き起こす、と ISO C にはある。
  • 警告 W138, "No newline at end of file" を C コンパイラに新規追加。 これは行の終端文字がひとつも見つからないままソースファイルが終わってしまった場合に発生する。 ISO C ではこのようなファイルを認めない。 改行文字が自動的に追加されるが、これは C++ コンパイラと同じ挙動になる。 改行文字がないと、それに先立って "#endif matches #if in different source file" という間違った警告を出す可能性があることに注意。
  • C コンパイラが修正され、修飾子が使われていない定義が事前に存在しても、__export や __declspec(dllexport) 修飾子を使った定義ができるようになった。 これは C++ コンパイラや他のベンダのコンパイラとも互換性がある。
  • ISO/ANSI モード(-za)で、プロトタイプのない関数の呼び出しがあった場合、コンパイラは常に警告するようになった。 拡張モード(-ze。デフォルト)では、それ以降のソースファイル中でプロトタイプを発見した場合、この警告 (W131) は抑止される。 拡張モードでの挙動は以前のバージョンから無変更であることに注意。
  • C コンパイラはインライン化された static 関数をオブジェクトファイルから除去するようになった(もちろん使われた場所にインライン化されて埋め込まれるわけですが)。
  • C コンパイラが修正され、64ビット整数の定数の場合のブール式(特に三項演算子)を正しく評価するようになった。 以前は上位32ビットが場合により無視され、誤った結果を導くことがありえた。
  • C コンパイラが修正され、浮動小数点定数を指示どおりの型に正しくキャストするようになった。 たとえば FLT_MIN が double で渡されたり格納されるとき、正しく処理するようになっている(精度変換を間違えない)。
  • C コンパイラのプリプロセッサで、引数が空のマクロの処理が直った。 以前の場合、引数が空のマクロはほぼ間違いなく無効なトークンを返してしまう。
  • のぞき穴最適化(peephole optimizer)をレジスタ割り当て後にもう一度かけることにした。 以前失った最適化の機会をコードジェネレータに利用させることができる。
  • flat モデルなどのように ES レジスタが変更不可(unalterable)とみなされている場合、コードジェネレータは __interrupt ルーチンのプロローグで(DS ロード直後に)DS の内容を ES にコピーするようになった。 たとえば memcpy() を呼び出したときなど、割り込みハンドラ内部で ES が明示的もしくは暗黙的に使われている場合のクラッシュをこれで防げるかと。
  • リンカその他のツールが修正され、コードセグメントが正しく分類されるようになった。 以前の場合、コードセグメントが間違ってデータに分類され、逆アセンブルやデバッグ情報の生成で不正な結果が出ることがあった。
  • コードジェネレータの、多数のメンバを持つ構造体や共用体のデバッグ情報出力に関連した性能の問題が修正された。
  • POSIX で定義されるヘッダ libgen.h が実装された。 これには basename() と dirname() の2関数が含まれている。
  • C ランタイムライブラリに btowc(), fwide(), mbsinit(), wctrans(), and towctrans() 関数が追加された。 これらの関数はすべてワイド文字と多バイト文字のサポートに関連するもので、ISO C 標準の 追補1(Amemdment 1)で定義されたものである。
  • C ランタイムライブラリに C99 の関数 llabs(), lldiv(), _Exit() が追加された。 最後のものは _exit() と等価であり、こちらは POSIX で定義されている。
  • C99 の浮動小数点分類マクロ(floating-point classification macros)が実装された。 これに含まれるのは fpclassify, isfinite, isinf, isnan, isnormal, signbit。
  • C99 で定義された printf/scanf 系関数の変換指定子 'hh', 'j', 'z', 't' が C ランタイムライブラリに実装された。 詳細は C ライブラリリファレンスをご覧ください。
  • printf/scanf 系関数の修飾子 'F' は、ISO C が定義する浮動小数点変換用の変換指定子 'F' と衝突する。 far ポインタの指示に 修飾子 'W' を使うことにし、これで置き換えてある。 DOS ビルドのランタイムライブラリはまだ修飾子 'F' を認識する(つまり ISO C が定義するところの変換指定子 'F' は使えない)が、もう修飾子 'F' はドキュメント化されないし、今後のリリースでは撤廃されるだろう。
  • printf/scanf 系関数で潜伏していたバグがいくつか修正された。 これはかなり厳重なテストのおかげで発見できた。 ユーザからの報告を受けたことは一度もない。
  • strtod 関数を拡張し、C99 の仕様に追随。 16進数の浮動少数点数だけでなく、無限(infinity)と NaN もパースするようになった。 詳細は C ライブラリリファレンス参照。
  • バイナリからより高精度な10進数への変換をするよう math ライブラリが修正された。 バイナリから10進数へ、およびその逆の変換で精度が落ちたり正しくない値を生成したりする場合の問題が修正される。
  • graphics ライブラリが修正され、行あたりのバイト数が画面上の横幅にそのまま対応していない VESA のモードでも正しく動作するようになった。
  • owcc ユーティリティの機能とドキュメントがさらに向上した。 このツールは POSIX スタイルのコンパイルドライバで、コマンドラインレベルでの gcc との互換性提供のために作られ、移植も容易である。
  • リンカのオプション NOEXTension がドキュメント化された。 このオプションはリンカに対し、実行ファイル名に拡張子(.exe とか .dll とか)をつけないよう指示する。 NAME ディレクティブの引数がそのまま使われることになる。 このオプションは初期のバージョンのリンカからサポートされてきたがドキュメント化されていなかった。
  • wmake の -ms モードでは、マイクロソフトや IBM の NMAKE との互換性のため、! なしの 'include' ディレクティブを認識するようになった。
  • wmake がプリプロセッサ命令 !if で NMAKE 形式の式 '[cmd]'(シェルコマンドなど)を評価できるように拡張された。 この機能は wmake の通常モード、-ms モードの両方でサポートされる。
  • リンカとデバッガで、Watcom デバッグ情報に関するいくつかの問題が修正された。 Watcom フォーマットは旧版扱いであり、その利用は推奨されないことに注意。
  • ごくまれにではあるが不定期に Windows ベースの GUI ツール(とりわけ wdw)が起動に失敗するが、これが修正された。