我已经认识到微软的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内部字节数组的引用。静态分析器如何利用此注释?
答案 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更好,除非你真的想要查看这样的底层实现细节。