我有这样的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);
的MISRA规则是针对一个事实,即C不限定精确的尺寸,范围,或它的标准整数类型的表示。所述stdint.h
头通过提供several families of typedefs表达执行支持的整数类型提供的符号性,大小和表示的特定组合减轻这个问题。每个C实现提供适用于该实施stdint.h
报头。
你应该用你的执行的stdint.h
头定义的类型,选择符合要求从那些你需要的类型遵守MISRA规则,它实际上支持(或者那些你希望它支持)。例如,如果你想要一个有符号整数型宽带恰好有32位,没有填充比特,而在补码表示表示,那是int32_t
- 如果您的实现提供了在所有(这将是惊人的,但并非不可能,这种类型不被提供)。
例如,
#include <stdint.h>
// relies on the 'int32_t' definition from the above header:
static int32_t handlerCalled = 0;
我养我的评论的观点是,你好像说,你不仅包含了头,而且还定义了自己的typedef uint32_t
。你不能在stdint.h
的范围定义自己的这个或其他类型的typedef。充其量是多余的这样做,但在最坏的情况。它符合MISRA检查又伤了你的代码。