2013-07-05 28 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! 
}