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

 
 
> Опасные определения, приводят к катастрофе!
ivainc1789
сообщение Sep 7 2007, 14:44
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



В программе есть описания:

#define BIT(x) (1 << (x))
#define SETBIT(x,y) (x |= (1<<y)) // Set bit y in byte x
#define SETBITS(x,y) (x |= (y)) // Set bits y in byte x

Соответственно при написании исходных текстов пользователь может забыть как правильно использовать эти определения и написать примерно так:

SETBIT(TIMSK,TOIE1);
SETBITS(TIMSK,TOIE1+TOIE0);

Очевидно, оба предложения валидны с точки зрения компилятора при использовании стандартных определений битов (через цифры 7...0). Однако второе предложение является ошибочным. Нужно правильно записать так:

SETBITS(TIMSK,BIT(TOIE1)+BIT(TOIE0));

Хотелось бы сделать так, чтобы либо компилятор выдавал сообщение об ошибке, или переписать определение для SETBITS, чтобы оно имело бОльшую "защиту от дурака".
Как это разумнее сделать в IAR EWAVR?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
singlskv
сообщение Sep 7 2007, 19:14
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ivainc1789 @ Sep 7 2007, 18:44) *
В программе есть описания:

#define BIT(x) (1 << (x))
#define SETBIT(x,y) (x |= (1<<y)) // Set bit y in byte x
#define SETBITS(x,y) (x |= (y)) // Set bits y in byte x

Соответственно при написании исходных текстов пользователь может забыть как правильно использовать эти определения и написать примерно так:

SETBIT(TIMSK,TOIE1);
SETBITS(TIMSK,TOIE1+TOIE0);

Я обычно делаю так
#define TOIE1_MASK (1<<TOIE1)
#define TOIE0_MASK (1<<TOIE0)
#define TOIE01_MASK (TOIE1_MASK | TOIE1_MASK)

Если лень писать каждый раз _MASK то заменяем его на _M, типа TOIE1_M, ну или как-то еще,
удобнее автору.

количество вариантов значений которые нужно пинать в регистр обычно ограничено 2-3
по этому можно писать и так:
#define TIMSK_M1 (1<<TOIE1)
#define TIMSK_M2 ((1<<TOIE1) | (1<<TOIE0))

ну и применение
TIMSK |= TIMSK_Mx;
Цитата
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
Скобочки где-то забыли, например при 1<<yy
у << маленький приоритет
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 7 2007, 19:56
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 7 2007, 22:14) *
у << маленький приоритет

Скобочки, действительно, абсолютно обязательны, но вот приоритет у поразрядных сдвигов самый высокий среди упомяутых выше операций, и даже разворот в такое мутное выражение
TIMSK |= 1<<2 | 1<<4;
дает вполне однозначный результат.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 7 2007, 20:06
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Sep 7 2007, 23:56) *
Скобочки, действительно, абсолютно обязательны, но вот приоритет у поразрядных сдвигов самый высокий среди упомяутых выше операций, и даже разворот в такое мутное выражение
TIMSK |= 1<<2 | 1<<4;
дает вполне однозначный результат.
Ну конечно Вы правы... smile.gif
за исключением одного момента,
афтар почему-то в первоначальном посте указал нам что он предпочитает
использовать BIT(TOIE1)+BIT(TOIE0) вместо BIT(TOIE1)|BIT(TOIE0),
а у них уже разный приоритет относительно барикады (<<) smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 7 2007, 20:15
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 7 2007, 23:06) *
а у них уже разный приоритет относительно барикады (<<) smile.gif

Тогда вилы smile.gif.
Хотя вообще '+' использовать последнее дело - при перекрытии битов, получить эффектов по полной программе можно. А оно это надо?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 7 2007, 20:19
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Sep 8 2007, 00:15) *
Тогда вилы smile.gif.
Поэтому и предлагаю сформулировать правило:
1<<XX ВСЕГДА ПИШИ В СКОБКАХ
сам пользуюсь и другим желаю, не пожалеете...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 7 2007, 20:38
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 7 2007, 23:19) *
Поэтому и предлагаю сформулировать правило:
1<<XX ВСЕГДА ПИШИ В СКОБКАХ

Все строже - в макросах абсолютно все выражения и все аргументы всегда в скобках. Без вариантов!
Пример:
#define func( a, x ) ((a)+((x)<<2))


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 7 2007, 20:48
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Sep 8 2007, 00:38) *
Все строже - в макросах абсолютно все выражения и все аргументы всегда в скобках. Без вариантов!
Пример:
#define func( a, x ) ((a)+((x)<<2))

+1
В макросах - без вариантов

1<<XX ВСЕГДА ПИШИ В СКОБКАХ
во всех вариантах без разбору,
очень помагает для сохранения нервной системы smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 7 2007, 20:58
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 7 2007, 23:48) *
1<<XX ВСЕГДА ПИШИ В СКОБКАХ
во всех вариантах без разбору,
очень помагает для сохранения нервной системы smile.gif

Ну это Вы похоже как-то на грабли больно наступили smile.gif. Почему (1<<XX) "всегда" а например,
1 & XX
"не всегда"? Хотя второе много опаснее ввиду более низкого приоритета, не говоря уже о
1 | XX
или страшно сказать
XX |= 1
В общем думать надо всегда, ну и скобочки не жалеть, но ровно в меру! smile.gif тоже не помешает для читабельности.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ivainc1789   Опасные определения   Sep 7 2007, 14:44
- - Непомнящий Евгений   Цитата(ivainc1789 @ Sep 7 2007, 18:44) #d...   Sep 7 2007, 14:53
- - zltigo   Цитата(ivainc1789 @ Sep 7 2007, 17:44) SE...   Sep 7 2007, 17:46
|- - ivainc1789   Цитата(zltigo @ Sep 7 2007, 21:46) Будьте...   Sep 7 2007, 18:23
|- - zltigo   Цитата(ivainc1789 @ Sep 7 2007, 21:23) Wa...   Sep 7 2007, 18:48
|- - singlskv   Цитата(zltigo @ Sep 8 2007, 00:58) Ну это...   Sep 7 2007, 21:19
|- - zltigo   Цитата(singlskv @ Sep 8 2007, 00:19) этот...   Sep 8 2007, 05:47
- - ivainc1789   Мдя... А я уже было думал, что привык... Придется ...   Sep 7 2007, 21:16
- - aaarrr   0xFF, но повод хороший. Не могу не поделиться заме...   Sep 7 2007, 22:08
- - dxp   Цитата(aaarrr @ Sep 8 2007, 05:08) 0xFF, ...   Sep 8 2007, 10:04
- - alexander55   По поводу макросов могу сказать, не ленитесь побол...   Sep 10 2007, 05:47


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 11:10
Рейтинг@Mail.ru


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