MSVC SAL与C ++ 2a合同

时间:2018-12-15 08:57:10

标签: c++ c++20 sal

在MSVC中,有SAL feature,可用于描述参数,结果等,并且效果很好,并且可移植性也很好,C ++ 2a Contract功能似乎也可以做到这一点东西,有人可以给他们一些区别吗?

1 个答案:

答案 0 :(得分:4)

SAL与合同之间没有真正的重叠。 SAL涉及对参数和返回值进行注释,以描述函数如何使用它们的某些方面。关于描述函数需要其参数以及调用者可以期望返回值的内容的契约。这些听起来很相似,但是却有很大不同。

例如,SAL具有参数是输入,输出还是输入/输出参数的概念。这与函数对参数的作用有关。合同没有这种概念,因为它们不在乎函数对参数的作用。

现在有一些重叠。有时,功能需要什么,功能要如何对齐。例如,如果函数期望指针参数不是nullptr,则可以对该函数应用[[pre: param != nullptr]]协定。但是,_In_指针参数注释的SAL概念涵盖了相同的一般思想:如果函数使用参数作为指向对象的有效指针,则自然不能为nullptr。因此_In_可以避免这种情况。

SAL最终是关于描述函数如何使用数据的;合同是关于函数的接口和调用代码的。

此外,SAL的表达能力极为有限。它有一些复杂的语句,例如“是一个以空值结尾的字符串”,但是它没有基础,您可以自己构建。合同是C ++表达式,因此它们可以验证C ++表达式可以验证的任何