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

标签 c misra safety-critical

有必要的部分来阐述我的问题。 以下是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/

相关文章:

exception - 安全关键型嵌入式系统中的 Ada 异常(exception)情况

C 指针转换 - 值截断

c - Pantheios 滚动文件附加程序?

c++ - Eclipse ide 需要与 MISRA 规则集成

system - 学习安全关键系统开发 (C/C++) 的最佳资源是什么

C++ 运算符重载错误检查无异常

仅使用 C 函数编写简单的 parking 费计算器

c++ - 根据是 C 还是 C++ 执行 header 中存在的不同代码

c - 初始化枚举类型期间的 MISRA-C 警告

c - MISRA-C适用于Linux应用吗