繁体   English   中英

VS2015:[C6386] 写入时缓冲区溢出(即使对于相同的索引值)

[英]VS2015: [C6386] Buffer Overrun while writing (even for same index value)

当我在 Visual Studio 2015 中遇到 [Analyze -> Run Code Analysis] 提出的有趣问题时,我正尝试在 C 中实现合并排序。

代码如下:

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’字节。”

知道为什么会这样吗? 期待听到您的回答。

Visual C++ 代码分析工具集可能并不总是提供最好的警告。 它试图为您提供最好的一组警告,以修复一些可能在运行时出现的潜在问题/错误。 你有几个选择:

  • 使用#pragma指令禁用代码周围的给定警告。
  • 使用 C++ 构造: newmake_unique等。
  • (不推荐)是完全忽略警告并继续前进。

理想情况下,您应该始终使用较新的智能指针原语,如unique_ptrshared_ptr等。它们不仅为您分配内存,而且会在调用堆栈中抛出的任何异常时解除分配。 您根本不需要输入*

auto buffer = make_unique<int[]>(10); // 10 integers

您的代码很好,但工具(尤其是分析器)有其缺点——有时它们会产生误报。 这就是其中之一。 顺便说一句,我在 MSVS2015 上检查了你的代码,它没有给我任何警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM