2013-06-28 12 views
5

私は、Linuxのドライバに取り組んでいる、と私は、この警告メッセージが表示されました:奇数gccの警告動作

/home/andrewm/pivot3_scsif/pivot3_scsif.c:1090: warning: ignoring return value of ‘copy_from_user’, declared with attribute warn_unused_result 

問題のある行は次のとおりです。

if (copy_from_user(tmp, buf, count) < 0) 

copy_from_userの宣言を確認した後、私はunsigned longを返したことがわかりました。明らかに比較は常に失敗するため、戻り値は比較に影響しません。その部分は理にかなっていますが、なぜgccは署名付き/符号なし比較であるという事実について警告していませんか?それは単なるコンパイラ特有なのでしょうか?それとも同じ表現に対して警告を2回もしないのですか?行を含む

機能は次のとおりです。

int proc_write(struct file *f, const char __user *buf, unsigned long count, void *data) 
{ 
    char tmp[64]; 
    long value; 
    struct proc_entry *entry; 

    if (count >= 64) 
    count = 64; 
    if (copy_from_user(tmp, buf, count) < 0) 
    { 
    printk(KERN_WARNING "pivot3_scsif: failed to read from user buffer %p\n", buf); 
    return (int)count; 
    } 
    tmp[count - 1] = '\0'; 
    if (tmp[count - 2] == '\n') 
    tmp[count - 2] = '\0'; 
    ... 
} 

64ビットのRed Hat上のgcc 4.4.1を使用して(会社のサーバー上で、私は本当にアップグレードの選択肢を持っていません)。

+0

コンパイルをGCC 4.8.1にアップグレードすることを考えてみましょう(例えば、 '../gcc-4.8.1/configure --prefix = $ HOME/pub'を使って)。そのためのルート権限は必要ありません。 –

+0

' -/gcc-4.8.1/configure'のために' --program-suffix = -4.8'を提案するのを忘れた... –

答えて

4

コンパイラオプションhttp://gcc.gnu.org/onlinedocs/gcc/Warning-Options.htmlだようだ:

-Wno-unused-result 
    Do not warn if a caller of a function marked with attribute warn_unused_result (see Function Attributes) does not use its return value. The default is -Wunused-result. 

.... 

-Wtype-limits 
    Warn if a comparison is always true or always false due to the limited range of the data type, but do not warn for constant expressions. For example, warn if an unsigned variable is compared against zero with ‘<’ or ‘>=’. This warning is also enabled by -Wextra. 
+0

ああ、 '-Wall'は' -Wtype-私はそのメッセージを見ていなかったのです。ありがとう –

3

はい、それはおそらく、コンパイラの癖です。この警告は、if()式が削除された(条件が常に真であったため)ベア関数呼び出しを残したまま、いくつかの構文最適化を行った後に生成されたものと考えられます。この種の行動を見つけるのはかなり日常的です。同様に、最適化を使用してコンパイルするときにのみ発生する警告条件もありますを有効にします。

自分で正しい修正を見つけたようです。