1.问题描述
如下代码中,两次调用vsnprintf在mac下及linux下均会段错误崩溃
#include <stdio.h>
#include <cstdarg>
void func(const char* fmt,...)
{
va_list valist;
va_start(valist,fmt);
char buff[512]={0};
vsnprintf(buff,511,fmt,valist);
printf("buf:%s",buff);
vsnprintf(buff,511,fmt,valist);
printf("buf:%s",buff);
va_end(valist);
}
int main()
{
func("start :%s %d\n","aaa ",32);
return 0;
}
2.问题分析
经调试发现在执行一次vsnprintf之后,valist中的gp_offset发生变化,导致再次调用时发生段错误
3.解决方法
在执行以前使用va_copy将valist复制一份即可。
3.解决方法
在执行以前使用va_copy将valist复制一份即可。