реклама на сайте
подробности

 
 
> Предупреждение от IAR
DVF
сообщение Jul 25 2012, 12:45
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 26-07-06
Из: Саратов
Пользователь №: 19 097



Почему в данной ситуации получаю предупреждение: Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement?
Код
#pragma vector = TIMER1_COMPA_vect
__interrupt void TIMER1_COMPA(void)
{
  unsigned short data = (unsigned short)( (PIND & 0xF3) | ((PINB & 0x06)<<1) )
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Jul 25 2012, 16:38
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



О чем спор? Запретить выдавать Warning[Pa082] и дело с концом! sm.gif Тем более что средства для блокировки нежелательных варнингов у компилятора имеются.

Кстати, старые версии IAR на такие вещи не ругались. Да и здравый смысл протестует против такого варнинга, поскольку порядок выполнения операций (precedence) в выражениях жестко определен не только в C, но и в остальных языках программирования. А раз порядок выполнения операций в выражениях определен, то как может быть так, чтобы "accesses is undefined"? Очевидно, что accesses тут тот же самый, что и у порядка выполнения операций.

Вот если бы я так написала:
if( PIND < PINB) {}
то дело другое, тут бы я, пожалуй, не стала протестовать против данного варнинга.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 25 2012, 19:01
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Xenia @ Jul 25 2012, 19:38) *
порядок выполнения операций (precedence) в выражениях жестко определен не только в C, но и в остальных языках программирования.
Приоритет операций - да. Порядок вычисления подвыражений - нет.
QUOTE (Xenia @ Jul 25 2012, 19:38) *
то как может быть так, чтобы "accesses is undefined"?
Обращение к одной переменной может вызвать изменение другой. Например, чтение/запись UDR в любимых вами AVR сбразывает/устанавливает флаг RXC/UDRE. Не стоит огульно обвинять авторов компиляторов в глупости - часто они знают то, что вам и в голову не приходило.
QUOTE (Xenia @ Jul 25 2012, 19:38) *
Очевидно, что accesses тут тот же самый, что и у порядка выполнения операций.
Как раз таки очевидно, что access order может быть любым.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 13:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.03149 секунд с 7
ELECTRONIX ©2004-2016