我在编译我的内核模块时遇到了一个我无法解决的警告。
首先看一下这个简化的代码:
#define READ_CHUNK 100u
static int _procfs_write(struct file *file, const char *buf, unsigned long count, void *data)
{
char command[READ_CHUNK];
unsigned long left = count;
while (left > 0)
{
unsigned int amount = left<READ_CHUNK?left:READ_CHUNK;
if (copy_from_user(command, buf, amount))
return -EFAULT;
buf += amount;
left -= amount;
/* process buffer */
}
return count;
}
我得到的警告如下:
警告:调用带有属性警告的“copy_from_user_overflow”声明:copy_from_user() 缓冲区大小无法证明是正确的
如您所见,这是完全错误的。amount
我读到的数据证明是好的!我发现这个链接说min
可以在最后一个参数中使用以使 gcc 静音,但它对我不起作用(我写道:
if (copy_from_user(command, buf, min((unsigned long)amount, count)))
无济于事)。
有谁知道如何让 gcc 知道这很酷而且不用担心?
发生这种情况的另一个地方如下所示:
static int _procfs_write(struct file *file, const char *buf, unsigned long count, void *data)
{
char *read_buffer = vmalloc(count * sizeof(*read_buffer));
if (read_buffer == NULL)
return -ENOMEM;
if (copy_from_user(read_buffer, buf, count))
{
vfree(read_buffer);
return -EFAULT;
}
/* process buffer */
vfree(read_buffer);
return count;
}
在这种情况下,gcc 也会给我同样的警告,即使它肯定是正确的。
这是确切的错误:
In file included from /usr/src/linux-2.6.35.9-rtai-9jan2012/arch/x86/include/asm/uaccess.h:571:0,
from <my source file>:7:
/usr/src/linux-2.6.35.9-rtai-9jan2012/arch/x86/include/asm/uaccess_32.h: In function ‘copy_from_user’:
/usr/src/linux-2.6.35.9-rtai-9jan2012/arch/x86/include/asm/uaccess_32.h:212:26: warning: call to ‘copy_from_user_overflow’ declared with attribute warning: copy_from_user() buffer size is not provably correct
内核版本:2.6.35.9 用 rtai 打补丁(如您所见)