2016-05-13 573 views
1

我尝试在C中实现合并排序,当我遇到由Visual Studio 2015中的[分析 - >运行代码分析]引发的一些有趣问题时。VS2015:[C6386]写入时缓冲区溢出(即使对于相同的索引值)

的代码如下:

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,在第一个版本,我得到警告:

"Buffer overrun while writing to 'R': the writable size is '(unsigned int)rightCount*sizeof(int)' bytes, but '8' bytes might be written."

任何想法,为什么日是这样吗?期待听到你的答案。

+0

[请参阅此讨论,为什么不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+2

@Sourav:在c + +(这是在VS中的默认值),你必须。 – MikeMB

+0

@MikeMB是不是像我们有C编译器来编译C代码?无论如何,我们应该使用它。顺便说一句,这只是一个内容丰富的评论。 –

回答

2

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

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

理论上,应该始终用户新的智能指针像元unique_ptrshared_ptr等,他们不仅分配内存给你,但取消分配跨调用栈抛出的任何异常。你完全不需要输入*

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

也许你可以明确指出,智能指针应该用于拥有指针。非拥有的原始指针没有问题。 – MikeMB

2

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

+0

你需要启用代码分析 – Ajay

+0

@Ajay,我运行代码分析工具对此代码:*运行代码分析的C/C++ ... * – ixSci

+0

你是对的。即使我没有得到它(32位,64位编译)。可能是OP可以揭示更多的光线。这是完全的代码吗?哪个VS版本? (我有VS2015 U2) – Ajay