指针

时间:2016-10-17 21:25:44

标签: c pointers arguments sizeof

当我的编译器发出警告时,我正试图为我的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;
    ...

1 个答案:

答案 0 :(得分:2)

哎呀,对不起,刚从其他帖子中错过了它,这使得问题非常清楚

snprintf error. argument to sizeof is the same as destination

  

在gcc 4.8文档中,他们正在谈论这个问题:他们说:

     

-Wall的行为已更改,现在包含新警告   flag -Wsizeof-pointer-memaccess。这可能会导致新的警告   与之前版本的GCC完全编译的代码。

所以我猜它肯定是一个bug,而其他人恰好使用了较旧的编译器。我简直无法相信生产内核上有这样的代码......