0

想到微软的SAL(Source Annotation Language)是个好东西,研究了语言和注解属性的含义。

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

[返回值:SA_Post(MustCheck=SA_Yes)] int __cdecl isalpha([SA_Pre(Null=SA_No)] [SA_Pre(Deref=1,Valid=SA_Yes,Access=SA_Read)] int _C);

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

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

4

1 回答 1

1

看起来您已经粘贴了 isalpha 声明的预处理版本。我在 ctype.h 中看到的是:

_Check_return_ _CRT_JIT_INTRINSIC _CRTIMP int __cdecl isalpha(_In_ int _C);

_In_允许在标量参数(int 等)上使用,以便让开发人员明确表示该参数是严格的输入参数。这有点多余,但仍然是正确的(毕竟,您不能通过按值传递的标量返回值)。

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

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

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

于 2011-11-25T05:30:24.043 回答