繁体   English   中英

Microsoft SAL如何防止一字不漏的错误

[英]How Microsoft SAL can prevent off-by-one error

这是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!
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM