有必要的部分来阐述我的问题。
以下是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;
}
注意:仅供引用 MyUtilsLogError() 只是一个 API,有助于在控制台上转储日志。
在 myError.c
文件中,我看到以下 MISRA 2012 违规行为:
[1]:misra_c_2012_rule_10_4_violation:左侧操作数“e”(枚举)的基本类型与右侧操作数“MySuccess”( bool 值)的基本类型不同。
[2]:misra_c_2012_rule_11_9_violation:文字“0”不得用作空指针常量。
我不明白为什么 MISRA 报告 10.4 违规,即使我在 myErro.h
文件中的第 11 行比较相同的枚举类型?
知道为什么这里会报告 10.9 违规行为吗? 宏不适用于 MISRA 吗?
最佳答案
在
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); \
没有足够的参数,ISO C99 要求可变参数宏中的“...”至少有一个参数
警告 ISO C 不支持 __FUNCTION__
预定义标识符
此外MyUtilsLogError未声明/定义您的问题,它的签名是什么?它至少知道MyError是什么吗?
关于c - 如何修复此代码中提到的 MISRA-2012 10.4 和 10.9 违规问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56253073/