【问题标题】:sizeof on pointer指针上的 sizeof
【发布时间】:2016-10-17 21:25:44
【问题描述】:

当我的编译器发出警告时,我正试图为我的 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-pointer-memaccess] 错误,禁止警告:mipi_novatek.c:524

我已经修复了一些这样的问题,因为我知道 sizeof(buf) 没有意义,因为 buf 作为参数传递,因此编译器不知道缓冲区大小 - 即使你碰巧传递了一个静态缓冲区。

问题是,在修复了一些这样的问题后,我想知道我是否遗漏了什么。我从 github 存储库下载了内核,其中有很多来自“原始”htc 内核的提交,我可以在两者中找到这些错误,所以它对其他人来说肯定编译得很好。

我错过了还是做错了什么?我正在使用我的 ubuntu 存储库中的 arm-none-eabi-gcc 4.8.2,而不是按照建议从 android.googlesource.com 下载。但不管编译器如何,这是一个错误,不是吗?您不应该将缓冲区大小作为额外参数传递吗?

EDIT 同一个内核中的另一个这样的例子...

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;
    ...

【问题讨论】:

  • 您是如何修复此代码的?
  • 很好奇,为什么要加入(char *)buf?啊,我知道这不是你的代码。
  • 注意不是“因为 buf 是一个参数”,而是“因为 buf 是一个指针”。
  • @immibis 对,更改了标题以使帖子不那么混乱。
  • @M.M 确实没有解决任何问题。它是一个 32 位架构,因此我将 sizeof(buf) 替换为 4,希望与该内核所进行的任何测试(如果有的话)具有完全相同的(这里是形容词)行为。我没有看到快速正确的解决方法。考虑sprintf 以避免警告,但这可能会带来很多问题......

标签: c pointers arguments sizeof


【解决方案1】:

糟糕,抱歉,刚刚从另一个线程中错过了它,这使得问题非常清楚

snprintf error. argument to sizeof is the same as destination

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

-Wall 的行为已更改,现在包含新警告 标志-Wsizeof-pointer-memaccess。这可能会导致新的警告 使用早期版本的 GCC 编译干净的代码。

所以我想这肯定是一个错误,而其他人只是碰巧使用了较旧的编译器。我简直不敢相信生产内核上有这样的代码......

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 2019-07-20
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多