2016-05-13 577 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