问题描述
我知道之前有人问过这个问题,但我无法完全修复我的代码,甚至阅读其他主题。 有谁知道为什么会抛出这个警告?
警告 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];
非常感谢
解决方法
如果数组 (LINES_DATA.Lines) 有line_i
个元素,则 LINES_DATA.Lines[line_i]
无效。
数组是从零开始的,所以 LINES_DATA.Lines
有元素 0 到 line_i-1
这只是一个代码分析警告。编译器不够聪明,无法计算出程序的整个运行时行为。
您的代码确实存在缓冲区溢出的重大风险,尤其是当 XML 包含 100 多个元素时。您应该在这里使用智能指针和/或 STL 容器。