Возможно, это был случай плохого программирования, но это проявляется в обновлении XLC ++ с 6.0 до 11.1.
Код выглядит так:
int startAt = 140;
startAt = parseAndSaveResponseINSTANTID_MODEL(response, startAt);
COUT << "After tokenize INSTANTID_MODEL startAt=" <<startAt <<ENDL;
startAt = startAt++;
startAt = parseAndSaveResponseINSTANTID_CHRON_HISTORY(response, startAt);
COUT << "After tokenize INSTANTID_MODEL startAt=" <<startAt <<ENDL;
startAt = startAt++;
startAt = parseAndSaveResponseINSTANTID_FOLLOWUP_ACTION(response, startAt);
COUT << "After tokenize TSTID_INSTANTID_FOLLOWUP_ACTION startAt=" <<startAt <<ENDL;
startAt = startAt++;
startAt = parseAndSaveResponseINSTANTID_RISK_INDICATOR(response, startAt);
COUT << "After tokenize TSTID_INSTANTID_RISK_INDICATOR startAt=" <<startAt <<ENDL;
И внутри каждого из методов разбора мы делаем return (startAt + 1 + vRows * 81);
vRows равен нулю во всех методах.
Со старым компилятором вывод выглядит так:
After tokenize INSTANTID_MODEL startAt=141
vRows=0
After tokenize INSTANTID_MODEL startAt=142
vRows=0
After tokenize TSTID_INSTANTID_FOLLOWUP_ACTION startAt=143
vRows=0
After tokenize TSTID_INSTANTID_RISK_INDICATOR startAt=144
Но с новым компилятором вывод выглядит
After tokenize INSTANTID_MODEL startAt=141
vRows=0
After tokenize INSTANTID_MODEL startAt=143
vRows=0
After tokenize TSTID_INSTANTID_FOLLOWUP_ACTION startAt=145
vRows=0
After tokenize TSTID_INSTANTID_RISK_INDICATOR startAt=147
Произошло ли изменение в способе обработки целых чисел / возвратов?
startAt = startAt++
является неопределенное поведение. Поскольку он не определен, компилятор может дать любой результат, который ему нравится, например, этот результат в версии 6.0 и другой в версии 11.1.
😉
С GCC, -Wsequence-point
(или же -Wall
) выдаст предупреждение для этой конструкции. Не уверен, что есть эквивалентное предупреждение в XLC.
Других решений пока нет …