2013-07-05 62 views
1

以下是MSDN(http://msdn.microsoft.com/en-us/library/hh916383.aspx)上給出的一個示例,該示例試圖解釋SAL註釋有助於找到常見的錯誤。Microsoft SAL如何防止逐一出錯

wchar_t * wmemcpy(
_Out_writes_all_(count) wchar_t *dest, 
_In_reads_(count) const wchar_t *src, 
size_t count) 
{ 
    size_t i; 
    for (i = 0; i <= count; i++) { // BUG: off-by-one error 
     dest[i] = src[i]; 
} 
return dest; 
} 

我不太明白這個例子。在這個例子中,它看起來像函數簽名包含一個名爲count的參數,所以我們可以使用In_reads_(count)來確保src指向的內存空間至少具有這樣的字節數。
我的問題是,如果有一種是這樣

memcpy_example(wchar_t* dest, wchar_t* src) 

在這種情況下,有特色的功能,簽名不包含有關大小的任何信息。我可以使用SAL來告訴調試程序dest應該是大於或等於src的1個字節嗎?

+0

'memcpy'有一個'size'參數,用於指定要複製的字節數。你希望你的'memcpy_example'函數能夠複製多少個字節? –

回答

2

正確註釋應該是:

memcpy_example(
    _Out_writes_z_(_String_length_(src) + 1) wchar_t *dest, 
    _In_z_ const wchar_t *src) 

然而,分析是在這種情況下要少得多精確,因爲分析儀不知道實際的串長度在大多數情況下(與VS 2013測試):

void test_sal() 
{ 
    wchar_t out[10]; 
    auto in1 = L"123456789"; 
    auto in2 = _wcsdup(L"123456789"); 

    memcpy_example(out, in1); // SAL warning 
    memcpy_example(out, in2); // No warning! 
}