Date: Tue, 10 Feb 2004 15:37:00 -0500 From: Jeremy Faulkner <gldisater@gldis.ca> To: Bill Moran <wmoran@potentialtech.com> Cc: freebsd-chat@freebsd.org Subject: Re: Could use some help with variable length argument lists Message-ID: <402940EC.2030403@gldis.ca> In-Reply-To: <40293B38.30401@potentialtech.com> References: <40293B38.30401@potentialtech.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Bill Moran wrote:
> I'm so frustrated I could cry.
>
> I want my application to be able to do all kinds of logging, so I wrote
> a log
> function:
>
> void
> _log(int level, const char *message, ...)
> {
> va_list ap;
> char **format, **errmsg;
>
> va_start(ap, message);
> if (level <= LOGLEVEL) {
> asprintf(format, "PID %d: %s", getpid(), message);
> vasprintf(errmsg, *format, ap);
> free(*format);
> syslog(LOG_INFO | LOG_LOCAL1, *errmsg);
> if (LOGLEVEL == 10)
> printf(*errmsg);
> free(*errmsg);
> }
> va_end(ap);
> }
>
> Doesn't seem too difficult, right? However, if I call the function
> from elsewhere in my application like this:
>
> _log(1, "Log test");
>
> I get a coredump! gdb complains that message is "out of bounds"
> on the line "asprintf(format, "PID %d: %s", getpid(), message);"
>
> I'm at the end of my rope with this. I really need a way to easily
> log with variable arguments or I'll never get some other issues with
> this application debugged! If I tweak the _log function to this:
>
> void
> _log(int level, char *message)
> {
> if (level <= LOGLEVEL) {
> syslog(LOG_INFO | LOG_LOCAL1, "PID %d: %s", getpid(), message);
> if (LOGLEVEL == 10)
> printf("PID %d: %s", getpid(), message);
> }
> }
>
> everything works just dandy (I haven't changed any other code anywhere
> else! I'm not _using_ variable arguments to _log() yet)
>
> What is is between these two functions that causes the first one to
> coredump, yet the second one works fine? I can only guess that my
> usage of va_* isn't quite right, but how is that affecting the message
> pointer?
>
va_start says that the last required variable is "message".
You can't use ap because it's not in the list of variables when you
called the function.
_log(1, "Log test");
^ There's nothing there to be "ap"
So it "Segmentation fault (core dumped)"'s
_log(1, "Log test", NULL);
--
Jeremy Faulkner http://www.gldis.ca
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?402940EC.2030403>
