まったくの余談ですが、 gcc の警告フラグの話題。
FreeBSD では WARNS というマクロで警告レベルを定義すると、
それぞれ CFLAGS に以下のオプションを付けてコンパイルするように
なっています。(WARNS の仕組み自体は NetBSD 由来)
レベル1:
-Werror
レベル2:
-Wall -Wno-format-y2k -Wno-uninitialized を追加
レベル3:
-W -Wstrict-prototypes -Wmissing-prototypes
-Wpointer-arith -Wno-uninitialized を追加
レベル4:
-Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch
-Wshadow -Wcast-align を追加
レベル5:
-Wuninitialized を追加
レベル6:
-ansi -pedantic -Wbad-function-cast -Wchar-subscripts
-Winline -Wnested-externs -Wredundant-decls を追加
(このレベル6までのフラグは bde / FreeBSD.org が提唱したので俗に
BDECFLAGS と呼ばれている)
さらに、 printf() 系関数の引数チェックを行いたい場合には以下も
追加されます。(WFORMAT が定義されているとき)
GCC 2.95.x:
-Wformat-nonliteral -Wformat-security -Wno-format-extra-args
GCC 3.0以降:
-Wformat=2 -Wno-format-extra-args
むろん、
- コードの性質上、警告の回避が不可能なことも多い
- コンパイラの警告が的外れな場合もある
- 警告はあくまでバグを発見する手助けであり、警告をすべてなくす
ことが目的ではない
などを考慮し、本末転倒に陥らない程度に活用しています。
たとえば、一度レベル3を達成したモジュールについては Makefile に
WARNS=3 と埋め込み、将来に渡って維持するよう頑張るといった具合。
正直な話、 BSD のコードは Ruby とは違って汚いところがわんさか
あるので、 audit を含めてそういうことを持続的にやっていかないと
ダメなんだと思う..
--
/
/__ __ Akinori.org / MUSHA.org
/ ) ) ) ) / FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp
"When I leave I don't know what I'm hoping to find
When I leave I don't know what I'm leaving behind.."