Fail-Safe C
「Fail-Safe C」を試してみました。
テストコードはZDNetの「C/C++のポインタの機能--変数の場所(アドレス)」から拝借しました。
% cat > zdnet.c int main( void ) { int *n; *n = 5; /* ポインタ変数nに値5を代入 */ printf( "%d\n", *n ); /* ポインタ変数nが持つ値(5)の出力 */ return 0; } ^D % fscc -o zdnet -g zdnet.c warning: undeclared function "printf" called. % ./zdnet -------------------------------- Fail-Safe C trap: accessing null pointer Address: (nil) + 0 Cast Flag: not set backtrace of instrumented code: Using host libthread_db library "/lib/libthread_db.so.1". -------------------------------- アボートしました %
エラーを検知するとabort()するようです。
どの辺が安全なんだかよく分からず、プレスリリースを読んでみたところ、バッファオーバーフローしてもコードを注入する前に落ちるからOKという意味の安全らしいです。
あぁ、それでフェイルセーフなんですね。
このコンパイラの目的は、再コンパイルするだけでフェイルセーフなプログラムに置き換えられるようにすることのようですが、通常のプログラムより3〜5倍遅いそうなので現実的には厳しいですね。
CodeGuradみたいなデバッグツールとして利用するしかないんじゃないかと思います。