Начиная с версии 1.80, Cppcheck сообщает мне, что
Выражение 'msg [ipos ++] = контрольная сумма (& msg [1], ipos-1)' зависит от порядка оценки побочных эффектов
в этой кодовой последовательности (упрощенный, data
- переменная)
BYTE msg[MAX_MSG_SIZE]; // msg can be smaller, depending on data encoded
int ipos = 0;
msg[ipos++] = MSG_START;
ipos += encode(&msg[ipos], data);
msg[ipos++] = checksum(&msg[1], ipos-1); // <---- Undefined Behaviour?
msg[ipos++] = MSG_END; // increment ipos to the actual size of msg
и рассматривает это как ошибку, а не проблему переносимости.
Код C (включен в проект с преобладанием С++), скомпилированный с компилятором, совместимым с С++ 98, и тем временем работает, как и ожидалось, в течение десятилетий. Cppcheck запускается с С++ 03, C89, автоматически обнаруживает язык.
Я признаюсь, что код лучше переписывать. Но прежде чем это сделать, я пытаюсь понять: действительно ли это зависит от порядка оценки? Как я понимаю, правый операнд сначала оценивается (он должен быть до вызова), затем выполняется назначение (до msg[ipos]
) с приращением ipos
, выполненным последним.
Я ошибаюсь в этом предположении, или это просто ложный позитив?