Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SBRM/RAII for std::va_list/va_start()/va_end use

My code contains snippets like these:

    std::va_list ap;
    va_start(ap, msgfmt);
    snprintf_buf buf;
    const tchar * msg = buf.print_va_list(msgfmt, ap);
    va_end(ap);

These are short and va_start() and va_end() are close together so they are not much of a problem. Exceptions from calls in between the two could be a problem (or not?).

Simple test shows that calling va_start() from a function without ellipsis is not allowed. Is calling va_end() from a different function than va_start() was called from allowed or not?

Basically, I am curious if it is possible to use the SBRM/RAII idiom for these calls, even if it were necessary to call va_start() manually and then to pass instance of std::va_list into my RAII/SBRM guard instance?

like image 822
wilx Avatar asked Aug 27 '12 12:08

wilx


1 Answers

Unfortunately, no. The specification of va_start and va_end requires that:

Each invocation of the va_start and va_copy macros shall be matched by a corresponding invocation of the va_end macro in the same function.

Therefore, va_end must be in the variadic function itself, not a class destructor.

like image 121
Mike Seymour Avatar answered Oct 05 '22 05:10

Mike Seymour