При редактировании класса с долгой историей меня загнала в тупик особая привычка архитектора заключать свою последовательность 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();
}
Она вызывается из нескольких потоков.