подскажите когда произойдет следующее предупреждение во время компиляции - PullRequest
0 голосов
/ 08 марта 2011

temp .... неправильно используется в вызове sprintf или snprintf.

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

1 Ответ

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

Это не вызывает предупреждения от gcc, даже с -Wall -Wextra -pedantic:

#include "stdio.h"

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

Однако, причина, почему это считается плохой идеей, может быть замечена из вывода.Вместо получения:

xyzzy plugh hello

, как может ожидать нормальный человек, вы на самом деле получаете:

xyzzy plugh xyzzy plugh

, но, как и при любом неопределенном поведении, ваш пробег может отличаться.

Окончательной ссылкой является стандарт C99, раздел 7.19.6.6 The sprintf function, в котором говорится:

Функция sprintf эквивалентна fprintf, за исключением того, что выходные данные записываются в массив (определенный аргументом s), а не в поток.Нулевой символ написан в конце написанных символов;оно не считается частью возвращаемого значения.Если копирование происходит между объектами, которые перекрываются, поведение не определено.

Стандарт C ++ (ну, на самом деле черновик C ++ 0x , , но он наверняка наступит в любой деньНадеюсь - давай, ребята, достаньте это out там) ссылается на это, поскольку он включает части стандарта C как устаревшую функциональность.

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