【发布时间】: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