【问题标题】:VS2015: [C6386] Buffer Overrun while writing (even for same index value)VS2015:[C6386] 写入时缓冲区溢出(即使对于相同的索引值)
【发布时间】:2016-05-13 08:37:04
【问题描述】:

当我在 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' 字节。”

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

【问题讨论】:

  • @Sourav:在 c++ 中(这是 VS 中的默认设置),您必须这样做。
  • @MikeMB 是不是我们有 C 编译器来编译 C 代码?无论如何,我们应该使用它。顺便说一句,这只是一个信息丰富的评论。
  • @Ajay C++ 有new,最好使用它。你可以射你的脚,但这并不意味着你必须。 :)
  • @LPs、freenew可以用空指针调用

标签: c++ visual-studio-2015


【解决方案1】:

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

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

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

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

【讨论】:

  • 也许您可以明确声明,智能指针应该用于拥有指针。非拥有的原始指针没有任何问题。
【解决方案2】:

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

【讨论】:

  • 你需要开启代码分析
  • @Ajay,我针对这段代码运行了代码分析工具:Running Code Analysis for C/C++...
  • 你是对的。甚至我都没有得到它(32位,64位编译)。可能是OP可以更多地了解它。这是确切的代码吗?哪个VS版本? (我有VS2015 U2)
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 2017-06-16
  • 2019-11-20
相关资源
最近更新 更多