在Windows API buffer annotation中,(return +1)是什么意思?

yyyllmsg  于 2023-08-07  发布在  Windows
关注(0)|答案(3)|浏览(108)

return + 1是什么意思here

DWORD
WINAPI
GetModuleFileName(
    __in_opt HMODULE hModule,
    __out_ecount_part(nSize, return + 1) LPTSTR lpFilename,
    __in DWORD nSize
    );

字符串

m1m5dgzv

m1m5dgzv1#

它的意思是“比调用返回的值多一个”。__out_ecount_part注解希望它的 length 表达式包含NUL终止符,而GetModuleFileName返回值不包含终止符,因此+1来解决差异。
如果函数成功,则返回值是复制到缓冲区的字符串的长度,以字符为单位,不包括终止空字符。

ltskdhd1

ltskdhd12#

在“C”中,所有字符串都以“\0”结尾。所以+1允许在文件名的末尾添加额外的'\0'

roqulrg3

roqulrg33#

SAL注解通常被构建为基元的组合。__out_ecount_part具体地表示函数通过(_out)写入输出的参数。索引索引到元素中,而不是字节(_ecount),并且该函数只写入部分缓冲区(_part)。
注解中的最后两个参数表示缓冲区的总大小和初始化长度(返回时)。总大小很简单,因为该值有一个名称(nSize)。然而,初始化的长度是函数的返回值,它没有名称。SAL使用return来引用它。
因此,return + 1声明,在返回时,缓冲区已经从开始填充到(但不包括)超过函数返回值的索引。+ 1表示零终止符,这是C中字符串最常见的编码。
请注意,SAL注解仅由静态代码分析器工具评估。这些对C或C++编译器都没有意义。SAL注解被实现为预处理器宏,并在预处理期间被完全清除。这允许使用其他保留关键字(例如return)。

相关问题