Skip site navigation (1) Skip section navigation (2)

Re: [HACKERS] snprintf causes regression tests to fail

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Nicolai Tufar <ntufar(at)gmail(dot)com>
Cc: Joerg Hessdoerfer <Joerg(dot)Hessdoerfer(at)sea-gmbh(dot)com>,Magnus Hagander <mha(at)sollentuna(dot)net>,Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>,pgsql-hackers-win32(at)postgresql(dot)org
Subject: Re: [HACKERS] snprintf causes regression tests to fail
Date: 2005-03-01 23:15:49
Message-ID: 2380.1109718949@sss.pgh.pa.us (view raw or flat)
Thread:
Lists: pgsql-hackerspgsql-hackers-win32
Nicolai Tufar <ntufar(at)gmail(dot)com> writes:
>> Having looked at the current snprintf.c, I don't actually believe that
>> it works at all in the presence of positional parameter specs.

> It picks up arguments in order of appearance, places them in
> array then shuffles them according to %n$ positional parameter.
> I checked it with in many different combinations, it works!

Did you try combinations of parameters of different sizes?  For instance

	snprintf(..., "%g %d", doubleval, intval);
and
	snprintf(..., "%2$d %1$g", doubleval, intval);

You cannot pick this up in order of appearance and expect it to work.
It might fail to fail on some machine architectures, but it's not going
to be portable.

>> On the other side of the
>> coin, the hardwired 4K limit in printf() is certainly *not* enough.

> How would one solve this issue. Calling malloc() from a print function
> would be rather expensive.

printf shouldn't use a buffer at all.  I was thinking in terms of
passing around a state struct like

	typedef struct {
		char	*output;
		char	*end;
		FILE	*outfile;
	} printf_target;

and making dopr_outch look like

static void
dopr_outch(int c, printf_target *state)
{
	if (state->output)
	{
		if (state->end == NULL || state->output < state->end)
			*(state->output++) = c;
	}
	else
		fputc(c, state->outfile);
}

			regards, tom lane

In response to

Responses

pgsql-hackers by date

Next:From: Gavin SherryDate: 2005-03-01 23:16:04
Subject: Re: logging as inserts
Previous:From: Nicolai TufarDate: 2005-03-01 23:09:41
Subject: Re: [pgsql-hackers-win32] snprintf causes regression tests to fail

pgsql-hackers-win32 by date

Next:From: Nicolai TufarDate: 2005-03-01 23:37:56
Subject: Re: [HACKERS] snprintf causes regression tests to fail
Previous:From: Nicolai TufarDate: 2005-03-01 23:09:41
Subject: Re: [pgsql-hackers-win32] snprintf causes regression tests to fail

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group