#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