下面是MSDN (http://msdn.microsoft.com/en-us/library/hh916383.aspx)上的一个例子,它试图解释SAL注释可以帮助找到常见的off-by-one错误。
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相同大小或比SAL大1个字节
发布于 2015-02-24 18:29:09
正确的注解应该是:
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!
}https://stackoverflow.com/questions/17497971
复制相似问题