gpt4 book ai didi

c++ - Microsoft SAL 如何防止差一错误

转载 作者:行者123 更新时间:2023-11-30 04:16:51 24 4
gpt4 key购买 nike

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

关于c++ - Microsoft SAL 如何防止差一错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17497971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com