警告 C28196
要件が満たされていません (式は true に評価されません)
この警告は、分析__notnull
対象の関数にパラメーターまたは戻り値に対して 、__null
__drv_valueIs
または同様の_Out_
注釈があるが、返される値がその注釈と矛盾していることを示します。
解説
このような__notnull
注釈は、パラメーターと戻り値に関する_Out_
不変性を記述します。これは、関数の作成者のドキュメントとサニティ チェックの両方として機能します。 警告 C28196 は、注釈と関数の実際の動作の不一致を示します。 この警告は、特定の入力値に対して関数が予期せず動作する可能性があるケースを検出する場合に役立ちます。 次に、関数の意図された動作を決定し、それに応じて注釈または実装を適応させるのは、作成者次第です。
例
次の関数では、一部のコード パスが null ポインターを返す場合でも注釈が付 _Ret_notnull_
いているため、警告 C28196 が発生します。
#include <sal.h>
_Ret_notnull_
Item *get_item(_In_reads_(len) Item *items, size_t len, size_t index) {
if (index >= len) {
return nullptr;
}
return items + index;
}
この問題を解決するには、関数の動作を正確に反映するように注釈を調整します。
#include <sal.h>
_When_(index < len, _Ret_notnull_)
Item *get_item(_In_reads_(len) Item *items, size_t len, size_t index) {
if (index >= len) {
return nullptr;
}
return items + index;
}