簡體   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