Цитата(Sergio_chiper @ Oct 4 2007, 00:12)

Заметил неприятную фичу. Если в printf или его производных не соответствуют строка форматирования и список параметров, то стек неприлично загаживается. Есть ли способы вылечить этот эффект опциями компилятора?
Я не скажу про IAR. Но gcc, hitech-c и другие компиляторы имеют возможности (например, через pragma) определить, что функция с переменным числом аргументов
является printf-подобной, т.е. содержит строку формата, и компилятор соответствие формата и списка аргументов будет контролировать. Это раз. Кроме того, надо быть уверенным, что включен нужный warning level -- то-есть может быть, компилятор несоответствие обнаруживает, но не сообщает об нём.
Цитата
Система жутко нестабильна, надо весь пользовательский ввод обрамлять весьма интеллектуальными фильтрами, лениво... Пользователи пока не допёрли, что невинная комбинация %f во вводимых данных сносит крышу напрочь

СТОП! Речь шла о контроле ошибок на этапе компиляции! Если речь идёт о валидации вводимых пользователем данных -- это отдельный разговор.
Но во-первых хотелось бы предостеречь об известной ошибке -- передаче строки, вместо первого аргумента, строки формата, функции printf или подобной. То-есть например:
Код
printf(string_variable);
Такой код не допустим! Кроме случаев, когда программист очень чётко контролирует содержимое
string_variable. Разумно использовать другой код:
Код
printf("%s", string_variable);
Другой вопрос, что вообще применение printf в таком случае не имеет смысла, потому, что в таком случае стоит использовать fputs:
Код
fputs(string_variable, stdout);
Цитата
И вообще, это фича ИАРа или особенность ARMов? Склоняюсь к первому, но проверять на других компиляторах самому, извините, == маразм.
Обрисуйте ситуацию, кому не лень, пжлст.
Я смутно догадываюсь, что пользователи, помимо прочего, в данном случае вводят формат для printf в качестве входных данных программы. Если это сделано умышленно (а если неумышленно -- то это серьёзная ошибка), то следует обратить внимание на
валидацию вводимых данных. Вручную.