0

我很难理解为什么下面的代码给了我关于规则 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如果它们具有完全相同的类型。我错过了什么吗?

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

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

问候。

4

1 回答 1

4

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

在发布的代码中的任何地方都没有执行强制转换。11.3 说明了不同类型之间的转换。我相信 11.3 不可能适用于没有演员的情况,如上所述,无论所涉及的类型是什么。

我的结论是,检查员有错,而且很严重。

于 2015-08-05T17:16:35.423 回答