gpt4 book ai didi

visual-c++ - _Pre_defensive_ 注释是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 06:44:23 29 4
gpt4 key购买 nike

因此,我相当熟悉使用 Microsoft 源注释语言(VS 2012-2013 风格)来描述带有指针的函数契约。

不过,我很好奇的一件事是,在带注释的被调用方未首先检查指针的情况下,我希望使用 _In_ _Pre_defensive_ 得到不同的结果。 [我们的许多遗留函数都需要这些参数的有效输入,但政策是仔细检查。]是否存在静态分析错误来描述标记为防御性而不是 self 保护的函数?

来自docs ,

If a function appears at a trust boundary, we recommend that you use the _Pre_defensive_ annotation. The "defensive" modifier modifies certain annotations to indicate that, at the point of call, the interface should be checked strictly, but in the implementation body it should assume that incorrect parameters might be passed. In that case, In _Pre_defensive_ is preferred at a trust boundary to indicate that although a caller will get an error if it attempts to pass NULL, the function body will be analyzed as if the parameter might be NULL, and any attempts to de-reference the pointer without first checking it for NULL will be flagged.

这是一个用于代码分析的小演示程序。我的所有 4 个函数在静态分析中都显示 C6387,但我希望看到一个额外的指示,表明我的“防御”函数实际上并未像 fun0() 中那样检查输入。添加此限定符有什么好处吗?它确实使声明变得困惑,所以如果它没有帮助,就很难证明将它放在那里是合理的。

// SAL2013.cpp : Defines the entry point for the console application.

#include "stdafx.h"

// pre-defensive annotation, but no check
void fun0(_In_ _Pre_defensive_ int* pInt)
{
auto oops = *pInt;
}

// not defensive, no check
void fun1(_In_ int* pInt)
{
auto oops = *pInt;
}

// defensive check, but not annotated defensively
void fun2(_In_ int* pInt)
{
if (pInt != nullptr)
{
auto oops = *pInt;
}
}

// defensive, with annotation
void fun3(_In_ _Pre_defensive_ int* pInt)
{
if (pInt != nullptr)
{
auto oops = *pInt;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int* p = nullptr;
fun0(p); // C6387 Invalid Parameter Value
fun1(p); // C6387 Invalid Parameter Value
fun2(p); // C6387 Invalid Parameter Value
fun3(p); // C6387 Invalid Parameter Value

return 0;
}

奖励问题:我在 sal.h 中看到还有一个 _In_defensive_(annotes) 注释,但我不明白如何使用它。

谢谢。

最佳答案

AFAICT 目前在添加 _defensive_ 注释时没有(公开)差异。然而,微软有额外的和扩展的分析器供他们内部使用。这些可能会使用注释,也可能在将来向公众发布。

所以这是一个权衡。如果您认为它们使声明过于困惑,那么删除它们并没有真正的危害(尽管请注意,通过 _Use_decl_annotations_ 您只需要将注释放在 header 中)。另一方面,将来它可能会被使用,它也可以用作预期用途的文档。

编辑:至于_In_defensive_(annotes),它允许您将_Pre_defensive_ 注释应用于所有注释(在annotes 中给出)。此外,这允许您将注释放在不同的位置,即

_In_defensive(_Pre_satisfies_(pInt != nullptr))
void fun3(int* pInt)
{
}

关于visual-c++ - _Pre_defensive_ 注释是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24045422/

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