error: Print 32- and 64-bit integers portably (Bug#8435).
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 7 Apr 2011 03:34:05 +0000 (20:34 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 7 Apr 2011 03:34:05 +0000 (20:34 -0700)
commit5fdb398c4b75b0c834aff7132f90b0ce5317a25a
tree29ebb8fc5700fefdd867fa497eac27fb7d0bcfe0
parentb189fa667ed7ac7b17f9665cd8a0c26316b3c521
error: Print 32- and 64-bit integers portably (Bug#8435).

Without this change, on typical 64-bit hosts error ("...%d...", N)
was used to print both 32- and 64-bit integers N, which relied on
undefined behavior.
* lisp.h, src/m/amdx86-64.h, src/m/ia64.h, src/m/ibms390x.h (pEd):
New macro.
* lisp.h (error, verror): Mark as printf-like functions.
* eval.c (verror): Use vsnprintf, not doprnt, to do the real work.
Report overflow in size calculations when allocating printf buffer.
Do not truncate output string at its first null byte.
* xdisp.c (vmessage): Use vsnprintf, not doprnt, to do the real work.
Truncate the output at a character boundary, since vsnprintf does not
do that.
* charset.c (check_iso_charset_parameter): Convert internal
character to string before calling 'error', since %c now has the
printf meaning.
* coding.c (Fdecode_sjis_char, Fdecode_big5_char): Avoid int
overflow when computing char to be passed to 'error'.  Do not
pass Lisp_Object to 'error'; pass the integer instead.
* nsfns.m (Fns_do_applescript): Use int, not long, since it's
formatted with plain %d.
17 files changed:
src/ChangeLog
src/category.c
src/charset.c
src/coding.c
src/doc.c
src/eval.c
src/fns.c
src/intervals.c
src/lisp.h
src/m/amdx86-64.h
src/m/ia64.h
src/m/ibms390x.h
src/nsfns.m
src/sysdep.c
src/window.c
src/xdisp.c
src/xfns.c