vsnprintf为x86_64提供分段错误,但不为64位机器提供分段错误

时间:2014-04-23 18:03:26

标签: c printf archlinux

我在机器中使用vsnprintf并且它没有给出错误但是当我运行精确的代码时它会给我错误。

我在机器上遇到错误的机器

Linux localhost 3.14.1-1-ARCH #1 SMP PREEMPT Mon Apr 14 20:40:47 CEST 2014 x86_64 GNU/Linux

机器我没有收到任何关于此的错误。

Linux arunkumar.gupta 3.8.0-27-generic #40-Ubuntu SMP Tue Jul 9 00:19:35 UTC 2013 i686 i686 i686 GNU/Linux

代码

void
_log_message(int level, char *fmt, ...)
{
  int n;
  char *msg;
  va_list args;
  char time_string[TIME_LENGTH];
  char str[STRING_LENGTH];
  assert(level <= log_level);
  va_start(args, fmt);
  fill_time_string(time_string, TIME_LENGTH);
  n = snprintf(str, STRING_LENGTH, "%-9s %s [%s:%lu]: ", log_string[level], time_string, log_ident, (long int) getpid());
  msg = str + n;
  n  += vsnprintf(msg, STRING_LENGTH-n, fmt, args);
  if(n >= STRING_LENGTH) {
strcpy(str+STRING_LENGTH-6, " ...\n");
n = STRING_LENGTH-1;
  }


va_end(args);
}

Backtrace输出

 ./a.out(handler+0x25)[0x401152]
 /usr/lib/libc.so.6(+0x35400)[0x7fb0e2358400]
 /usr/lib/libc.so.6(_IO_vfprintf+0x1cf0)[0x7fb0e236b1f0]
 /usr/lib/libc.so.6(vsnprintf+0x79)[0x7fb0e2395459]
 ./a.out(_log_message+0x1b7)[0x40169c]
 ./a.out(csc_open+0x71)[0x401894]
 ./a.out(open_log_file+0x43)[0x4018e3]
 ./a.out(main+0x5a)[0x4019c2]
 /usr/lib/libc.so.6(__libc_start_main+0xf5)[0x7fb0e2344b05]
./a.out[0x401069]

请帮助我,它给我的Arch Linux机器(这是32位机器)而不是Ubuntu 13.04(64位机器)上的错误。 如果可能,建议我任何替代方案?

1 个答案:

答案 0 :(得分:2)

我遇到了这个老问题,因为类似的事情发生在我身上。经过一番摸索后,我发现原因是我的格式化方法的某些调用具有如下内容:

int64_t num;
foo("%d", num);

在这种情况下,foo是将"%d"num作为vsnprintffmt传递到args的函数。在64位体系结构中,这可以很好地工作,但是对于32位体系结构,这给了我SIGSEGV。

解决方法是将%d更改为%lld,或者按照How to print a int64_t type in C的建议将其更改为:

"%" PRId64

相关问题