Странная проблема с XLC ++ 11.1

Возможно, это был случай плохого программирования, но это проявляется в обновлении 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

Произошло ли изменение в способе обработки целых чисел / возвратов?

0

Решение

startAt = startAt++ является неопределенное поведение. Поскольку он не определен, компилятор может дать любой результат, который ему нравится, например, этот результат в версии 6.0 и другой в версии 11.1.

😉

С GCC, -Wsequence-point (или же -Wall) выдаст предупреждение для этой конструкции. Не уверен, что есть эквивалентное предупреждение в XLC.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]