5

2つの質問:

1.1。

「ntdef.h」では、NTSTATUSは次のように定義されています。

typedef __success(return >= 0) LONG NTSTATUS;

「__success(return> = 0)」とは一体何ですか?

2.2。

「ntstatus.h」では、STATUS_SUCCESSが0に定義されています。

#define STATUS_SUCCESS   ((NTSTATUS)0x00000000L) // ntsubauth

ただし、「ntdef.h」のNT_SUCCESSマクロは次のとおりです。

#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)

「ステータス==0」ではないですか?

4

3 に答える 3

10

__successは、SpecStrings_strict.hで定義されている「高度な注釈」であり、次のように定義されています。

* __success(expr)T f():関数fが成功したかどうかを示します
* いいえ。終了時にtrueの場合、すべての関数の保証(指定されたとおり)
*他の注釈による)保持する必要があります。終了時にfalseの場合、発信者
*関数の保証が保持されることを期待するべきではありません。使用しない場合は
*関数は常にその保証を満たさなければなりません。に自動的に追加
*標準的な方法で成功を示す関数。
*HRESULT。

NT_SUCCESS厳密なテストを行わない理由STATUS_SUCCESS (0)は、おそらく、のような他のコードSTATUS_PENDINGが実際には失敗していないためです。

于 2010-07-31T15:11:49.547 に答える
3

フラグメント__success(return >= 0)はSALアノテーションであり、マクロの意図されたセマンティクスが何であるかについてPreFastツールに手がかりを与えます。これは、静的分析を行い、潜在的なバグを特定するために使用されます。

。以外の成功コードがあるため、マクロNT_SUCCESSはテストします。一部の成功コードには、操作の結果に関する追加情報が含まれていますが、現時点では、操作が成功したことを呼び出し元に通知するが、結果はfalseであるとしか考えられません。原則として、成功コードはゼロ以上であり、失敗コードはゼロ未満です。>= 0STATUS_SUCCESSS_FALSE

[厳密に言えば、S_FALSEは、HRESULTではなくNT_STATUS、ですが、2つのタイプのサイズは同じで、規則は似ています。]

于 2010-07-31T15:12:43.243 に答える
2

__successは、Michael Fourreによる__success()の注釈の記事(アーカイブリンク)で詳しく説明されています。

2の答えは「いいえ」です。すべての正のコードは失敗ではありません。しかし、それらはOK以外の何かを意味するかもしれません。

于 2010-07-31T15:10:34.623 に答える