Перейти к содержанию
    

Странное предупреждение

Есть такая строчка в коде

for (i=0; i < size_to_take; i++)
{
      DataBuffer[i] = (data_out[j++]<<8) | data_out[j++];
}

Выскакивает предупреждение

Warning[Pa079]: undefined behavior: variable "j" (declared at line 176) (or a value reached by some form of indirection through it) is modified more than once without an intervening
В GCC компайлере такого предупреждения нет.Что надо переделать чтоб предупреждение исчезло?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

j++ два раза в одном выражении - это бяка. Результат выражения не определён. Не надо так делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

j++ два раза в одном выражении - это бяка. Результат выражения не определён. Не надо так делать.

 

у меня тут выбора особо нету :(

 

если только так

    DataBuffer[i] = (data_out[j++]<<8);
    DataBuffer[i] |=  data_out[j++];

по моему так еще уродливей

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

j++ два раза в одном выражении - это бяка. Результат выражения не определён. Не надо так делать.

Не результат выражения, а порядок операций.

а делать так действительно не надо.

Чем меньше неоднозначностей в коде, тем лучше.

Ещё рекомендую статический анализатор запускать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по моему так еще уродливей

Что мешает сделать так:

DataBuffer[i] = (data_out[j] << 8) | data_out[j + 1];
j += 2;

???

И дело не в уродливости, а в корректности. Оригинальный код некорректен, слава яру и его предупреждениям.

 

Не результат выражения, а порядок операций.

То есть вы утверждаете, что результат определён? Какое смелое заявление.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть вы утверждаете, что результат определён? Какое смелое заявление.
Какое смелое передёргивание.

Рискну предположить, что стандарт не говорит о результате. Он говорит о порядке операций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть вы утверждаете, что результат определён? Какое смелое заявление.

В данном случае нет, но такое предупреждение бывает, например, при операциях с несколькими волатильными переменными

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рискну предположить, что стандарт не говорит о результате. Он говорит о порядке операций.

Неверное предположение. Конечно, стандарт говорит о результате, иначе зачем он нужен? Результат складывается из последовательности операций, и если порядок операций не определён, то и результат не определён. Очевидно же!

 

В данном случае нет, но такое предупреждение бывает, например, при операциях с несколькими волатильными переменными

Угу. :beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот же похожая тема. Только в ней инкремент с другой стороны относительно =

https://electronix.ru/forum/index.php?showt...650&hl=ViKo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что мешает сделать так:

DataBuffer[i] = (data_out[j] << 8) | data_out[j + 1];
j += 2;

???

И дело не в уродливости, а в корректности. Оригинальный код некорректен, слава яру и его предупреждениям.

 

 

То есть вы утверждаете, что результат определён? Какое смелое заявление.

на этом варианте остановлюсь. спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 DataBuffer[i] = (data_out[j++]<<8) | data_out[j++];

похоже на пример из статей "Как писать неподдерживаемый код".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неверное предположение. Конечно, стандарт говорит о результате, иначе зачем он нужен?

The grouping of operators and operands is indicated by the syntax.71) Except as specified later (for the function-call (), &&, ||, ?:, and comma operators), the order of evaluation of subexpressions and the order in which side effects take place are both unspecified.
Оно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оно?
Оно самое.

Тему можно переименовать из "странное предупреждение" в "странная реакция на предупреждение" :biggrin:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть такая строчка в коде
for (i=0; i < size_to_take; i++)
{
      DataBuffer[i] = (data_out[j++]<<8) | data_out[j++];
}

если нет перевёртывания с эндианами и DataBuffer - это 16-ти разрядное, то

memcpy((void*)DataBuffer, (void*)&data_out[j], 2*size_to_take);
j += 2*size_to_take; //если j дальше не нужно, удалить эту строку

без ворнингов, безопаснее, и БЫСТРЕЕ. (явное преобразование к воид не обязательно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

без ворнингов, безопаснее, и БЫСТРЕЕ. (явное преобразование к воид не обязательно).

Большие и малые индейцы негодуэ :crying:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...