Necesitas usar size en lugar de fmt :
va_start(args, size);
 Es size , no fmt , ese es el último parámetro que tiene un nombre explícito (a diferencia de los parámetros vararg, que no tienen nombres). Debe pasar el último parámetro nombrado a va_start para que pueda averiguar la dirección en la memoria en la que comienzan los parámetros vararg.
second parameter of ‘va_start’ not last named argument¿Qué significa y cómo eliminarlo?
 Su función tiene parámetros con nombre parent , fmt y size . La especificación C dice que siempre debe pasar el último parámetro nombrado a va_start , para compatibilidad con compiladores más antiguos. Entonces debes pasar size , no fmt .
(Pero con un compilador moderno, podría funcionar de todos modos)
Creo que aquí hay una confusión:la mayoría de las personas solo se ocupan de funciones similares a las de impresión que tienen formato y varargs. y creen que tienen que pasar el nombre del parámetro que describe el formato. sin embargo, va_start no tiene nada que ver con ningún tipo de formato similar a printf. esta es solo una función que calcula el desplazamiento en la pila donde comienzan los parámetros sin nombre.