Por que strcat_s falha quando se escreve sobre o limite de uma matriz de caracteres?

Eu sei, já existem muitos posts sobre esse tópico, mas não encontrei nada satisfatório. Até o google não era meu amigo.

Então, primeiro o meu 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;
    }

Eu brinquei com esse código no Windows com o MS VS 2010 e experimentei o seguinte:

oprimeiro A chamada de strcat_s funciona bem, o que é claro para mim porque o tamanho da nova string ("01" + "2" + NUL caractere) é menor que o tamanho do buffer.

Mas por que osegundo falha de chamada, quando o tamanho do buffer é excedido? Tanto quanto eu entendo o MSDN, devo receber um código de erro de volta e o buffer deve ter apenas o caractere NUL. O comportamento no exemplo é mais parecido com o do strcat: sobrescrito meu próprio código, para que ele trava.

BTW: Eu sei, que existem outras maneiras de concatenar strings e que é um estilo melhor fazer verificações antes disso. Portanto, é mais do que um puro interesse olhar nos bastidores.

Obrigado Robert

questionAnswers(1)

yourAnswerToTheQuestion