我正在开发一个 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(在公司服务器上,我真的没有升级的选择)。