当我的编译器发出警告时,我正试图为我的HTC手机编译一个内核:
static ssize_t mipi_dsi_3d_barrier_read(struct device *dev,
struct device_attribute *attr,
char *buf)
{
return snprintf((char *)buf, sizeof(buf), "%u\n", barrier_mode);
}
带有消息
警告:'snprintf'调用中'sizeof'的参数是相同的 表达作为目的地;你的意思是提供一个明确的 长度? [-Wsizeof指针-memaccess] 错误,禁止警告:mipi_novatek.c:524
我已经解决了一些这样的问题,因为我知道sizeof(buf)没有意义,因为buf作为参数传递,因此编译器不知道缓冲区大小 - 即使你碰巧传递了一个静态缓冲液中。
事情是,在修好这样的一些之后,我想知道我是否遗漏了一些东西。我从github存储库下载了内核,其中有很多来自“原始”htc内核的提交,我可以在两者中找到这些错误,所以它肯定能为其他人编译好。
我错过了还是做错了什么?我在我的ubuntu存储库中使用arm-none-eabi-gcc 4.8.2,而不是按照建议从android.googlesource.com下载。但无论编译器如何,这都是一个bug,不是吗?你不应该将缓冲区大小作为额外参数传递吗?
编辑同一内核中的另一个这样的例子......
struct msm_adsp_module *module;
...
if (!strncmp(module->name, "QCAMTASK", sizeof(module->name)))
module_irq_cnt[1]++;
else if(!strncmp(module->name, "VFETASK", sizeof(module->name)))
module_irq_cnt[2]++;
else if(!strncmp(module->name, "VIDEOENCTASK", sizeof(module->name)))
module_irq_cnt[3]++;
,其中
struct msm_adsp_module {
struct mutex lock;
const char *name;
...
答案 0 :(得分:2)
哎呀,对不起,刚从其他帖子中错过了它,这使得问题非常清楚
snprintf error. argument to sizeof is the same as destination
在gcc 4.8文档中,他们正在谈论这个问题:他们说:
-Wall的行为已更改,现在包含新警告 flag -Wsizeof-pointer-memaccess。这可能会导致新的警告 与之前版本的GCC完全编译的代码。
所以我猜它肯定是一个bug,而其他人恰好使用了较旧的编译器。我简直无法相信生产内核上有这样的代码......