Microsoft的SAL Deref = 1属性与“int”参数有关吗?

时间:2011-07-07 14:53:34

标签: windows annotations microsoft-sal

我已经认识到微软的SAL(源注释语言)是一件好事,并研究了annotation properties的语言和含义。

我有一个关于使用SAL的“ Deref ”属性与“ int ”参数相关的一般性问题。让我用SAL中的isalpha()函数说明我的问题,该函数取自运行Visual Studio 10的ctype.h包含文件:

  

[返回值:SA_Post(MustCheck = SA_Yes)]   int __cdecl   因而isalpha([SA_Pre(空= SA_No)]   [SA_Pre(DEREF = 1,有效值= SA_Yes,访问= SA_Read)]   int _C);

如果单个参数_C是“ int ”,那么“[SA_Pre( Deref = 1 ,Valid = SA_Yes,Access = SA_Read)]”是什么意思?如何以有意义的方式解除引用一次(Deref = 1)?

我能想到的唯一解释是注释表明整数是对ctype内部字节数组的引用。静态分析器如何利用此注释?

1 个答案:

答案 0 :(得分:1)

它看起来像是你粘贴在isalpha声明的预处理版本中。我在ctype.h中看到的是:

_Check_return_ _CRT_JIT_INTRINSIC _CRTIMP int __cdecl isalpha(_In_ int _C);
标量参数(int等)允许使用

_In_,以便让开发人员明确表示该参数严格来说是一个输入参数。这有点多余,但仍然是正确的(毕竟,你不能通过传值值标量返回值)。

注释_In_是一个宏,它会在您粘贴上面时进行扩展,以表达输入指针的语义。静态分析器识别何时将_In_应用于标量参数并忽略它,因为Null和Deref = 1在int上都没有意义。

在任何其他上下文中,除了作为_In_注释的一部分之外,int上的Deref = 1也没有意义。

通常使用_In_样式语法而不是SA_Pre和SA_Post更好,除非你真的想要查看这样的底层实现细节。