c - 为什么此代码不符合 MISRA-C 2012 规则 11.3

标签 c pointers misra

我很难理解为什么以下代码会给我两个关于规则 11.3 的错误

#define NUM_TASKS 3

typedef struct
{
    void (*TaskFunc)(void);
    uint32_t     Periodicity;
    uint32_t     StartOffset;
} TaskConfig_t;

typedef enum
{
    IDLE,
    RUNNING
} TaskStatus_t;

typedef struct
{
    uint32_t ExecTime;
    uint32_t MinExecTime;
    uint32_t MaxExecTime;
} TaskMetrics_t;

typedef struct
{
    uint32_t TimeToRun;
    uint8_t OverrunCnt;
    TaskStatus_t Status;  
    TaskMetrics_t Metrics;      
} TaskParam_t;

typedef struct
{
  uint32_t *CpuUtilizationPercent;
  uint32_t *Counter;
  TaskParam_t *Params;
  TaskConfig_t *Tasks;
  uint8_t NumTasks;
} PPTS_Config_t;

static uint32_t PPTS_CpuUtilizationPercent;
static uint32_t PPTS_Counter;

static TaskParam_t TaskParams[NUM_TASKS];

static TaskConfig_t TaskConfig[NUM_TASKS];

const PPTS_Config_t CnfPPTS =
{
  &PPTS_CpuUtilizationPercent,
  &PPTS_Counter,
  TaskParams,  /* MISRA-C rule 11.3 violation */
  TaskConfig,   /* MISRA-C rule 11.3 violation */
  NUM_TASKS
};

在这两种情况下,错误都是:不应在指向对象类型的指针和指向不同对象类型的指针之间执行转换

这里的事情是 TaskParamsTaskConfig 都是与结构元素 ParamsTasks 相同类型的指针 分别。我不明白为什么我不能将 TaskParams 分配给 *Params 如果它们具有完全相同的类型.我是不是写错了什么?

非常感谢您的帮助,我希望这能得到解释,因为我真的很沮丧。

编辑:如果有帮助的话,我已经包括了所有相关的数据类型。

问候。

最佳答案

MISRA-C 2004 6.10.7 暗示强制转换是一种显式类型转换,并以(type)value 的形式给出了一堆示例。这与该术语的通用定义一致。我相信我们可以使用这个定义来讨论 MISRA-C 合规性。

在发布的代码中的任何地方都没有执行转换。 11.3 说了一些关于在不同类型之间进行转换的内容。我相信 11.3 不可能适用于没有强制转换(如上定义)的情况,无论涉及的类型是什么。

我得出结论,检查员有错,而且是一个严重的错误。

关于c - 为什么此代码不符合 MISRA-C 2012 规则 11.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31837410/

相关文章:

c++ - malloc 和 new 是否返回一个 int 对齐的地址?

代码立即停止响应(c、指针、文件 I/O)

c - Polyspace 警告系统函数使用系统定义的参数标志

c++ - PJNATH 是否支持 ALTERNATE-SERVER 重定向?

c - 为什么使用 printf 的输出不同?

c - 插入排序的实现

c++ - 错误 : argument of type "float(*)[1] " is incompatible with parameter of type "float** "

c - 如何编写与MISRA:2012完全兼容的memcpy函数?

standards - “dead code”和 “unreachable code”有什么区别?

ios - Swift 字符串到遗留 C 字符数组