cppcheck 动态数组大小的越界错误

问题描述 投票:0回答:1

我有 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 上的任何专家都可以阐明这里发生的事情

c cppcheck gnu-arm
1个回答
0
投票

这似乎是来自

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。希望他会对您的帖子发表一些评论。

© www.soinside.com 2019 - 2024. All rights reserved.