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

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

0 голосов
/ 15 декабря 2018

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

1 Ответ

0 голосов
/ 15 декабря 2018

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

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

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

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

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

...