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

时间:2015-08-05 15:59:43

标签: 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
};

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

这里的问题是 TaskParams TaskConfig 都是结构元素 Params 任务的相同类型的指针分别。我不明白为什么我无法将 TaskParams 分配给 * Params 完全相同的类型。我错了什么吗?

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

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

问候。

1 个答案:

答案 0 :(得分:4)

MISRA-C 2004 6.10.7意味着演员表是显式类型转换,并以with start_points as( select tmp.*, --calculate distance between start points (lead(ts) OVER w)-ts AS start_point_lead from( select t.*, ts - (lag(ts) OVER w) AS lag from test t window w as (PARTITION BY buyer ORDER BY ts) ) tmp where lag is null or lag>interval '45 minutes' window w as (PARTITION BY buyer ORDER BY ts) order by ts ) select s.buyer, s.ts, count(*), sum(t.bougth_flag) from start_points s join test t on t.buyer=s.buyer and (t.ts-s.ts<s.start_point_lead or s.start_point_lead is null)and t.ts>=s.ts group by s.buyer, s.ts order by s.ts 的形式提供了大量示例。这与该术语的通用定义一致。我相信我们可以使用这个定义来讨论MISRA-C合规性。

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

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