首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft SAL如何防止off-by-one错误

Microsoft SAL如何防止off-by-one错误
EN

Stack Overflow用户
提问于 2013-07-06 07:13:29
回答 1查看 339关注 0票数 1

下面是MSDN (http://msdn.microsoft.com/en-us/library/hh916383.aspx)上的一个例子,它试图解释SAL注释可以帮助找到常见的off-by-one错误。

代码语言:javascript
复制
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所指向的内存空间至少具有这样的字节数。

我的问题是,如果有一个具有如下签名的函数会怎么样?

代码语言:javascript
复制
memcpy_example(wchar_t* dest, wchar_t* src)

在这种情况下,签名不包含任何有关大小的信息。我是否可以使用SAL告诉调试器dest应该与src相同大小或比SAL大1个字节

EN

回答 1

Stack Overflow用户

发布于 2015-02-24 18:29:09

正确的注解应该是:

代码语言:javascript
复制
memcpy_example(
    _Out_writes_z_(_String_length_(src) + 1) wchar_t *dest,
    _In_z_ const wchar_t *src)

然而,在这种情况下,分析的精确度要低得多,因为分析器在大多数情况下都不知道实际的字符串长度(使用VS 2013测试):

代码语言:javascript
复制
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!
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17497971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档