vaxocentrism
/vak`soh·sen´trizm/, 名詞
[‘ethnocentrism(自民族中心主義)’との類推から] VAXen上では(とりわけUnixのもとで)妥当だが他では誤りであるような、ある種の仮定に従ってコーディングし続けるCプログラマを苦しめるとされる、概念上の病。その中には次のものがある。
ヌルポインタの逆参照は、それが全ビット0であり、ロケーション0が読み取り可能で0であるため安全である、という仮定。問題: これは代わりに非VAXenで、さらにはBSD Unix以外のOSのもとではVAXenでさえ、不正アドレストラップを引き起こすことがある。たいていこれは、誤機能の意図的な悪用というより、ずさんなコードの暗黙の仮定(使う前にポインタをチェックし忘れること)である。
文字が符号付きであるという仮定。
ある型へのポインタは、他のいかなる型へのポインタにも自由にキャストできるという仮定。これのより強い形は、すべてのポインタが同じサイズと形式であるという仮定であり、これは呼び出しでキャストや型を正しくすることを気にしなくてよいことを意味する。問題: これはワード指向のマシンや、複数のポインタ形式を持つ他のマシンでは破綻する。
ルーチンのパラメータがメモリ上に、スタック上に、連続して、厳密に昇順または降順で格納されるという仮定。問題: これは多くのRISCアーキテクチャで破綻する。
ポインタ型と整数型が同じサイズであり、ポインタを整数変数に詰め込んで(またその逆も)、切り詰められたり破損したりせずに再び取り出せるという仮定。問題: これはセグメント化されたアーキテクチャや、おかしなポインタ形式を持つワード指向のマシンで破綻する。
どんなサイズのデータ型もメモリ内の任意のバイトアドレスから始められる(たとえば、奇数のcharアドレスにワードサイズ以上のオブジェクトへのポインタを自由に構築し逆参照できる)という仮定。問題: これはHLLの実行速度向けによりよく最適化された多くの(とりわけRISCの)アーキテクチャで破綻し、不正アドレスフォールトやバスエラーを引き起こすことがある。
(関連して)型の末尾にパディングがなく、ゆえに配列内で前の要素の最後のバイトから次の要素の最初のバイトへ直接進めるという仮定。これはマシンだけでなくコンパイラにも依存する。
メモリのアドレス空間が大域的にフラットであり、配列参照
foo[-1]が必ず妥当であるという仮定。問題: これは0で、あるいはIntelチップのようなセグメントアドレス指定のマシンでは他の場所で破綻する(そう、セグメント化は普遍的にマシンを設計するbrain-damagedな方法だと考えられている(mobyを参照)が、それは別の問題である)。オブジェクトは特別な配慮なしに任意に大きくできるという仮定。問題: これはセグメント化されたアーキテクチャや、非仮想アドレス指定の環境のもとで破綻する。
スタックはメモリと同じだけ大きくできるという仮定。問題: これはセグメント化されたアーキテクチャや、仮想アドレス指定とページ化されたスタックを持たないほぼ他のあらゆるもので破綻する。
オブジェクト内のビットとアドレス指定可能な単位が同じ順序で並んでおり、その順序が自然の定数であるという仮定。問題: これはbig-endianなマシンで破綻する。
同じ配列内にない異なるオブジェクトへのポインタ、または異なる型のオブジェクトへのポインタを比較することに意味があるという仮定。問題: 前者はセグメント化されたアーキテクチャで、後者はワード指向のマシンや、複数のポインタ形式を持つ他のマシンで破綻する。
intが32ビットであるという仮定、あるいは(ほぼ等価だが)
sizeof(int) ==sizeof(long)という仮定。問題: これはPDP-11、286ベースのシステム、さらには一部のコンパイラのもとでは386や68000のシステムでさえ破綻する(そしてもちろん、Alphaのような64ビットシステムでも)。argv[]が書き込み可能であるという仮定。問題: これは多くの組み込みシステムのC環境で、さらにはわずかながらいくつかのUnixの系統のもとでも破綻する。
プログラマは、たとえVAXを一度も見たことがなくても、正当にvaxocentrismだと非難されうることに注意せよ。これらの仮定の一部(とりわけ2〜5)は、元祖のCマシンであるPDP-11では妥当であり、VAXより何年も前に蔓延していた。vaxocentricityおよびall-the-world's-a-VAX syndromeという用語が同義に使われてきた。