1

这是 MSDN ( http://msdn.microsoft.com/en-us/library/hh916383.aspx )上给出的一个示例,它试图解释 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应该是相同大小还是比 1 字节大src

4

1 回答 1

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"12345678901234";
    auto in2 = _wcsdup(L"12345678901234");

    memcpy_example(out, in1); // SAL warning
    memcpy_example(out, in2); // No warning!
}
于 2015-02-24T10:29:08.640 回答