gpt4 book ai didi

c - sal 注释(prefast)强制执行可变参数的数量

转载 作者:行者123 更新时间:2023-12-01 13:52:21 27 4
gpt4 key购买 nike

我有一个可变函数:

print_n_integers(7, 1, 2, 3, 4, 5, 6, 7);

int print_n_integers( unsigned int count, ... )
{
// use va_start etc.
}

我想使用 sal.h 中的微软 SAL 注释,以便 Visual Studio 编译器在参数数量与 count 不匹配时发出通知。我可以通过这种方式将 count 强制执行为文字:

int print_n_integers (
_Literal_ unsigned int count,
...
)

并且 Visual Studio 至少在处理 printf() 方面有一些聪明之处,但是是否有一些简单的参数计数?

最佳答案

我想针对您的问题提出一种不使用静态分析的替代方法。

即使您可以获得用于静态分析的可变参数的计数,您仍然必须为每个调用提供正确的计数。您还必须确保所有参数都是(或可以提升为)整数。

处理同质类型列表的一种更自然、非可变的方法是打印一个数组:

    void print_nint(const int *arr, size_t n);

C99 兼容的编译器可以使用 compound literals 在现场创建数组:

    print_nint((int[]) {0, 8, 15}, 3);

此语法适用于将自身包装在宏中:

    #define print_int(...)                                  \
print_nint((int[]){__VA_ARGS__}, \
sizeof((int[]) {__VA_ARGS__}) / sizeof(int))

这个宏进行计数,你可以在没有显式参数计数的情况下使用它:

    print_int(1, 2, 3.0, rand(), i++, j++);

可变参数的第二次扩展在 sizeof 中使用,但未计算。在上面的行中,rand() 仅被调用一次,ij 仅递增一次。浮点参数在打印前转换为 int

Visual Studio 在 2013 RC 中引入了复合文字,但旧版本不支持它们。不幸的是,复合字面量还会使您的代码无法用于 C++ 编译器。对于这些情况,您可以修改宏以定义一个临时数组:

    #define print_int(...) {                                            \
int PrintMe_[] = {__VA_ARGS__}; \
print_nint(PrintMe_, sizeof(PrintMe_) / sizeof(*PrintMe_)); \
}

但是,只有在 void 上下文中调用该函数时,此策略才有效。

如果只使用宏,数组和它的大小是一致的。但是您可以发布底层实现并使用 SAL 对其进行注释:

    void print_nint(_In_reads_(n) const int *arr, size_t n);

我不提倡无缘无故地使用宏,但在这种情况下,宏起到了模板的作用;它可以减少危险的冗余。

关于c - sal 注释(prefast)强制执行可变参数的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30771295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com