
Bons livros de programação dizem que o código deve ser autodocumentado. E comentários são necessários onde algo não trivial está sendo feito. Nossa equipe compartilha dessa opinião e, recentemente, encontramos um trecho de código que demonstra isso perfeitamente.
O código que veremos a seguir foi escrito no decorrer do trabalho no artigo " Tratamento de datas atrai erros ou 77 defeitos no Qt 6 ".
O analisador PVS-Studio chamou a atenção para este fragmento de código, emitindo um aviso: V575 [CWE-628] A função 'memcpy' não copia a string inteira. Use a função 'strcpy / strcpy_s' para preservar o nulo do terminal. qplaintestlogger.cpp 253. Na verdade, aqui está:
const char *msgFiller = msg[0] ? " " : "";
QTestCharBuffer testIdentifier;
QTestPrivate::generateTestIdentifier(&testIdentifier);
QTest::qt_asprintf(&messagePrefix, "%s: %s%s%s%s\n",
type, testIdentifier.data(), msgFiller, msg,
failureLocation.data());
// In colored mode, printf above stripped our nonprintable control characters.
// Put them back.
memcpy(messagePrefix.data(), type, strlen(type));
outputMessage(messagePrefix.data());
Observe a chamada para a função memcpy . Por si só, esse código levanta duas questões ao mesmo tempo:
- Por que algo está sendo gravado em um buffer cujo conteúdo acaba de ser gerado usando uma função semelhante a printf?
- Certamente não é um erro que o terminal zero não seja copiado? Isso é exatamente o que o analisador não gosta.
, . .
. , . .
:
char buf[1024];
if (result.setByMacro) {
qsnprintf(buf, sizeof(buf), "%s%s%s%s%s%s\n", buf1, bufTag, fill,
buf2, buf2_, buf3);
} else {
qsnprintf(buf, sizeof(buf), "%s%s%s%s\n", buf1, bufTag, fill, buf2);
}
memcpy(buf, bmtag, strlen(bmtag));
outputMessage(buf);
. . , . , memcpy. , , buf1, bmtag. , . .
, : Andrey Karpov. One Useful Comment.