News for hackers. Stuff that matters.
Re:Tearing apart printf() (2018) by emmelaich on Tuesday November 12, 2019 @06:00PM (#21519185)
Excellent stuff. My couple of notes..

1. printf may malloc so don't use it in an out of memory situation. Though I think this problem is vanishingly unlikely these days.

2. printf of floats used to require linking to the math library on some platforms (-lm)

3. I am pathetically grateful for nice diagnostics you get when you use the wrong % formatter in more recent C compilers. This used to be a rich source of errors and non-portability.

Re:Tearing apart printf() (2018) by brandmeyer on Tuesday November 12, 2019 @06:39PM (#21519472)
You can also use __attribute__((format(printf, ...))) for functions of yours that ultimately pass their varargs to a member of the printf family.

It is exceedingly rare for malloc() to give you a recovery chance on failure. Folks are so used to the Linux model of overcommit+OOM killer that almost nobody's code can gracefully deal with memory exhaustion.

Re:Tearing apart printf() (2018) by saagarjha on Tuesday November 12, 2019 @06:44PM (#21519499)
> printf may malloc so don't use it in an out of memory situation. Though I think this problem is vanishingly unlikely these days.

Alternatively: don’t call printf from your interposed malloc, bad things will happen ;)

Re:Tearing apart printf() (2018) by eqvinox on Wednesday November 13, 2019 @06:54AM (#21523090)
> 1. printf may malloc so don't use it in an out of memory situation. Though I think this problem is vanishingly unlikely these days.

I'd like to point out that FreeBSD's printf only does this if:

1. you use a lot of arguments (i.e. a compile-time decision, and quite rare)

2. use wchar_t support (also a compile-time decision and quite rare)

3. the output is to something that buffers/mallocs (i.e. stdio)

4. locale support does it for some reason (I simply haven't checked this)

Which makes it great to use in e.g. crash handlers. It's actually Async-Signal-Safe if you cut out the stdio bits. And it's available under BSD license... and actually a nice read (more on that in a separate post.)

Re:Tearing apart printf() (2018) by s_m_t on Tuesday November 12, 2019 @06:31PM (#21519419)
>1. printf may malloc so don't use it in an out of memory situation. Though I think this problem is vanishingly unlikely these days.

I feel like you've just saved my future self from a terrible bug in the future. Thanks

Re:Tearing apart printf() (2018) by kstenerud on Wednesday November 13, 2019 @01:44AM (#21521671)
Also, don't use printf in a signal handler for the same reason. Any attempt to malloc or free within a signal handler context runs the risk of a deadlock.
Re:Tearing apart printf() (2018) by lelf on Tuesday November 12, 2019 @07:23PM (#21519797)
4. On GNU/Linux you can add your own %-conversions (e. g. %Y) with register_printf_function.
Re:Tearing apart printf() (2018) by saagarjha on Tuesday November 12, 2019 @07:40PM (#21519944)
register_printf_function is deprecated; you should use register_printf_specifier instead.
Re:Tearing apart printf() (2018) by eqvinox on Wednesday November 13, 2019 @06:56AM (#21523103)
I strongly advise against using either since both are not only non-portable, but also break any compiler support for getting you warnings when you're using it wrong.

The Linux kernel style suffix extensions (cf. https://www.kernel.org/doc/Documentation/printk-formats.txt) are much better on the latter front.

Re:Tearing apart printf() (2018) by luke0016 on Tuesday November 12, 2019 @07:42PM (#21519955)
> 1. printf may malloc so don't use it in an out of memory situation. Though I think this problem is vanishingly unlikely these days.

You can avoid this by doing something like:

  setvbuf(stdout, NULL, _IONBF, 0);
Re:Tearing apart printf() (2018) by saagarjha on Tuesday November 12, 2019 @08:40PM (#21520357)
You sure about that? This seems to suggest otherwise: https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-commo...
Re:Tearing apart printf() (2018) by crististm on Wednesday November 13, 2019 @08:30AM (#21523723)