Microsoft SAL如何通过一个错误防止关闭

How Microsoft SAL can prevent off-by-one error

本文关键字:错误 一个 SAL 何通过 Microsoft      更新时间:2023-10-16

下面是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应该和src大小相同或大1字节吗?

正确的注释是:

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!
}
相关文章: