警告 C28213

注釈は _Use_decl_annotations_ 、前の宣言を変更せずに参照するために使用する必要があります。

解説

_Use_decl_annotations_ は、関数の以前の宣言からの注釈を使用するようにコンパイラに指示します。 以前の宣言が見つからない場合、または現在の宣言が注釈に変更を加える場合は、この警告が出力されます。 _Use_decl_annotations_ また、定義から他のすべての注釈を削除し、関数の分析に宣言注釈を使用することもできます。

この診断は、多くの場合、関数の注釈を調整することによって、リファクタリングや他の警告の修正の副作用です。 この問題を解決するには、他の場所で同じ注釈を使用します。 正しい注釈セットを特定するには、関数定義の動作を確認します。 ほとんどの場合、この動作は意図的であり、関数への注釈はそれを反映する必要があります。 SAL 注釈の詳細については、「SAL 注釈を使用してコードの欠陥を減らす」を参照してください

注釈は、宣言と関数の定義の間で一致することが重要です。 分析ツールは、関数の呼び出しサイトを分析するときに、宣言注釈を使用します。 宣言と定義が一致しない場合、静的分析ツールによって正しくない結果が生成される可能性があります。 この警告を修正すると、ツールによってソースが更新された情報で再分析されるため、変更が連鎖効果を与えるのが一般的です。

アナライザーが翻訳単位で以前の宣言を見つけられなかったためにこの診断が発生した場合、最も可能性の高い原因はディレクティブが見つからない #include ためです。 ヘッダー ファイルを意図的に含めない場合にこの問題を解決するには、宣言と定義の注釈が一致することを確認し、注釈を _Use_decl_annotations_ 削除します。 ヘッダー ファイルを含めない場合は、2 つの注釈セットが将来同期から外れる可能性があるため、注意してください。

コード分析名: BAD_USEHEADER

次のコードでは C28160 が生成されます。 パラメーター注釈が buffer 2 つのファイル間で一致しません。

example.h から:

void addNullTerminate(_Out_writes_(n) char* buffer, int n);

example.cpp から:

_Use_decl_annotations_
void addNullTerminate(_Out_writes_z_(n) char* buffer, int n)
{
    buffer[n] = '\0';
}

関数定義を調べて、正しい注釈を決定します。 この場合は正 _Out_writes_z_(n) しいように見えるので、その注釈をヘッダー ファイルの関数宣言に移動します。 宣言と定義の注釈が一致するため、この変更により問題が解決されます。

example.h から:

void addNullTerminate(_Out_writes_z_(n) char* buffer, int n);

これで、定義のバッファー注釈を削除して、将来のメインテナントを簡略化できるようになりました (ただし、この手順は省略可能です)。

example.cpp から:

_Use_decl_annotations_
void addNullTerminate(char* buffer, int n)
{
    buffer[n] = '\0';
}

実際のコードでは、通常、どの注釈が正しいかは明確ではありません。 詳細とガイダンスについては、SAL 注釈を使用してコードの欠陥を減らす方法を参照してください

関連項目

C++ コードの規則セット
SAL 注釈を使ってコード障害を減らす方法
C28252
C28253
C28301