我正在运行一些测试用例,我知道这会导致我的程序(在内核空间中运行)返回-EFAULT
。以下是返回错误的代码:
for (index = 0; index < size; index++){
//copy_from_user checks to make sure input parameter is valid. Returns 0 on success
if(copy_from_user(¤tArrayElement, &data[index], sizeof(long))) {
printk("copy from user error \n");
return -EFAULT;
printk("copy from user error: just returned efault");
}
else {
//parameter is ok
if (currentArrayElement < kernelStats.min)
kernelStats.min = currentArrayElement;
if (currentArrayElement > kernelStats.max)
kernelStats.max = currentArrayElement;
kernelStats.sum += currentArrayElement;
}
}
//print debugging info
printk("Min: %ld Max: %ld Sum: %ld\n", kernelStats.min, kernelStats.max, kernelStats.sum);
当触发第一个if块时,似乎正在返回EFAULT
,因为“从用户错误中复制:刚返回的efault”不会打印。但是,不是完全退出该功能,而是打印底部的调试信息。它似乎打印是否有EFAULT
。这是EFAULT
的特质吗?或者我做错了什么?
答案 0 :(得分:2)
(评论太长了。)
无论参数如何, return
都会按预期执行。
我敢打赌你不止一次调用这个函数。在您第一次看到copy from user error
时,您第二次看到调试信息。
要测试这个理论,请在顶部添加一个额外的printk
。