您的位置:首页 > 其它

变长参数的三点..., 打印log为什么容易core dump?

2017-11-03 18:30 405 查看
      看变长参数, 很简单:

#include <iostream>
#include <stdarg.h>
using namespace std;

int fun(const char *p, ...)
{
va_list ptr;
va_start(ptr, p);

cout << va_arg(ptr, int) << endl;
cout << va_arg(ptr, char *) << endl;
cout << va_arg(ptr, int) << endl;

va_end(ptr);
return 0;
}

int main()
{
fun("%s%d%s%s%d", 1, "log", 3);
return 0;
}
      结果:

1

log

3

      稍作改动:

#include <iostream>
#include <stdarg.h>
using namespace std;

int fun(const char *p, ...)
{
va_list ptr;
va_start(ptr, p);

cout << va_arg(ptr, int) << endl;
cout << va_arg(ptr, char *) << endl;
cout << va_arg(ptr, char *) << endl; // change here

va_end(ptr);
return 0;
}

int main()
{
fun("%s%d%s%s%d", 1, "log", 3);
return 0;
}
      程序coredump,  很显然, 参数类型不对。

      有兴趣的同学, 看看printf函数的源码, 也用到了变长参数, 所以, 当类型不匹配的时候, 经常会core dump,  呵呵哒。 

      项目实战中, 几乎所有人的人都会遇到打印log而导致的core dump问题, 最典型的就是:

      string str;

      printf("hehe is %s", str);

      core dump,  so fix it.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: