我正在调用vsnprintf,如下所示:如果Vargs为NULL,则strlen函数中的vsnprintf coredump,但相同的内核在其他操作系统(如linux,AIX ...)中也可以正常工作。

有什么解决办法吗?我无法避免将NULL传递给varags,我希望vsnprintf一定不要coredump ...

码:

int example(char * buff,size_t count,const char format[],...)
{
va_list vargs = NULL;
va_start(vargs,format);
ret = vsnprintf(buff,count,format,vargs);
va_end(vargs);
return ret;
}

main()
{
char buff[100] = {0};
char *FileName = NULL;
ret = example(buff,100,"File Name is %s",FileName);
}

最佳答案

有几种解决方案,但都不是完全无关紧要的。不幸的是,您发现的是,某些系统在处理“%s”时对NULL指针具有“捕获”,从而解决了您所看到的问题。 C标准不要求这样做。

最简单(就实现的复杂性而言)是在将字符串传递给example(例如:

char *FileName = NULL;
if (!FileName) FileName = "(null)");
ret = example(buff,100,"File Name is %s",FileName);

要么
char *FileName = NULL;
ret = example(buff,100,"File Name is %s",FileName?FileName:"(null)");

但是,如果在代码中将example称为gazillion次,则搜索“%s”并检查该点是否为NULL并将其替换可能更简单。这变得非常混乱,因为您几乎必须为printf格式实现完整的“%[flags] [width] [type]”解析器,并遍历参数。但是这里还有一个问题:您不能修改va_list(它可以工作,但是它是 undefined 的行为),因此您可能最终将编写自己的vsnprintf函数。

因此,在尝试实现自己的功能之前,我将尝试从源头上修复它。

09-26 10:15