警告 C6386 - 写入“LINES_DATA.Lines”时缓冲区溢出

时间:2021-07-07 03:30:36

标签: c++ visual-studio rapidxml

我知道之前有人问过这个问题,但我无法完全修复我的代码,甚至阅读其他主题。 有谁知道为什么会抛出这个警告?

警告 C6386 写入“LINES_DATA.Lines”时缓冲区溢出:可写大小为“LINES_DATA.NumLines4”字节,但可能会写入“8”字节。*
"

    LINES_DATA.NumLines = line_i; //line_i = 100
    LINES_DATA.Lines = new int* [LINES_DATA.NumLines]; 

    line_i = 0;

    for (rapidxml::xml_node<>* pNode = pRoot->first_node(); pNode; pNode = pNode->next_sibling())
    {
        LINES_DATA.Lines[line_i] = new int[COLUMNSIZE]; //COLUMNSIZE = 5

        for (int pos_i = 0; pos_i < COLUMNSIZE; pos_i++)
        {
            LINES_DATA.Lines[line_i][pos_i] = pNode->value()[pos_i] - '0';
        }
        line_i++;
    }

我在这一行收到警告:

LINES_DATA.Lines[line_i] = new int[COLUMNSIZE];

非常感谢

2 个答案:

答案 0 :(得分:1)

如果数组 (LINES_DATA.Lines) 有line_i 个元素,则 LINES_DATA.Lines[line_i] 无效。

数组是从零开始的,所以 LINES_DATA.Lines 有元素 0 到 line_i-1

答案 1 :(得分:0)

这只是一个代码分析警告。编译器不够聪明,无法计算出程序的整个运行时行为。

您的代码确实存在缓冲区溢出的重大风险,尤其是当 XML 包含 100 多个元素时。您应该在这里使用智能指针和/或 STL 容器。