Определения флагов компилятора с помощью Ceedling

#c #embedded #warnings #ceedling

Вопрос:

У меня есть встроенный системный проект, который я тестирую с помощью Ceedling (=Unity и Cmock).

В одном тестовом примере тестируемый код настолько прост:

 uint32_t zero = eeprom_read_dword((uint32_t*)amp;non_volatile_zero);
sprintf(output, "%lu", zero);
 

Поскольку встроенная система имеет 8-разрядную архитектуру, %lu ее необходимо использовать в sprintf для форматирования 32-разрядного unsigned int для печати. Однако среда рабочего стола (GCC) используется для сборки тестов и выполнения тестов (и для тестов нельзя использовать встроенную сборку). Это вызывает следующее предупреждение:

 warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘uint32_t’ {aka ‘unsigned int’} [-Wformat=]
   62          sprintf(output, "%lu", zero);
                                ~~^   ~~~~
                                  |   |
                                  |   uint32_t {aka unsigned int}
                                  long unsigned int
                                %u
 

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

Мой вопрос в том, как установить флаг компилятора в формате Wno для тестовой сборки, поскольку я вообще не определил раздел инструментов в project.yml, как используется GCC по умолчанию? Или, может быть, есть даже способ сообщить ceedling, что целевая система использует 8-разрядную архитектуру?

Комментарии:

1. Не имея отношения к вашему вопросу, использовать stdio-очень плохая идея. h на 8-битных микроконтроллерах. Это поглотит всю память и скорость. Если это используется только для печати в UART, подумайте о том, чтобы написать этот код самостоятельно.

2. @Lundin Спасибо, что обратили на это внимание! Это правда, и я осознаю этот недостаток при использовании stdio, но в данном случае это известное и продуманное решение.

Ответ №1:

Вместо того чтобы искать способ отключить предупреждение, разберитесь с проблемой, о которой идет речь в предупреждении. То есть используйте спецификаторы переносимого формата из inttypes.h . Они наиболее правильны для использования при печати stdint.h типов.

 #include <inttypes.h>

sprintf(output, "%"PRIu32, zero);
 

Комментарии:

1. Я абсолютно согласен с тем, что лучше разобраться с проблемой, чем отключать предупреждение. Спасибо за решение! Использование спецификаторов формата из inttypes.h элегантно решило проблему.

Ответ №2:

Если кому-то случится найти ответ на исходный вопрос, вот решение, как добавить флаги компилятора для указанного исходного файла без определения всего раздела «Инструменты» в project.yml :

 # Adds -Wno-format for sourcefile.c
:flags:
  :test:
    :compile:
      :sourcefile: # use :*: for all sources.
        - -Wno-format