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みたいなデバッグツールとして利用するしかないんじゃないかと思います。