最近cppcheckは、構造を有するもの、いくつかのCコードでエラーが発生した:これは2行に分割することができるCでのカンマ演算子と代入による評価の順序は予測可能ですか?
((void)(value_prev = value), value = new_value())
ほとんどの場合が、しかしいくつかの場合があり、これは単一の文を持っていることが有用です。
これは実際には、警告が表示されない一般的なコンパイラ(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`
コードは静かに変更することができますが警告は、本当に未定義ですか?
#define getnext(i)i ++のように、get_next(i)がマクロである可能性はありますか? – gnasher729
いいえ、この場合は関数として定義されていますが、cppcheckは何も変更せずにこのコードでエラーを返します。 – ideasman42