【发布时间】:2016-08-25 07:14:30
【问题描述】:
最近 cppcheck 在一些 C 代码中出现错误,其结构如下:
((void)(value_prev = value), value = new_value())
在大多数情况下,这可以分为 2 行,但在某些情况下,将其放在单个语句中很有用。
在实践中,我发现这适用于流行的编译器 (GCC/Clang/MSVC),它们不会发出任何警告(即使警告级别设置为最高)。
示例代码:
#include <stdio.h>
int get_next(int i);
int main() {
int i = 0, i_prev = 10;
do {
printf("%d\n", i);
} while ((void)(i_prev = i),
(i = get_next(i)) != 10);
}
CppCheck 1.73 (撰写本文时的最新版本) 给出了此代码的错误:
(error) Expression '(void)(i_prev=i),(i=get_next(i))!=10'
depends on order of evaluation of side effects`
虽然可以更改代码以消除警告,但顺序真的未定义吗?
【问题讨论】:
-
会不会 get_next(i) 是一个宏,比如#define getnext(i) i++ ?
-
不,在这种情况下它被定义为一个函数,cppcheck 在没有任何修改的情况下给出了这个代码的错误。
标签: c static-code-analysis cppcheck