Является ли va_start (и т. Д.) Реентерабельным?

При редактировании класса с долгой историей меня загнала в тупик особая привычка архитектора заключать свою последовательность va_start -> va_end в мьютекс. Журнал изменений для этого в добавлении (которое было сделано около 15 лет назад и с тех пор не пересматривалось) отмечалось, что это произошло из-за того, что va_start и др. не было повторно входимым.

Я не знал ни о каких подобных проблемах с va_start, поскольку я всегда думал, что это просто макрос для некоторой математики указателя стека. Есть здесь что-то, о чем я не знаю? Я не хочу изменять этот код, если возникнут побочные эффекты.

В частности, рассматриваемая функция выглядит примерно так:

void write(const char *format, ...)
{
    mutex.Lock();
    va_list args;
    va_start(args, format);
    _write(format, args);
    va_end(args);
    mutex.Unlock();
}

Она вызывается из нескольких потоков.

5
задан Nate 5 October 2010 в 16:46
поделиться