Um exemplo de comentário útil

Um exemplo de comentário útil







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:







  1. Por que algo está sendo gravado em um buffer cujo conteúdo acaba de ser gerado usando uma função semelhante a printf?
  2. 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.








All Articles