ご存知のように、C標準では、NULLポインターの値、ビットとバイト(endiannes)の順序、構造体とスタックパラメーターの配置、メモリの実際の編成など、実装の詳細はあまり指定されていません(私はスタックレイアウトはまったく必要だと思います。「自動」だけです。
さらに、nullの逆参照(通常はセグメンテーション違反ですが、必ずしもそうとは限りません)など、未定義の動作を生成するために、代わりに他のいくつかの部分が定義(または未定義)されます
最新のプラットフォーム(またはコンパイラー次第ですか?)(意図的に?)は同様に動作するため、プログラムの一貫した動作の一部は、実際には信頼するのが危険です。
それで、標準的ですが、バグを生成し、未定義の動作と移植性を指摘するために意図的に奇妙なunixバリアントまたはunixに触発されたプラットフォーム(またはコンパイラー次第ですか?)はありますか?
同様ですか?存在しますが、CではなくPOSIXの場合ですか?試して実装するのは合理的なことでさえありますか?
承認された回答:
ヒューレットパッカードのHP-UXは、私が考えることができる最も近いものです。
これを変更するフラグがありましたが、CコンパイラはNULLポインタの逆参照を許可します。 PA-RISCハードウェアでは、スタックは「上に」(より大きなアドレスに向かって)成長し、ヒープは(より小さなアドレスに向かって)成長しました。
PA-RISCハードウェアには、スタック/ヒープの反転以外にもいくつかの奇妙な点がありました。セグメントレジスタ(x86セグメントとは異なる動作)を備えていたため、さまざまなライブラリが実際には異なるセグメントに存在し、関数へのポインタは単一の64ビットポインタではありませんでした。ただし、PA-RISCがSPARCのようにポインタの配置に厳密であったかどうかは覚えていません。
やや利用可能なレベルでは、Clang、Pcc、さらにはTccなどのCコンパイラを使用できますが、私が理解しているように、Tccには「弱いシンボル」のためにGNUリンカーとローダーにいくつかの問題があります。少なくとも、これらの代替コンパイラからは異なる警告メッセージが表示されますが、これは常に価値があります。
また、DietLibcやMuslなどの代替Cライブラリを試すこともできます。 GNU Libcとは対照的に、Muslに対してコンパイルした場合、コードにさまざまな処理を実行させました。これらのライブラリは両方とも静的リンクをサポートしており、GNULibcはこれを困難または不可能にします。 Muslには非常に異なるダイナミックリンクシステムがあり、コードに潜在的なバグが発生する可能性があります。
関連:Ubuntu – pam_execに現在のユーザーとしてスクリプトを実行させる方法は?