Удалите недостатки безопасности в моем коде с помощью шины - PullRequest
0 голосов
/ 30 октября 2018

Кто-нибудь может мне помочь исправить этот код? Я не очень понимаю, так как я новичок в C. Я использую Splint, чтобы найти недостатки в коде.

char *stringcopy(char *str1, char *str2)
{
    while (*str2)
        *str1++ = *str2++;

    return str2;
}

main(int argc, char **argv)
{

    char *buffer = (char *)malloc(16 * sizeof(char));

    stringcopy(buffer, argv[1]);

    printf("%s\n", buffer);
}

Splint output

Ответы [ 2 ]

0 голосов
/ 30 октября 2018
  1. Вам не хватает включений.
  2. Ваш stringcopy() не завершает пункт назначения.
  3. Источником действительно должно быть const char*, чтобы учесть константную корректность и позволить компилятору помогать отлавливать ошибки.
  4. stringcopy() ожидает, что место назначения будет достаточно большим. Имеет ли право 16 байтов на это в main()?
    Рассмотрите возможность размещения и копирования строки в одну функцию, известную как strdup().
  5. По какой-то причине стандартный strcpy() возвращает указатель на пункт назначения. Да, лучше вместо этого вернуть указатель на trminator, но рассмотрите возможность следования существующей практике при именовании функции, чтобы избежать неприятных сюрпризов.
  6. Не разыгрывать результат malloc().
  7. Кроме того, используйте sizeof *pointer вместо sizeof(TYPE), это уменьшает непроверенное повторение и позволяет избежать ошибок.
  8. Не предполагайте успеха. malloc() всегда может потерпеть неудачу.
  9. Как правило, вы должны free(), что вы malloc(). Однако, поскольку программа немедленно завершается, это будет бесполезная работа.
  10. Неявный int устарел в C90 и удален в C99.
  11. Неявное return 0; для main() появилось в C99, ранее это было Неопределенное поведение (UB) . Но вы уже использовали неявный int, который был удален в то время. Что это будет?
  12. Несмотря на то, что это не проверка кода, я настоятельно рекомендую вам потратить немного больше времени на правильное присвоение имен вашим параметрам. Любой, кто читает ваш код по любой причине (в основном это вы сами), будет благодарен. Это не значит, что имена должны быть длиннее.
0 голосов
/ 30 октября 2018

Ваш stringcopy не завершает скопированную строку. Кроме того, нет смысла возвращать end исходной строки. Следующее предложение:

char *stringcopy(char *str1, char *str2)
{
    char *s2= str2;
    while (*s2)
        *str1++ = *s2++;

    *s2= '\0';
    return str2;
}
...