我有 GPIO 初始化代码(示例如下)。已遵守,没有任何问题,并正确执行。
typedef enum {
USER_LED = 0,
DEBUG_UART_TX,
DEBUG_UART_RX,
TOTAL_IO_PINS,
} gpio_pin;
typedef struct
{
GPIO_PRT_Type *port;
uint32_t pin;
uint8_t drive_mode;
uint8_t hsio; // high speed io matrix/multiplexer
} st_gpioconfig;
st_gpioconfig gpio_configuration_array[] = {
{ GPIO_PRT13, P13_7_PIN, CY_GPIO_DM_STRONG_IN_OFF, HSIOM_SEL_GPIO },
{ GPIO_PRT5, P5_1_PIN, CY_GPIO_DM_STRONG_IN_OFF, P5_1_SCB5_UART_TX },
{ GPIO_PRT5, P5_0_PIN, CY_GPIO_DM_HIGHZ, P5_0_SCB5_UART_RX },
};
void gpio_init()
{
cy_stc_gpio_pin_config_t pinCfg;
memset((void *)&pinCfg, 0, sizeof(pinCfg));
for (int i = 0; i < TOTAL_IO_PINS ; i++) {
pinCfg.driveMode = gpio_configuration_array[i].drive_mode;
pinCfg.hsiom = gpio_configuration_array[i].hsio;
Cy_GPIO_Pin_Init(gpio_configuration_array[i].port, gpio_configuration_array[i].pin,
&pinCfg);
}
}
但是当使用 cppcheck 进行静态分析时,会抛出下面提到的错误
[src/gpio.c:46]: (error) Array 'gpio_configuration_array[1]' accessed at index 2, which is out of bounds.
[src/gpio.c:47]: (error) Array 'gpio_configuration_array[1]' accessed at index 2, which is out of bounds.
[src/gpio.c:48]: (error) Array 'gpio_configuration_array[1]' accessed at index 2, which is out of bounds.
通过以下更改修复了错误
**st_gpioconfig gpio_configuration_array[TOTAL_IO_PINS]**
CPPCHECK 上的任何专家都可以阐明这里发生的事情
这似乎是来自
Cppcheck
的误报。可能是,当我们省略维度时,Cppcheck
无法计算数组的大小,就像编译器根据初始值设定项的大小为我们计算数组的大小一样。
当数组初始化并且在定义中省略维度时,
Cppcheck
似乎假定数组大小为1
,并且当它发现除1
st元素之外的该数组的任何元素的访问时最终报告错误。
发现一些与误报数组索引越界相关的帖子,由
Cppcheck
报告:
最好在帖子中提供您正在使用的
Cppcheck
的版本。sizeof (gpio_configuration_array) / sizeof (gpio_configuration_array[0])
计算 for
循环条件下的数组大小等,并检查 Cppcheck
的行为。要在 Cppcheck
中报告问题,您可以在此处发起讨论 - cppcheck 讨论。
Cppcheck
的开发者也是 SO 的贡献者 - @Daniel Marjamäki。希望他会对您的帖子发表一些评论。