C 如何解决本规范中提到的MISRA-2012 10.4和10.9违规问题?
我的问题是有必要的。 下面是C 如何解决本规范中提到的MISRA-2012 10.4和10.9违规问题?,c,misra,safety-critical,C,Misra,Safety Critical,我的问题是有必要的。 下面是MyError.h头文件的内容 myError.h 下面是MyError.c文件中的必需部分,它只包含上面的头文件,并在API中调用PROPAGATE\u ERROR\u FAIL\u MY\u 1宏 myError.c 注意:FYI MyUtilsLogError()只是一个API,有助于在控制台上转储日志。 在myError.c文件中,我看到以下MISRA 2012违规行为: [1] :misra_c_2012_规则_10_4_冲突:左侧操作数“e”(枚举)的
MyError.h
头文件的内容
myError.h 下面是
MyError.c
文件中的必需部分,它只包含上面的头文件,并在API中调用PROPAGATE\u ERROR\u FAIL\u MY\u 1
宏
myError.c 注意:FYI MyUtilsLogError()只是一个API,有助于在控制台上转储日志。 在
myError.c
文件中,我看到以下MISRA 2012违规行为:
[1] :misra_c_2012_规则_10_4_冲突:左侧操作数“e”(枚举)的基本类型与右侧操作数“MySuccess”(布尔)的基本类型不同
[2] :misra_c_2012_规则_11_9_违规:文字“0”不得用作空指针常量
我不明白为什么MISRA报告10.4违规,即使我比较了myErro.h
文件第11行的相同枚举类型
有没有线索说明为什么这里报告了10.9违规行为?
宏不适合用于MISRA吗?中
你想要
static MyError foo(uint32_t x, uint32_t y) {
if (e != MySuccess) \
在
你想要
static MyError foo(uint32_t x, uint32_t y) {
if (e != MySuccess) \
在
参数不足,ISO C99要求变量宏中的“…”至少有一个参数
警告ISO C不支持预定义的标识符
此外,MyUtilsLogError未声明/定义您的问题,其签名是什么?它至少知道MyError是什么吗?我可以用以下方法解决问题: 问题[1]:misra_c_2012_规则_10_4_冲突:左侧操作数“e”(枚举)的基本类型与右侧操作数“MySuccess”(布尔)的基本类型不同 ==>修复:规则10.4违规修复是:
8 #define PROPAGATE_ERROR_FAIL_MY_1(_err) \
9 do { \
10 e = (_err); \
11 + MyError errSuccess = MySuccess; /* This fixes the 10.4 violations */\
11 if (e != MySuccess) \
12 { \
13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0); \
14 goto fail; \
15 } \
16 } while (0)
- 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0); \
+ 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, ""); \
因此,在单独的MyError
var中保存MySuccess
有助于修复答案。但我不知道这是怎么解决问题的?在单独的var宏扩展中,似乎没有保持MySuccess
,只是将其值放在比较之前,MISRA将其视为违反
问题[2]:misra_c_2012_规则_11_9_违规:文字“0”不得用作空指针常量 ==>修复:规则11.9违规修复是:
8 #define PROPAGATE_ERROR_FAIL_MY_1(_err) \
9 do { \
10 e = (_err); \
11 + MyError errSuccess = MySuccess; /* This fixes the 10.4 violations */\
11 if (e != MySuccess) \
12 { \
13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0); \
14 goto fail; \
15 } \
16 } while (0)
- 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0); \
+ 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, ""); \
这解决了这个问题,因为MyUtilsLogError()函数需要format:arg作为指向常量字符(const char*)的指针。因此,我们不应该传递
0
,传递格式的“
”
,arg修复了规则11.9的违规行为。1MYSuccess
与MYSuccess
不同。资本化问题见C.2。0作为参数\u format
传递给MyUtilsLogError
。\u格式的类型是什么。如果它是一个指针,MISRA错误是说你不能将0
转换为指针。我不是MISRA的专家,但是goto
和具有可变参数数的函数是否也被禁止?即使您修复了冲突错误,我也看不出这将如何通过。@rishikshraje-Sory这是类型。。让我来编辑这篇文章。我猜你想写:uint32_t y而不是:uint32_I不知道MISRA是否允许在宏中执行goto
或return
,但是影响控制流的宏是一个非常糟糕的主意。它看起来像一个函数调用,但退出(或跳入)“调用”函数;不要破坏那些将阅读代码的人的内部解析器。我已经修复了拼写错误。谢谢你指出拼写错误。。我们已经传递了一个argsPROPAGATE\u ERROR\u FAIL\u MY\u 1(foo(x,y))
foo(x,y)
将返回MyError类型的代码,该代码在这里是arg,用于传播\u ERROR\u FAIL\u MY\u 1
。我是不是错过了什么?@AmitSharma“错过了什么”你是说缺少的arg?是,MY_UTILS_LOG_错误中缺少一个(e,_文件_,_函数_u,_行_u,true,0)代码>编译时没有警告?没有。。它编译得很好。。你在哪里看到它丢失了arg?@AmitSharma所以你的问题已经解决了?否则,什么是_MyUtilsLogError的签名?实际上,我只是在这里片段/模仿这段代码,来阐述我所面临的问题。。我的代码中没有任何编译问题MyUtilsLogError
不必处理MyError枚举等。。然后在控制台上转储一些调试信息。这并没有回答这个问题(因为代码没有编译,所以无法回答这个问题)。如果警告说“文字0不得用作空指针常量”,那么您不能盲目地将其替换为空字符串文字,这与什么有关系?您更改了代码的含义。您应该使用NULL。总的来说,您显然只是在冒险,而不知道自己在做什么。@Lundin我同意,我们也可以使用NULL来修复此警告。。。但是使用“
是不可变的常量字符串,在这里也可以使用吗?你能解释一下我是如何改变这个词的意思的吗?我觉得使用将“
传递到const char*可以吗?我不知道该函数做什么,所以我也不知道。@Lundinformat
string是我们在printf()函数中使用的格式说明符。MISRA-C不允许您使用这些。出于非常好的原因,整个stdio.h被禁止。
- 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0); \
+ 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, ""); \