MSVC SAL vs. C++2a Контракт

В MSVC есть функция SAL, которую можно использовать для описания параметра, результата и т. Д., И она работает хорошо, а переносимость также хороша, функция контракта C++2a, кажется, делает то же самое, может кто-нибудь дать Разница между ними?

1 ответ

Решение

Нет реального совпадения между SAL и контрактами. SAL - это аннотирование параметров и возвращаемых значений для описания некоторых аспектов того, как функция их использует. Контракты об описании того, что функция требует от своих параметров и что может ожидать вызывающая сторона возвращаемого значения. Эти звуки похожи, но они очень разные.

Например, SAL имеет представление о том, является ли параметр входным, выходным или входным / выходным параметром. Это вопрос того, что функция делает с параметрами. Контракты не имеют такого понятия, потому что их не волнует, что функция делает с параметром.

Теперь есть некоторые совпадения. Иногда, что ожидает функция и что функция выравнивает. Например, если функция ожидает, что параметр указателя не будет nullptr, вы бы применить [[expects: param != nullptr]] контракт на эту функцию. Тем не менее, SAL понятие _In_ аннотации параметров указателя охватывают ту же общую идею: если функция использует параметр в качестве действительного указателя на объект, то, естественно, он не может быть nullptr, Так _In_ защищает от этого.

В конечном счете, SAL описывает, как функция использует данные; контракты касаются интерфейса функции с вызывающим кодом.

Кроме того, SAL чрезвычайно ограничен в том, что вы можете выразить. У него есть несколько сложных операторов, таких как "строка с нулевым символом в конце", но у него нет основы, на которой вы можете строить свои собственные. Контракты являются выражениями C++, и поэтому они могут проверять все, что может проверять выражение C++.

Другие вопросы по тегам