【问题标题】:Warning C6386 - Buffer overrun while writing to 'LINES_DATA.Lines'警告 C6386 - 写入“LINES_DATA.Lines”时缓冲区溢出
【发布时间】:2021-07-07 03:30:36
【问题描述】:

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

写入“LINES_DATA.Lines”时警告 C6386 缓冲区溢出:可写入大小为“LINES_DATA.NumLines”4 个字节,但可能写入“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];

非常感谢

【问题讨论】:

    标签: c++ visual-studio rapidxml


    【解决方案1】:

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

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

    【讨论】:

    • line_i 好像是从100重置为0,所以直到数组溢出100个元素才有效...
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2017-06-16
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多