我很难理解为什么以下代码会给我两个关于规则 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 和 Tasks 相同类型的指针 分别。我不明白为什么我不能将 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/