0

Clang seems to be giving me a warning that a a char is unused in an expression, here's the entire section of code:

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;

Specifically this line:

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

Although the value stored to 'p' is used in the enclosing expression, the value is never actually read from 'p'

I am obviously evaluating it in the while loop, is this really a 'bug' or am I doing something wrong?

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));) {
 ...
}

つまり、可能な場合は割り当ての代わりに初期化を使用し、反復変数をそれが使用されるスコープに対してローカルにします。

編集:これは、acient C、別名C89には存在しないが、1999年にこの言語に導入された機能を使用します。ClangはデフォルトでC99を使用するため、正常に動作するはずです。

于 2012-10-06T09:12:33.447 に答える