Как получить предупреждения о неправильном форматировании строки (C++)

извините заранее, если я использую плохую терминологию.

когда я компилирую приложение C++ под gdb и использую printf(), оно дает мне потрясающие предупреждения, касающиеся согласованности строки формата и переданных аргументов.

например, этот код:

printf("%s %s", "foo");

приводит к предупреждению компилятора «слишком мало аргументов для формата», что очень полезно. он также выдаст предупреждения о типе строки формата и типе аргумента. он должен был проверить строку формата и сравнить ее с предоставленными типами аргументов. - этот вид интроспекции во время компиляции можно добавить к обычному исходному коду или это то, что нужно скомпилировать в сам gcc?

fwiw это под gcc 4.2.1 на os x.


person orion elenzil    schedule 08.02.2010    source источник


Ответы (1)


Вы можете делать подобные вещи для своих собственных функций, подобных printf (а также для функций, подобных scanf/strftime/strfmon):

#define PRINTF_FORMAT_CHECK(format_index, args_index) __attribute__ ((__format__(printf, format_index, args_index)))

void my_printf(const char *fmt, ...) PRINTF_FORMAT_CHECK(1, 2);

См. руководство по gcc. дальнейшие подробности.

person Paul R    schedule 08.02.2010
comment
В руководстве есть множество других опций; однако их может быть недостаточно, чтобы покрыть общий случай всех функций с переменным числом переменных. - person Carl Norum; 08.02.2010
comment
Хм; отличный спасибо Пол. со страницы руководства: Атрибут формата указывает, что функция принимает аргументы в стиле printf, scanf, strftime или strfmon, которые должны быть проверены на соответствие типу строки формата, поэтому похоже, что если у меня есть свои собственные сумасшедшие ограничения (например, что-то кроме printf - семейство функций) на самом деле это не поможет, но на странице, на которую вы ссылаетесь, есть целая куча других интересных атрибутов. Благодарность ! - person orion elenzil; 08.02.2010
comment
Потрясающий. Кто-нибудь знает, есть ли что-то подобное в компиляторе Intel C? В мануале ничего не нашел. - person pavon; 26.09.2014
comment
@pavon: я думаю, что ICC также может поддерживать это, но я не могу легко проверить прямо сейчас - попробуйте - он либо поддерживает это, либо просто молча игнорирует, но я не уверен, что . - person Paul R; 26.09.2014