2012-03-29 4 views
0

Вот мой код:C++ Ошибка: Строка форматирования

void subroutine(const char *message) { printf(message); } 

А вот ошибка я получаю:

Error: In function ' ': warning: format not a string literal and no format arguements [-Wformat-security] 

Что такое ошибка здесь? Я не могу это решить.

Любые предложения?

ответ

1

Вы можете решить, выполнив

printf("%s", message); 

Или использовать что-то другое, например, fputs() вместо Printf.

gcc предупреждает вас, потому что он не знает строку формата, которую вы поставляете printf, и, следовательно, аргументы не могут быть проверены.

Представьте вы называете функции, как

message("It's 100%s"); 

Это заканчивается время printf("It's 100%s");, что это неправильно, и заканчивает тем, что вызывает неопределенную behavio, поскольку строка формата содержит %s, и вам необходимо указать дополнительный аргумент PRINTF это строка ..

3

Вы должны использовать

printf("%s", message); 

более пространное объяснение:

printf рассматривает свой первый аргумент как спецификатор формата. Если вам повезло, и сообщение не содержит %s или другие подстроки, специальные для printf, сообщение будет напечатано «как есть».

Но если message содержит что-то подобное, ваша программа попытается интерпретировать другие аргументы printf в качестве параметров. Поскольку фактических аргументов нет, он, например, рассмотрит некоторое произвольное расположение памяти как указатель и попытается разыменовать его. Это в лучшем случае приведет к краху; в худшем случае это может привести к утечке некоторых конфиденциальных данных.

(printf даже может перезаписать некоторую память, если %n встречается в строке форматирования.)

0

Если вы передаете "%d" в subroutine, вы собираетесь быть большие неприятности, так как printf будет искать другой аргумент ,

Компилятор любезно предупреждает вас, что если message содержит спецификацию формата, программа может потерпеть крах.

Вы можете использовать vprintf, если вы собираетесь написать что-то вроде

void subroutine(const char *message, ...) 
{ 
    va_list args; 
    va_start(args, format); 
    vprintf(message, args); 
    va_end(args); 
} 

, но если вы просто хотите отобразить message, используйте puts(message) или printf("%s", message).

Смежные вопросы