Buffer-overrun警告原因咨询:C++动态数组扩容代码问题
C6386缓冲区溢出警告的原因及修复
问题背景
编写了一个程序,功能是创建动态数组arr2,将用户输入的新值追加到arr2,同时把原数组arr1的元素复制到arr2中。程序能正常运行,但出现以下警告:
Warning C6386 Buffer overrun while writing to 'arr2': the writable size is 'size*4' bytes, but '8' bytes might be written
同时构建日志还提示main函数返回值的警告:
warning C4326: return type of 'main' should be 'int' instead of 'void'
原代码如下:
#include <iostream> using namespace std; void add(int array[], int size, int value); void main() { int s = 5, v={}, arr1[5] = {1,2,3,4,5}; cout << "\nHere is an array: "; for (int i = 0;i < 5;i++) { cout << arr1[i] << " "; } cout << "\nValue you want to add: "; cin >> v; add(arr1, s,v); } void add(int array[], int size, int value) { size = size + 1; int* arr2 = new int[size]; for (int i = 0;i < 5;i++) { arr2[i] = array[i];//Warning Occurs here at line 28 } arr2[size - 1] = value; cout << "Here is the array with the added value: "; for (int i = 0;i < size;i++) { cout << arr2[i] << " "; } delete[] arr2; }
C6386警告的具体原因
这个警告是编译器静态分析工具检测到潜在的数组越界访问风险:
- 在
add函数中,你先把传入的size(原数组长度)加1,创建了长度为size的动态数组arr2(此时size是原长度+1)。 - 但复制原数组元素时,你用了硬编码的循环条件
i < 5,而非基于传入的原数组长度。 - 静态分析工具会考虑通用场景:如果调用
add时传入的size小于5(比如传入size=3),那么arr2的长度是4,循环i <5会尝试访问arr2[3]和arr2[4],其中arr2[4]超出了数组的可写范围(数组索引从0开始,长度为4的数组最大索引是3),这就会触发缓冲区溢出警告。
你当前测试时传入的size是5,所以不会出现实际错误,但工具会预判这种通用场景下的风险。
修复方案
1. 修复C6386警告
复制原数组元素时,使用传入的原数组长度作为循环条件,不要用硬编码的5。可以先保存原size的值,再修改size:
void add(int array[], int size, int value) { int originalSize = size; // 保存原数组长度 size = size + 1; int* arr2 = new int[size]; for (int i = 0;i < originalSize;i++) // 使用原长度循环 { arr2[i] = array[i]; } arr2[size - 1] = value; cout << "Here is the array with the added value: "; for (int i = 0;i < size;i++) { cout << arr2[i] << " "; } delete[] arr2; }
2. 修复C4326警告
C++标准要求main函数的返回类型必须是int,将void main()改为int main(),并在函数末尾添加return 0;:
int main() { int s = 5, v={}, arr1[5] = {1,2,3,4,5}; cout << "\nHere is an array: "; for (int i = 0;i < 5;i++) { cout << arr1[i] << " "; } cout << "\nValue you want to add: "; cin >> v; add(arr1, s,v); return 0; // 添加返回语句 }
修复后的完整代码
#include <iostream> using namespace std; void add(int array[], int size, int value); int main() { int s = 5, v={}, arr1[5] = {1,2,3,4,5}; cout << "\nHere is an array: "; for (int i = 0;i < 5;i++) { cout << arr1[i] << " "; } cout << "\nValue you want to add: "; cin >> v; add(arr1, s,v); return 0; } void add(int array[], int size, int value) { int originalSize = size; size = size + 1; int* arr2 = new int[size]; for (int i = 0;i < originalSize;i++) { arr2[i] = array[i]; } arr2[size - 1] = value; cout << "\nHere is the array with the added value: "; for (int i = 0;i < size;i++) { cout << arr2[i] << " "; } delete[] arr2; }
内容的提问来源于stack exchange,提问作者Sleek Cheems
相关产品推荐
相关产品推荐

