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