MSVC SAL 与 C++2a 契约

MSVC SAL vs. C++2a Contract

MSVC中有SAL feature,可以用来描述参数,结果等,效果不错,可移植性也不错,C++2a Contract feature好像可以同样的事情,有人能说说他们之间的区别吗?

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

例如,SAL 具有参数是输入、输出还是 in/out 参数的概念。这是函数对参数执行的操作的问题。合约没有这样的概念,因为它们不关心函数对参数做了什么。

现在有一些重叠。有时,一个函数期望什么和一个函数确实对齐。例如,如果一个函数期望一个指针参数不是 nullptr,您可以对该函数应用一个 [[pre: param != nullptr]] 契约。然而,_In_ 指针参数注释的 SAL 概念涵盖了相同的一般思想:如果函数使用参数作为指向对象的有效指针,那么它自然不能是 nullptr。所以 _In_ 可以防止这种情况发生。

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

此外,SAL 可以表达的内容非常有限。它有一些像 "is a null-terminated string" 这样的复杂语句,但它没有您可以构建自己的语句的基础。合约是 C++ 表达式,因此它们可以验证 C++ 表达式可以验证的任何内容