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