[英]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.