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

メールによる返信