当我遇到[Analyze - >提出的有趣内容时,我正试图在C中实现合并排序。在Visual Studio 2015中运行代码分析]。
代码如下:
void MergeSort_r(int A[], int n)
{
// A = {1, 3, 2}
// n = 3
int rightCount;
int* R;
if ( n < 2 ) return;
// version 1: rightCount = 2
rightCount = n - (n/2);
// version 2: rightCount = 2
rightCount = n - 1;
R = ( int* ) malloc( rightCount * sizeof( int ) );
if ( R ) {
for ( int i = 0; i < rightCount; i++ ) {
R[i] = A[i];
}
free( R );
}
}
即使两个版本的rightCount基本上都计算为2,但在第一个版本中,我收到了警告:
“写入'R'时缓冲区溢出:可写大小为'(unsigned int)rightCount * sizeof(int)'字节,但可能写入'8'字节。”
知道为什么会这样吗?期待听到您的回答。
答案 0 :(得分:3)
Visual C ++代码分析工具集可能并不总是提供最佳警告。它会尝试为您提供最佳警告,以修复可能在运行时出现的潜在问题/错误。你有几个选择:
#pragma
指令禁用代码周围的给定警告。new
,make_unique
等。理想情况下,您应该始终使用较新的智能指针原语,如unique_ptr
,shared_ptr
等。它们不仅为您分配内存,还会释放调用堆栈中抛出的任何异常。您不需要完全输入*
!
auto buffer = make_unique<int[]>(10); // 10 integers
答案 1 :(得分:3)
您的代码很好,工具(特别是分析器)有它们的缺点 - 有时它们会产生误报。这是其中之一。顺便说一下,我在MSVS2015上检查了你的代码,它没有给我任何警告。