?

Log in

баг, программистское - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

баг, программистское [окт. 29, 2007|09:45 am]
Anatoly Vorobey
А вот тех, кто пишет printf(str) вместо printf("%s", str), мы будем бить по пальцам линейкой.

Особенно когда в str совершенно случайно обнаруживается знак процента вместе с какими-то другими случайными буквами.
СсылкаОтветить

Comments:
From: gershshpraihler
2007-10-29 07:49 am
без связи с сутью, меня всегда коробит от этого выражения.
(Ответить) (Thread)
[User Picture]From: vyhuhol
2007-10-29 07:53 am
От sprintf без формата?
(Ответить) (Parent) (Thread)
[User Picture]From: gxk
2007-10-29 07:57 am
обязательно отправить на курс по С :)
(Ответить) (Thread)
From: a_shen
2007-10-29 07:59 am

но что же тогда делать

с теми, кто придумал функцию sprintf с такими свойствами?
(Ответить) (Thread)
[User Picture]From: getman
2007-10-29 08:02 am

Re: но что же тогда делать

В смысле ? Как функция должна знать передали ли ей параметр константой или через переменную ?
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: getman
2007-10-29 08:00 am
Даже не думал что так можно :)
(Ответить) (Thread)
[User Picture]From: ablinov
2007-10-29 08:02 am
А разве скомпилируется?
(Ответить) (Thread)
[User Picture]From: avva
2007-10-29 08:36 am
Кстати, есть языки, где sprintf - функция без дополнительного аргумента, возвращающая всю построенную строку. Но неважно, считайте, что printf - я там ниже объяснил.
(Ответить) (Parent) (Thread)
[User Picture]From: fantaseour
2007-10-29 08:04 am
Эти люди не хлебнули вебдева с его инъекциями и прочими заморочками пользовательского ввода.
(Ответить) (Thread)
[User Picture]From: catpad
2007-10-29 08:05 am
По-моему, всё равно первого параметра не хватает.
(Ответить) (Thread)
[User Picture]From: avva
2007-10-29 08:34 am
Я сначала написал printf, а потом не подумав исправил на sprintf; просто суть в том, что там не printf, а определенный printf-like метод класса. Сейчас исправлю обратно на printf.
(Ответить) (Parent) (Thread)
[User Picture]From: muchacho
2007-10-29 08:06 am
А sprintf(str) вообще скомпилируется? ;)
Да и sprintf("%s", str), кажется, тоже не должно. Лучше не надо, во всяком случае.

В остальном же полностью поддерживаю.
(Ответить) (Thread)
[User Picture]From: avva
2007-10-29 08:36 am
см. ответ на предыдущий коммент.
(Ответить) (Parent) (Thread)
[User Picture]From: nchaly
2007-10-29 08:12 am
И иногда совсем даже не случайно - http://www.xakep.ru/magazine/xs/045/032/1.asp
(Ответить) (Thread)
[User Picture]From: amarao_san
2007-10-29 08:33 am
за использование sprintf ("%s") следует бить ровно так же. От того, что оно упадёт не сразу же, а в особо экзотической длине str, легче не станет.
(Ответить) (Thread)
[User Picture]From: itman
2007-10-29 01:24 pm
На эту тему бывают вообще просто-таки клинические случаи. Один товарищ убеждал меня, что он в большинстве случаев точно знает длину. И тогда использует sprintf. Я был даже готов ему поверить, но valgrind обнаружил один такой случай, когда он промахивается на байт.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2007-10-29 08:45 am
А я бы еще линейкой настучал слишком умным компиляторам ( не помню какой это был ) который мне в тесте самостоятельно printf("something"); // это чисто для отладки было
заменил на puts("something")
В течении наверно часа тупил, почему текст выводится а на бряк в printf не попадает (под gdb)
(Ответить) (Thread)
[User Picture]From: drlazy
2007-10-29 08:47 am
А я бы еще линейкой настучал слишком умным компиляторам ( не помню какой это был ) который мне в тесте самостоятельно printf("something"); // это чисто для отладки было
заменил на puts("something")
В течении наверно часа тупил, почему текст выводится а на бряк в printf не попадает (под gdb)
(Ответить) (Thread)
[User Picture]From: migmit
2007-10-29 09:06 am
А линейкой настучать тем, кто не включает спецфлаги компилятора для отладки?
(Ответить) (Parent) (Thread)
[User Picture]From: migmit
2007-10-29 09:07 am
Конечно, надо писать putStrLn str.
Ну, в САМОМ крайнем случае - cout << str, если уж совсем невмоготу.
(Ответить) (Thread)
[User Picture]From: uzt_nus
2007-10-29 09:16 am
подозреваю что раговое идёт про ANSI C , а не C++
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: uzt_nus
2007-10-29 09:14 am
2 момента.
1. gcc -Wall половину данной проблеммы улавливает (% в str) и кричит.
2. snprintf

Решает большинство проблем со стрингами в С.
Можно также и линто пробежаться.
(Ответить) (Thread)
[User Picture]From: fenikso
2007-10-29 09:18 am

угу

Отдельной когортой идут те, кому надо бить по рукам за использование sprintf вместо snprintf...
(Ответить) (Thread)
[User Picture]From: drlazy
2007-10-29 09:25 am

Re: угу

ну почему, иногда бывает адекватно. Особенно если только числа в форматную строку подставляются.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: mopexod
2007-10-29 09:22 am
Как раз пару недель назад сам написал так, и сам немедленно побил себя линейкой... :)
(Ответить) (Thread)
[User Picture]From: deadkittten
2007-10-29 09:51 am
Прямо "printf injection" :)
(Ответить) (Thread)
[User Picture]From: ak_47
2007-10-29 10:02 am
По-моему надо линейкой бить за чрезмерное использование printf там где это не требуется. Нет форматирования - зови puts(str) и дело с концом.
(Ответить) (Thread)
[User Picture]From: dmarck
2007-10-29 12:30 pm
О-о, classic format bug. Знакомое ощущение (про "по пальцам линейкой")
(Ответить) (Thread)
[User Picture]From: aburachil
2007-10-29 12:34 pm
Вы таких в гугль работать берёте? Ой-вей, ужоснах....
(Ответить) (Thread)
[User Picture]From: bamsic
2007-10-29 12:36 pm
Забавно, всегда писал второй вариант, хотя сейчас осознаю, что первый тоже работоспособен... :-)
(Ответить) (Thread)
[User Picture]From: ygam
2007-10-29 02:50 pm
Это был little Bobby Tables.
(Ответить) (Thread)
[User Picture]From: fenikso
2007-10-29 05:31 pm
%) sanitize database inputs
(Ответить) (Parent) (Thread)
[User Picture]From: wildernesscat
2007-10-30 08:27 am
(Ответить) (Thread)
From: bulldozerier
2007-11-05 09:38 pm
Вам стоило упомянуть, что str — переменная, а не литерал, иначе первым линейкой получит Керниган.
(Ответить) (Thread)
[User Picture]From: vitolduv
2010-09-26 06:46 am
Мне нравятся линейки для жж, на сайте можно загружать свои бегунки, сервис в том году появился, а уже имеет огромную публику
(Ответить) (Thread)