MISRA C: 2004: вместо основных типов следует использовать typedef, указывающие размер и подпись - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть это нарушение MISRA C: 2004 typedefs that indicate size and signedness should be used in place of the basic types

Например, у меня есть этот фрагмент кода, где я не понял правильное решение, чтобы избежать этого нарушения

static int handlerCalled = 0;

int llvm_test_diagnostic_handler(void) {
  LLVMContextRef C = LLVMGetGlobalContext();
  LLVMContextSetDiagnosticHandler(C, &diagnosticHandler, &handlerCalled);

1 Ответ

0 голосов
/ 04 февраля 2019

Правило MISRA нацелено на тот факт, что C не определяет точный размер, диапазон или представление его стандартных целочисленных типов.Заголовок stdint.h устраняет эту проблему, предоставляя несколько семейств typedefs , выражающих поддерживаемые реализацией целочисленные типы, которые предоставляют конкретные комбинации подписи, размера и представления.Каждая реализация C предоставляет заголовок stdint.h, соответствующий этой реализации.

Вы должны соблюдать правило MISRA, используя типы, определенные в заголовке stdint.h вашей реализации, выбирая типы, которые соответствуют вашим потребностям, из числаон на самом деле поддерживает (или тех, кого вы ожидаете, чтобы поддержать).Например, если вы хотите, чтобы целочисленный тип со знаком ровно в 32 бита, без битов заполнения и выражался в представлении дополнения до двух, то это int32_t - если ваша реализация обеспечивает это вообще (это было бы удивительно, но неневозможно, поскольку такой тип недоступен).

Например,

#include <stdint.h>

// relies on the 'int32_t' definition from the above header:
static int32_t handlerCalled = 0;

В моем комментарии я поднял вопрос о том, что вы, казалось, говорили, что вы не только включилизаголовок, но также определен ваш собственный typedef для uint32_t. Вы не должны определять свой собственный typedef для этого или других типов в области действия stdint.h.В лучшем случае это избыточно, но в худшем случае оно удовлетворяет программе проверки MISRA, но нарушает ваш код.

...