我遇到了违反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);
答案 0 :(得分:2)
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;
我在评论中提出的观点是,您似乎说您不仅包含标头,而且还为uint32_t
定义了您自己的 typedef。 在stdint.h
范围内,您不能为此或其他类型定义自己的typedef 。这样做最好是多余的,但最坏的是它可以满足MISRA检查器的要求,但会破坏您的代码。