有必要的零件来制定我的问题。以下是MyError.h
标头文件的内容。
myError.h
###########################
# myError.h
###########################
1 typedef enum
2 {
3 MySuccess = 0x00000000,
4 MyError1 = 0x00000001,
5 MyError2 = 0x00000003,
6 MyForce32 = 0x7FFFFFFF
7 } MyError;
8 #define PROPAGATE_ERROR_FAIL_MY_1(_err)
9 do {
10 e = (_err);
11 if (e != MySuccess)
12 {
13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0);
14 goto fail;
15 }
16 } while (0)
17 #define MY_UTILS_LOG_ERROR(_err, _file, _func, _line, _propagating, _format, ...)
18 do {
19 MyUtilsLogError(MY_UTILS_ERROR_TAG, MY_UTILS_ERROR_PATH,
20 (_err), (_file), (_func), (_line),
21 (_propagating), (_format), ##__VA_ARGS__);
22 }
23 while (0)
24 void MyUtilsLogError(const char* tag, const char* path, MyError e, const char* file, const char* func,
uint32_t line, bool propagating, const char* format, ...)
//Here MyError is passed just to print the String for Error for example if we pass MyError1 then string MyError1 will be printed in logs on console.
以下是MyError.c
文件所需的零件,该文件仅包括上述标头文件并调用API中的PROPAGATE_ERROR_FAIL_MY_1
宏。
myError.c
#include "myerror.h"
static MyError foo(uint32_t x, uint32_t y) {
if (x==y) {
return MySuccess;
} else {
return MyError1;
}
}
static MyError fooCaller(void) {
MyError e = MySuccess;
uint32_t x = 1U, y = 1U;
PROPAGATE_ERROR_FAIL_MY_1(foo(x,y)); //This is where I get all kind of weird MISRA violation [1][2].
fail:
return e;
}
注意:FYI Myutilslogerror((只是一个API,有助于将日志倾倒在控制台上。
在myError.c
文件中,我在Misra 2012违规下看到:
[1]:misra_c_2012_rule_10_4_violation:左手操作数" E"(枚举(的必需类型与右操作数" mySuccess"(boolean(的基本类型。
[2]:misra_c_2012_rule_11_9_violation:文字" 0"不得用作null指针常数。
我没有得到为什么Misra报告10.4违规,即使我正在比较myErro.h
文件中的第11行中的相同的枚举类型?
任何线索为什么在这里报告10.9违规行为?Misra使用宏不好吗?
in
static MyError foo(uint32_t x, uint32_y) {
你想要
static MyError foo(uint32_t x, uint32_t y) {
在
中if (e != MYSuccess)
你想要
if (e != MySuccess)
在
中MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0);
没有足够的args,iso c99在variadic宏中至少需要一个论点
警告ISO C不支持__FUNCTION__
预定义标识符
也没有 myutilslogerror 不是由您的问题声明/定义,它的签名是什么?它至少知道什么 myError 是?
我可以使用以下方法解决问题:
问题[1] :misra_c_2012_rule_10_4_violation:左手操作数" E"(ENUM(的必需类型与右操作" mySuccess"(boolean(的必需类型不同。
==>修复:规则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)
因此,将MySuccess
握在单独的MyError
var中有助于修复答案。但是我不知道这是如何解决问题的?似乎没有在单独的var宏扩展中持有MySuccess
,只是将其价值放在比较之前,而Misra将其视为违规。
问题[2]: misra_c_2012_rule_11_9_violation:文字" 0"不得用作null指针常数。
==>修复:规则11.9违规修复程序是:
- 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, 0);
+ 13 MY_UTILS_LOG_ERROR(e, __FILE__, __FUNCTION__, __LINE__, true, "");
这解决了问题,因为myutilslogerror((函数期望格式:arg为指向const char(const char*(的指针。因此,我们不应该通过0
,将""
通过format
ARG修复规则11.9违规。