Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何解决本规范中提到的MISRA-2012 10.4和10.9违规问题?_C_Misra_Safety Critical - Fatal编程技术网

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的违规行为。

1
MYSuccess
MYSuccess
不同。资本化问题见C.2。0作为参数
\u format
传递给
MyUtilsLogError
\u格式的类型是什么。如果它是一个指针,MISRA错误是说你不能将
0
转换为指针。我不是MISRA的专家,但是
goto
和具有可变参数数的函数是否也被禁止?即使您修复了冲突错误,我也看不出这将如何通过。@rishikshraje-Sory这是类型。。让我来编辑这篇文章。我猜你想写:uint32_t y而不是:uint32_I不知道MISRA是否允许在宏中执行
goto
return
,但是影响控制流的宏是一个非常糟糕的主意。它看起来像一个函数调用,但退出(或跳入)“调用”函数;不要破坏那些将阅读代码的人的内部解析器。我已经修复了拼写错误。谢谢你指出拼写错误。。我们已经传递了一个args
PROPAGATE\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*可以吗?我不知道该函数做什么,所以我也不知道。@Lundin
format
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, ""); \