предупреждение: форматировать не строковый литерал и не форматировать аргументы - PullRequest
41 голосов
/ 12 декабря 2010

Я хочу удалить предупреждение, которое я получаю в этой строке кода,

FILE *fil;
char *imp;
(...)
fprintf(fil,imp);

Дело в том, что когда я делаю это, он записывает в файл именно то, что я хочу, но если я применяю формат% s, это не так, как это

fprintf(fil, "%s", imp);

Ответы [ 2 ]

50 голосов
/ 12 декабря 2010

Это предупреждение - способ, с помощью которого gcc сообщает, что не может проверить аргумент строки формата функции стиля printf (printf, fprintf ... и т. Д.) Это предупреждение генерируется, когда компилятор не может вручную заглянуть в строку и убедиться, что все пойдет так, как вы запланировали во время выполнения. Давайте посмотрим на пару примеров.

Случай 1. Эта строка может быть проверена во время компиляции, и компилятор разрешит это без предупреждения:

printf("This string has no format");

Случай 2. В этом случае компилятор может обнаружить, что у вас есть спецификатор формата, и выдаст другое предупреждение. На моей машине было написано «предупреждение: слишком мало аргументов для формата».

// This will most probably crash your machine
printf("Not a safe string to %s"); 

Случай 3. Теперь это несколько ваш случай. Вы берете строку, сгенерированную во время выполнения, и пытаетесь ее распечатать. Вы получаете предупреждение о том, что компилятор предупреждает вас, что в строке может быть спецификатор формата. Скажем, например, "плохой% sdata". В этом случае среда выполнения попытается получить доступ к несуществующему аргументу, соответствующему% s. Хуже того, это может быть пользователь, пытающийся использовать вашу программу (заставляя ее читать данные, которые небезопасны для чтения).

char str[200];
scanf("%s", str)
printf(str)
17 голосов
/ 12 декабря 2010

Хотя технически нет ничего плохого в вызове функции, похожей на printf со строкой, это все же плохая практика, потому что строка может содержать токены формата, такие как %s.Например, если imp равно %s test, произойдут плохие вещи.

Если вы просто хотите напечатать imp без форматирования, вам следует использовать fputs(imp, fil) (обратите внимание на обратные аргументы).

...