реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> глюки с форматированным выводом
Sergio_chiper
сообщение Oct 3 2007, 21:12
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 20-10-06
Пользователь №: 21 521



Заметил неприятную фичу. Если в printf или его производных не соответствуют строка форматирования и список параметров, то стек неприлично загаживается. Есть ли способы вылечить этот эффект опциями компилятора?
Система жутко нестабильна, надо весь пользовательский ввод обрамлять весьма интеллектуальными фильтрами, лениво... Пользователи пока не допёрли, что невинная комбинация %f во вводимых данных сносит крышу напрочь smile.gif

И вообще, это фича ИАРа или особенность ARMов? Склоняюсь к первому, но проверять на других компиляторах самому, извините, == маразм.
Обрисуйте ситуацию, кому не лень, пжлст.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 3 2007, 21:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Дык уже многократно говорено, что printf/sprintf в IAR требует большого стека. Тем более с полнофункциональными опциями (вывод float).
Go to the top of the page
 
+Quote Post
Sergio_chiper
сообщение Oct 3 2007, 22:05
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 20-10-06
Пользователь №: 21 521



Да он работает замечательно, но стоит дать в строке форматирования ссылку на несуществующий в списке параметров элемент, тут же все рушится.
Т.е. пишем строчку printf(" %d %d %d", a, b); и каюк. Похоже, компилятор достаёт из стека параметры вместо того, чтобы запомнить указатель и вернуть его при выходе. У кейла для 166 с этим проблем нет, да и вообше я не припомню компилятора, который бы так плохо себя вёл...
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 4 2007, 05:14
Сообщение #4


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Sergio_chiper @ Oct 4 2007, 02:05) *
Т.е. пишем строчку printf(" %d %d %d", a, cool.gif; и каюк.

А зачем свои ошибки приписывать компилятору.
Это типа: с больной головы на здоровую. smile.gif
Не обижайтесь, это шутка.
Go to the top of the page
 
+Quote Post
Sergio_chiper
сообщение Oct 4 2007, 07:55
Сообщение #5





Группа: Новичок
Сообщений: 6
Регистрация: 20-10-06
Пользователь №: 21 521



Тут ещё такое дело. Я весь ввод пользователя посылаю в поток отладки, а он проходит через vsprintf без параметров. Весело получается. Сам-то я шлю в дебаг с параметрами и, как правило, они соответствуют строке форматирования smile.gif
Дурдом, проще свой форматёр написать.

Сообщение отредактировал Sergio_chiper - Oct 4 2007, 07:56
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Oct 4 2007, 08:44
Сообщение #6


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(Sergio_chiper @ Oct 4 2007, 10:55) *
Тут ещё такое дело. Я весь ввод пользователя посылаю в поток отладки, а он проходит через vsprintf без параметров. Весело получается. Сам-то я шлю в дебаг с параметрами и, как правило, они соответствуют строке форматирования smile.gif
Дурдом, проще свой форматёр написать.

А зачем при неформатированом выводе использовать vsprintf? Напишите свой xprint, который просто символы в буфер пихает. На стеке сэкономите кроме всего прочего.
Go to the top of the page
 
+Quote Post
Sergio_chiper
сообщение Oct 4 2007, 09:15
Сообщение #7





Группа: Новичок
Сообщений: 6
Регистрация: 20-10-06
Пользователь №: 21 521



Как обходить проблему я прекрасно понимаю. Дебаг - это по сути копия функции printf, она принимает любое количество параметров, дергаю её из любого места с любым количеством параметров. Теперь же приходится рзделять вызовы на безопасные и "более другие" smile.gif
Грабельки, понимаешь...
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Oct 4 2007, 09:28
Сообщение #8


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(Sergio_chiper @ Oct 4 2007, 12:15) *
Теперь же приходится рзделять вызовы на безопасные и "более другие" smile.gif

Вопрос целесообразности... smile.gif Отладка есть отладка.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 4 2007, 09:49
Сообщение #9


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Не, господа, чето фигня какая-то. Ну и бог с ним, что параметров мало, пойдет доставать из стека, ну напечатает вам содержимое регистров при входе в функцию, если не сильно разогнались, но ничего не попортит. Ведь ВЫЗЫВАЮЩАЯ функция подчищает за собой стек. А, давайте-ка, нам в студию исходный код, листинг, и входящие параметры, при которых падает.
Кстати, может быть падает просто разбор float при попадании какого-то лайна вместо нормального числа с плавающей точкой?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
the_victor
сообщение Oct 17 2007, 08:58
Сообщение #10





Группа: Новичок
Сообщений: 8
Регистрация: 7-04-07
Из: Пермь
Пользователь №: 26 848



ссылка в тему
http://www.citforum.ru/security/articles/printf/
Неизвестная уязвимость функции printf
Крис Касперски
Go to the top of the page
 
+Quote Post
Kirill Frolov
сообщение Nov 2 2007, 11:30
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



Цитата(Sergio_chiper @ Oct 4 2007, 00:12) *
Заметил неприятную фичу. Если в printf или его производных не соответствуют строка форматирования и список параметров, то стек неприлично загаживается. Есть ли способы вылечить этот эффект опциями компилятора?


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

Цитата
Система жутко нестабильна, надо весь пользовательский ввод обрамлять весьма интеллектуальными фильтрами, лениво... Пользователи пока не допёрли, что невинная комбинация %f во вводимых данных сносит крышу напрочь smile.gif



СТОП! Речь шла о контроле ошибок на этапе компиляции! Если речь идёт о валидации вводимых пользователем данных -- это отдельный разговор.

Но во-первых хотелось бы предостеречь об известной ошибке -- передаче строки, вместо первого аргумента, строки формата, функции printf или подобной. То-есть например:
Код
        printf(string_variable);


Такой код не допустим! Кроме случаев, когда программист очень чётко контролирует содержимое string_variable. Разумно использовать другой код:

Код
        printf("%s", string_variable);


Другой вопрос, что вообще применение printf в таком случае не имеет смысла, потому, что в таком случае стоит использовать fputs:

Код
        fputs(string_variable, stdout);


Цитата
И вообще, это фича ИАРа или особенность ARMов? Склоняюсь к первому, но проверять на других компиляторах самому, извините, == маразм.
Обрисуйте ситуацию, кому не лень, пжлст.


Я смутно догадываюсь, что пользователи, помимо прочего, в данном случае вводят формат для printf в качестве входных данных программы. Если это сделано умышленно (а если неумышленно -- то это серьёзная ошибка), то следует обратить внимание на валидацию вводимых данных. Вручную.


--------------------
[ZX]
Go to the top of the page
 
+Quote Post
Velund
сообщение Nov 2 2007, 21:26
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



Кстати, о птицах... Проект, перенесенный с 4.42 на 5.10 (арм) падал самым непристойным образом, пока не увеличил размеры юкосовых стеков (блин, еще засада с отсутствием КА плагина под юкос в 5.10, dll взятый из 4.42 не пошел). Виновник - как раз printf (похоже он стал более прожорлив до стека в 5.x).

Видимо придется извращаться с отладкой...



PS: Посетила странная мысль после написания вышеизложенного. ;-) В результате свежий KA плагин версии 2.50 "нашелся"... wink.gif В самом очевидном для этого месте. После подпихивания вручную работает. wink.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016