¿Por qué se bloquea strcat_s si se escribe sobre el límite de una matriz de caracteres?

Lo sé, ya hay muchas publicaciones sobre este tema, pero no encontré nada satisfactorio. Incluso google no era mi amigo.

Entonces, primero mi código:

    void secureCat() {
        const int BUFFERSIZE = 5;
        char buffer[BUFFERSIZE];

        strcpy_s (buffer, BUFFERSIZE, "01");
        cout << "1, buffer=" << buffer << endl;

        errno_t rc = 0;

        // still works
        rc = strcat_s(buffer, BUFFERSIZE, "2"); 

        cout << (rc == 0 ? "yippee" : "oh noooo") << endl;
        cout << "2, buffer=" << buffer << endl;

        // and now the crashing line
        rc = strcat_s(buffer, BUFFERSIZE, "345"); 

        cout << (rc == 0 ? "yippee" : "oh noooo") << endl;
        cout << "3, buffer=" << buffer << endl;
    }

Jugué con este código en Windows con MS VS 2010 y experimenté lo siguiente:

losprimero call of strcat_s funciona bien, lo cual está claro para mí porque el tamaño de la nueva cadena ("01" + "2" + NUL carácter) es más pequeño que el tamaño del búfer.

¿Pero por qué elsegundo bloqueo de llamada, cuando se supera el tamaño del búfer? Hasta donde entiendo el MSDN, debería recuperar un código de error y el búfer solo debería tener el carácter NUL. El comportamiento en el ejemplo es más parecido al de strcat: sobrescribo mi propio código, por lo que se bloquea.

Por cierto: sé que hay otras formas de concatenar cadenas y que es un mejor estilo hacer comprobaciones antes. Así que esto es más por puro interés para mirar detrás de escena.

Gracias Robert

Respuestas a la pregunta(1)

Su respuesta a la pregunta