Easyelectronics.ru

Электроника для всех
Текущее время: 27 ноя 2020, 11:30

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: GCC и его опции [-WSign-conversion]
СообщениеДобавлено: 23 окт 2020, 18:06 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 289
Откуда: Таганрог
Доброго дня,

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

То есть код вида:
Код:
uint8_t varA = 129;

void funct (int8_t in)
{
  ...
}
...
funct(129); // Выдает предупреждение о выходе за диапазон целых 8битных знаковых чисел
funct(A);    // Не выдает предупреждения. Вообще


Полчаса удивления, 5 минут поисков и оказывается, нужно дописать два ключика компилятору. И будет счастье))) Ключики вот такие:
Код:
-Wsign-conversion
-Wconversion


Обрадовался, решил добавить их в основной проект, но не тут то было. 572 предупреждения!!!
По сути то, предупреждений было три, но на хедер "core_cm4.h"

И я задумался, ведь файл поставляется в составе тулчейна ARM. Изменения в него мало кто вносит (если вообще вносят). Но тогда почему:
Код:
/**
  \brief   Set Interrupt Vector
  \details Sets an interrupt vector in SRAM based interrupt vector table.
           The interrupt number can be positive to specify a device specific interrupt,
           or negative to specify a processor exception.
           VTOR must been relocated to SRAM before.
  \param [in]   IRQn      Interrupt number
  \param [in]   vector    Address of interrupt handler function
*/
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
{
  uint32_t vectors = (uint32_t )SCB->VTOR;
  (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector;
  /* ARM Application Note 321 states that the M4 does not require the architectural barrier */
}



приводит к появлению сообщений:

Код:
conversion to 'uint32_t' {aka 'unsigned int'} from 'int32_t' {aka 'int'} may change the sign of the result [-Wsign-conversion]
conversion to 'int' from 'uint32_t' {aka 'unsigned int'} may change the sign of the result [-Wsign-conversion]


Получается даже производитель "забил" и решил просто игнорировать данное предупреждение?

С одной стороны да, можно просто отключить и забить. Но с другой стороны, из-за неявных преобразований иногда отгребаются забавные баги с порчей данных. Ищутся долго, исправляются быстро.

Как все же быть?

UPD:
https://github.com/ARM-software/CMSIS_5/issues/655 о проблеме известно и в версии 5.1.1 она вроде как исправлена.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB