0

Clang 似乎在警告我在表达式中未使用 aa 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 循环中评估它,这真的是一个“错误”还是我做错了什么?

4

2 回答 2

3

Clang 提示您代码中可能存在错误。

代码分配了值,p并且在被覆盖之前该值在任何地方都没有使用,这看起来很奇怪,应该重新访问执行此操作的代码片段。在接下来的while循环中,您将覆盖 的内容,p而无需使用其先前的值。

在这样的代码中,此警告可能会更安全:

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

这很可能是程序员的错误,因为在大多数情况下,如果函数返回状态,则应该对其进行检查。

于 2012-10-06T07:35:30.563 回答
1

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

我认为你的代码片段的语义最好用这样的东西来满足

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

即在可能的情况下使用初始化而不是赋值,并使迭代变量在使用它的范围内成为本地变量。

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

于 2012-10-06T09:12:33.447 回答