почему следующая программа выдает ошибку при проверке с помощью анализатора cppcheck - PullRequest
0 голосов
/ 08 марта 2011
#include "stdio.h"

int main (void) {
    char xx[1000] = "hello";
    sprintf (xx, "xyzzy plugh %s", xx);
    printf ("%s\n", xx);
    return 0;
}

::: :( error) Неопределенное поведение: xx неправильно используется при вызове sprintf или snprintf. Цитата: Если копирование происходит между объектами, которые перекрываются в результате вызова sprintf () или snprintf (), результаты не определены.

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Вы записываете в массив символов xx, а также используете его в качестве источника для копии. Это поведение не определено. Вот существующий вопрос о ситуации:

Безопасен ли sprintf (буфер, "% s […]", буфер, [...])?

1 голос
/ 08 марта 2011

Именно то, что он говорит. Вы передаете один и тот же массив как входные и выходные данные в sprintf (), что не поддерживается, поскольку нет гарантии, что sprintf запишет выходную строку в порядке возрастания.

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