1

我正在调用 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);
}
4

1 回答 1

1

有几种解决方案,但没有一个是完全微不足道的。不幸的是,您发现某些系统在处理“%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在代码中调用了无数次,则搜索“%s”并在该点检查该值是否为 NULL 并替换它可能会更简单。这变得非常混乱,因为您几乎必须为 printf 格式实现完整的“%[flags][width][type]”解析器,并遍历参数。但是这里还有一个问题:你不能修改va_list(它可以工作,但它是未定义的行为),所以你最终可能会编写自己的vsnprintf函数。

所以,我会尝试在源头上修复它,然后再去实现自己的功能。

于 2013-05-06T09:33:42.707 回答