Ubuntuのchroot環境を作ってためしてみました。
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
最小ケースを作ってどうなるか確認するため、以下のソースを用意しました。
--
#include <stdio.h>
int main(void)
{
FILE *fp;
char array[10];
fp = fopen("/etc/hosts", "r");
fread(array, 9, 1, fp);
return 0;
}
--
しかし普通にgcc -Wallでコンパイルするとなにもいわれません。いろいろ試
したところ、-O2をつけると警告がでるようになりました。
# gcc -O2 -Wall foo.c
foo.c: In function ‘main’:
foo.c:8:7: warning: ignoring return value of ‘fread’, declared with attribute
warn_unused_result [-Wunused-result]
じゃあDebianはどうだろうかといろいろ試したのですが、
gcc: 4.7/4.8
libc: 2.13/2.17
どの組み合わせでも-O2をつけても警告がでません... Ubuntuの
/usr/include/i386-linux-gnu/sys/cdefs.h, Debianの
/usr/include/sys/cdefs.hで __wur というマクロを定義していて、freadに関
してはどちらも同じようにstdio.hの中でfreadのプロトタイプ宣言に__wurをつ
けています。なので、Debianでもオプション次第で有効にできそうなのですが
やり方がまだわかりません。
UbuntuでもDebianでもcdefs.hの定義は同じで、以下のようになっています。
/* If fortification mode, we warn about unused results of certain
function calls which can lead to problems. */
#if __GNUC_PREREQ (3,4)
# define __attribute_warn_unused_result__ \
__attribute__ ((__warn_unused_result__))
# if __USE_FORTIFY_LEVEL > 0
# define __wur __attribute_warn_unused_result__
# endif
#else
# define __attribute_warn_unused_result__ /* empty */
#endif
#ifndef __wur
# define __wur /* Ignore */
#endif
gccの説明によると
__USE_FORTIFY_LEVEL Additional security measures used, according to level.
ということで、セキュリティ強化のマクロのようです。
現実問題として、freadしてる箇所を全部エラーチェックするのもコードの見
通しが悪くなりそうでどうかなあ、とも思うので-Wno-unused-resultをgccオプ
ションに追加するのもアリかなあ、という気もしています。
_______________________________________________
Kakasi-dev mailing list
[email protected]
http://www.namazu.org/cgi-bin/mailman/listinfo/kakasi-dev