C-如何修复此代码中提到的Misra -2012 10.4和10.9违规问题



有必要的零件来制定我的问题。以下是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违规。

最新更新