gpt4 book ai didi

c++ - SAL(源注释语言)的目的是什么?SAL 1 和 2 之间有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:14 24 4
gpt4 key购买 nike

如题中所问:

What is the purpose of SAL (Source Annotation Language) and what is the difference between SAL 1 and SAL 2?

我了解用法的基础知识,这有助于突出传递给函数的每个变量的目的以及用于静态代码分析的各种其他内容,但它实际上有多大区别(忽略越来越清晰的对项目中其他程序员的参数要求)?

如果我有以下原型(prototype):

_Success_(return == 1) 
int TestFunction( _In_ int* pTest, _Inopt_ char* pOptional );

这应该“告诉”静态分析器该函数在成功运行后将返回 1,pTest 是一个指针,不能为 nullptr 并且pOptional 是一个指针,它可以是也可以不是 nullptr。但是,静态分析器不能从函数定义本身获取这些信息吗?此外,它如何处理获得的信息(例如成功标准)?

此外,为什么 SAL 1 和 SAL 2 之间存在差异,为什么微软决定改变他们命名宏的方式(即从 __out_Out___success_Success_?)

如果在 MSDN 的某个地方对此进行了详细描述,我很抱歉,但我无法在 StackOverflow 上找到它或任何其他问题的详细答案,所以我想我会问一下,希望能满足我的好奇心。

提前感谢您的宝贵时间!

最佳答案

我阅读了您问题中的多个问题,希望我能全部回答:

为什么要使用 SAL 而不仅仅是从源代码中推导?

关于使用 SAL 明确告诉分析器有关参数行为等详细信息的观点有多个答案。

  1. 虽然分析器可以从实现中推断出参数行为,但它通常无法区分实现的意图和意外。作为开发人员,如果您明确说明不同参数的预期用途,分析器既可以验证您编写的实现是否满足您的意图,也可以验证调用方是否正确使用了它。

  2. 当源代码不可用于分析时,这会为静态分析器提供有关函数行为的信息,例如在作为 Visual Studio、驱动程序套件等的一部分提供的各种头文件中声明的函数。

  3. SAL 允许表达难以甚至不可能仅从源代码推断的概念,例如驱动程序中的锁使用和 IRQL 要求。

  4. 这也有助于与回调函数保持一致。 Windows header 描述的一些框架可能会声明一组回调函数,因此 Windows 框架将调用那些在别处(应用程序、驱动程序等)定义的回调函数。因此 Windows 永远看不到被调用函数的源代码,回调函数定义也永远看不到调用者。

分析器从成功中得到什么信息?

这与您编写的案例无关。但是在有输出参数的情况下(例如 Out 和 family),这意味着如果函数不成功,调用者不能依赖输出注释。例如:

_Success_(return) bool GetASmallInt(_Out_range_(0, 10) int& an_int);

如果 GetASmallInt 返回 true,则 an_int 将介于 0 和 10 之间,包括 0 和 10。如果它返回 false,则不存在这样的保证,并且该变量甚至可能还没有被函数初始化。

SAL 1 和 SAL 2 之间有什么区别,为什么注释从 __in 重命名为 _In_

SAL 的原始定义中的一些特殊情况(例如 __in)与 C++ 不能很好地融合。新语法从一些较新的实现开始,确保它符合 C 和 C++ 语法的要求。

SAL 1 和 SAL 2 之间的主要区别在于 SAL 2 能够表达很多 SAL 1 不能表达的概念,并且 SAL 2 定义得更好,尤其是在 C++ 方面,如上所述。

关于c++ - SAL(源注释语言)的目的是什么?SAL 1 和 2 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265188/

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