C++ en MS Visual Studio 2008. Nivel de advertencia 4 más una carga de advertencias adicionales habilitadas también. Esperaría que esto diera una advertencia al menos, pero más probablemente un error del compilador?¿Por qué/cómo se compila?
declaración de la función es la siguiente:
int printfLikeFunction(
const int bufferLength,
char * const buffer,
const char * const format,
...);
el uso de código - no es un error tipográfico: aunque el ARRAY_SIZE de OutputBuffer se pasa, en sí OutputBuffer no es - sin duda esto no debería compilar:
printfLikeFunction(ARRAY_SIZE(outputBuffer), "Format: %s, %s", arg1, arg2);
Claramente esto está mal y se ha cometido un error. Sin embargo, el compilador debería haberlo atrapado. El parámetro del búfer debe ser un char-pointer, y se le está pasando un literal de cadena que es un const char-pointer. Esto debe ser un error. (arg1 y arg2 son (posiblemente const) char punteros también, por lo que casualmente la declaración coincide incluso sin que outputBuffer esté en el lugar correcto).
En tiempo de ejecución, este código se bloquea cuando intenta escribir en el literal de cadena. No me sorprende, simplemente no entiendo cómo se permitió compilar.
(Aunque, dicho sea de paso, esto es probablemente por lo que sprintf_s tiene los parámetros de búfer y tamaño en un orden diferente a esta función - hace que tales errores fallen de manera inequívoca).
Wow. ¡Qué decisión más loca! Pero, sí, acabo de consultar el estándar y tienes toda la razón. ¡Increíble! –
Es de esperar que Visual Studio emita una advertencia al usar funciones obsoletas y descabelladas del estándar. –
Sí ... incluso si la "locura" es subjetiva, no lo es, así que me sorprende que esto no haya producido una advertencia. –