clang表达中未使用的值

时间:2012-10-06 07:16:03

标签: c warnings clang

Clang似乎在给我一个警告,表示在表达式中没有使用char,这里是代码的整个部分:

int yeller(const char * channel) {
char *p, *q;
q = p = MAKE_COPY(temp->bind_chan);
while ((p = next_in_comma_list(q, &q))) {
if (!p || !*p)
break;
if (!my_stricmp(p, channel))
return tmp;

特别是这一行:

q = p = MAKE_COPY(temp->bind_chan);

虽然存储的价值是' p'在封闭表达式中使用,实际上从来没有从' p'

中读取值

我显然是在while循环中对它进行评估,这真的是一个' bug'或者我做错了什么?

2 个答案:

答案 0 :(得分:3)

Clang正在向您提示您的代码可能有错误。

代码将值赋给p,并且在覆盖之前不会在任何地方使用此值,这看起来很奇怪,应该重新访问执行此操作的代码段。在随后的while循环中,您将覆盖p的内容而不使用其先前的值。

此警告可以在以下代码中更安全:

Status status = do_some_job();
...
(some code where status isn't checked)
...
status = do_some_ther_job();

最有可能是程序员错误,因为在大多数情况下,如果函数返回状态,则应该检查它。

答案 1 :(得分:1)

Clang试图说服你写出更好的代码,听听它。

我认为您的代码段的语义可以更好地满足此类

char *q = MAKE_COPY(temp->bind_chan);
for (char *p; (p = next_in_comma_list(q, &q));) {
 ...
}

使用初始化而不是赋值,这是可能的,并使迭代变量在使用它的范围内是局部的。

编辑:这使用了acient C,AKA C89中不存在的功能,但在1999年引入该语言的地方.Clang应该可以正常工作,因为它默认使用C99。