5

两个问题:

1.

在“ntdef.h”中,NTSTATUS定义如下:

typedef __success(return >= 0) LONG NTSTATUS;

“__success(return >= 0)”到底是什么?

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 是否成功
* 不是。如果在退出时为真,则所有函数的保证(如给定
* 由其他注释)必须持有。如果退出时为假,则调用者
* 不应该期望任何函数的保证能够成立。如果不使用,
* 函数必须始终满足其保证。自动添加到
* 以标准方式指示成功的函数,例如通过返回一个
* 结果。

NT_SUCCESS没有进行严格测试的原因STATUS_SUCCESS (0)可能是其他代码STATUS_PENDING实际上并不是失败。

于 2010-07-31T15:11:49.547 回答
3

该片段__success(return >= 0)是一个 SAL 注释,它为 PreFast 工具提供了关于宏的预期语义是什么的线索。这用于进行静态分析并识别潜在的错误。

NT_SUCCESS宏进行测试,因为除了.>= 0之外还有其他成功代码STATUS_SUCCESS。一些成功代码包含有关操作结果的额外信息,虽然目前我只能想到S_FALSE,它通知调用者操作成功,但结果是错误的。通常,成功代码等于或大于零,失败代码小于零。

[严格来说,S_FALSE是 an HRESULT,而不是 an NT_STATUS,尽管这两种类型具有相同的大小和相似的约定。]

于 2010-07-31T15:12:43.243 回答
2

__success 在 Michael Fourre 的Annotating for __success()文章(存档链接)中有很好的描述。

对 2 的回答是否定的,所有正码都是非失败的。不过,它们可能意味着其他的东西。

于 2010-07-31T15:10:34.623 回答