MISRA C:2004年:指示的尺寸和符号性的typedef应在地方的基本类型的使用

问题描述 投票:0回答:1

我有这样的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);
c type-safety misra
1个回答
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;

我养我的评论的观点是,你好像说,你不仅包含了头,而且还定义了自己的typedef uint32_t。你不能在stdint.h的范围定义自己的这个或其他类型的typedef。充其量是多余的这样做,但在最坏的情况。它符合MISRA检查又伤了你的代码。

© www.soinside.com 2019 - 2024. All rights reserved.