Это не вызывает предупреждения от 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 как устаревшую функциональность.