GCC: указанная граница зависит от длины исходного аргумента - PullRequest
1 голос
/ 27 июня 2019

Следующий код:

while (node)
{
    if (node->previous== NULL) break;
    struct Node* prevNode = node->previous;
    len = strlen(prevNode->entity);
    //pp is a char* fyi
    pp-=len;
    strncpy(pp, prevNode->entity, len+1);
    *(--pp) = '/';
    node = prevNode;
}

Создает следующее предупреждение / ошибку в GCC (я рассматриваю все предупреждения как ошибки):

../someFile.C:1116:24: error: 'char* strncpy(char*, const char*, size_t)' specified bound depends on the length of the source argument [-Werror=stringop-overflow=]
 1116 |                 strncpy(pp, prevNode->entity, len+1);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../someFile.C:1114:29: note: length computed here
 1114 |                 len = strlen(prevNode->entity);
      |                       ~~~~~~^~~~~~~~~~~~~~~~~~~~

Почему GCC дает мне предупреждение?Что плохого в том, чтобы полагаться на размер исходного аргумента для размера буфера?Может кто-нибудь привести пример того, какие проблемы это может вызвать?Код делает то, что должен, мне просто любопытно, почему я получаю предупреждение.

1 Ответ

1 голос
/ 27 июня 2019

Дело в том, что ограничение длины, переданное strncpy, должно зависеть от размера целевого аргумента, а не исходного аргумента. Иначе зачем это вообще? Компилятор правильно распознает, что здесь нет смысла использовать strncpy, и выдает информативное сообщение об ошибке на этот счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...