Ostatnio cppcheck podniesiony błąd w jakiś kod C, który ma strukturę:Czy kolejność oceny z operatorem przecinka i przypisaniem w języku C jest przewidywalna?
((void)(value_prev = value), value = new_value())
W większości przypadków można to podzielić na 2 linie, jednak istnieją pewne przypadki, to jest mieć w jednym rachunku.
W praktyce znalazłem, że działa to z popularnymi kompilatorami (GCC/Clang/MSVC), które nie dają żadnych ostrzeżeń (nawet z poziomami ostrzegawczymi ustawionymi na najwyższą wartość).
Przykładowy kod:
#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 (najpóźniej w momencie pisania) daje błąd z tym kodem:
(error) Expression '(void)(i_prev=i),(i=get_next(i))!=10'
depends on order of evaluation of side effects`
Chociaż kod może zostać zmieniony na spokój ostrzeżenie, czy porządek jest naprawdę nieokreślony?
Czy to możliwe, że get_next (i) jest makrem, jak #define getnext (i) i ++? – gnasher729
Nie, w tym przypadku jest to funkcja zdefiniowana, cppcheck podaje błąd w tym kodzie bez żadnych modyfikacji. – ideasman42