【发布时间】:2013-06-28 19:05:45
【问题描述】:
我正在开发一个 linux 驱动程序,并收到以下警告消息:
/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 不警告它是有符号/无符号比较的事实?这只是编译器的特性吗?还是避免对同一个表达式发出两次警告?
包含该行的函数是:
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(在公司服务器上,我真的没有升级的选择)。
【问题讨论】:
-
您可以考虑通过重新编译来升级您的编译器(到 GCC 4.8.1)(例如使用
../gcc-4.8.1/configure --prefix=$HOME/pub);你不需要root权限。 -
我忘了建议
--program-suffix=-4.8为那个../gcc-4.8.1/configure...