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'或者我做错了什么?
答案 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。