【问题标题】:GCC 6.3 warning comparison of constant '0' with Boolean expression is always falseGCC 6.3 警告常量“0”与布尔表达式的比较总是错误的
【发布时间】:2017-08-01 13:08:05
【问题描述】:

争吵指向这段代码

#define DO_SAFE(do_work, goto_error)                \
 DO_IF(unlikely((do_work) < 0), goto_error)

这是来自一个头文件。我不明白这段代码试图做什么或比较。对我来说似乎 do_work if false 然后 goto 错误。但如果这是正确的,它会是

 (do_work != 0) 

但这只是猜测。

如果需要更多信息,请告知。

函数在c文件中出错

for (page_num = 0; page_num < PAGE_MAX_NUM; page_num++) {
    DO_SAFE(touch_i2c_write_byte(client, PAGE_SELECT_REG, page_num), error);

for (u_address = DESCRIPTION_TABLE_START; u_address > 10; u_address -= sizeof(struct function_descriptor)) 
{
DO_SAFE(touch_i2c_read(client, u_address, sizeof(buffer), (unsigned char *)&buffer) < 0, error);

【问题讨论】:

  • 您在使用宏时使用的do_work 参数是什么?它是否调用返回布尔值的函数?如果是这样,结果将是 0 或 1,两者都不小于 0,因此您会收到关于条件始终为假的警告。 “不太可能”是对编译器的提示,即条件可能不成立。
  • 我在问题中添加了更多代码。希望我能更好地理解 C 以跟踪与 0 进行比较的常量阀
  • 您没有显示touch_i2c_read()synaptics_ts_page_data_read() 的声明,它们都在 DO_SAFE 宏调用中使用。代码是在所有三个函数上重现问题,还是只在一个函数上重现问题——如果是三个函数中的一个或两个,是哪一个?请阅读如何创建一个 MCVE (minimal reproducible example)——它会告诉你这个,所以我不应该要求提供必要的信息。我无法提供更多帮助——Android 的 Linux 内核编程超出了我的专业领域。我只能应用一般原则,不能应用具体经验。
  • 可能错误:应该返回 -1,就像使用 Do_Safe 的其他函数一样?

标签: android c kernel gcc-warning


【解决方案1】:

哦,我看到了问题(如果我水平滚动 - 线条相当长):

DO_SAFE(touch_i2c_read(client, u_address, sizeof(buffer), (unsigned char *)&buffer) < 0, error);

您正在宏调用中测试&lt; 0 条件,这意味着您最终会扩展DO_SAFE

if ((touch_i2c_read(…) < 0) < 0)

并且内部条件的结果永远不会小于零。

用途:

DO_SAFE(touch_i2c_read(client, u_address, sizeof(buffer), (unsigned char *)&buffer), error);

(这已经在您直接调用DO_SAFE 时消除了&lt; 0,让宏来测试&lt; 0。)

【讨论】:

  • 好好编辑看看它是否可以编译,我讨厌 OEM 制造出糟糕的代码。感谢 LG 解决这个问题。
  • 限制线宽仍然有好处——我在浏览器中看到 83 个字符,关键信息就在屏幕之外。在您的缩进更深的代码中,关键信息甚至更靠右。我通常瞄准80,但通常不会大惊小怪到100;我很少让线条保持完整,而且基本上从不让更长的线条保持完整。
  • 是的,我还有很多东西要学,仍然不知道为什么我不能让 Markdown 为我工作。似乎没有按照我想要的方式格式化。
  • 要将代码放入问题中,请将其写入文本框中,如您所愿(忽略预览,不要尝试使用选项卡)。然后选择代码并使用编辑框上方的 {} 按钮来缩进代码。检查预览以确保它是正确的。如果您复制/粘贴代码,请确保在复制之前它是无标签的。一般用 4 个空格作为缩进级别,但 2-8 任意选择都可以(有些人甚至用过 1),只要一致即可。
  • 在示例DO_SAFE((synaptics_ts_page_data_read(client, ANALOG_PAGE, 0x04, 1, &amp;buf1) &lt; 0), error); 中,您需要确保保持括号平衡。为了获得最大的清洁度,请使用:DO_SAFE(synaptics_ts_page_data_read(client, ANALOG_PAGE, 0x04, 1, &amp;buf1), error);——但如果您使用DO_SAFE((synaptics_ts_page_data_read(client, ANALOG_PAGE, 0x04, 1, &amp;buf1)), error);,编译器不会抱怨,尽管在某些情况下,这些额外的括号可能会抑制在不存在时不会被抑制的警告(但是,OTOH,我'还没想出具体的例子)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多