- 1
sprintf(path, "/usr/local/something/something_else_%d_%d.uyvy%c", some_int, some_other_int, '\0');
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+143
sprintf(path, "/usr/local/something/something_else_%d_%d.uyvy%c", some_int, some_other_int, '\0');
Мда-с.
bormand 28.12.2014 17:55 # +1
Говно.
gost 30.12.2014 14:37 # 0
roman-kashitsyn 30.12.2014 14:40 # +1
bormand 30.12.2014 14:50 # 0
guest 30.12.2014 17:21 # 0
roman-kashitsyn 30.12.2014 17:32 # 0
Откуда компилятору знать реальные ограничения на размер буфера? В некоторых случаях он может, конечно, определить размер (если пишем в массив фиксированного размера внутри текущего скопа), в общем же случае это сделать невозможно.
guest 30.12.2014 19:41 # 0
TarasB 30.12.2014 17:59 # 0
1024-- 30.12.2014 18:05 # 0
На этапе компиляции существует алгоритм вычисления размера блока на этапе исполнения.
1024-- 30.12.2014 18:24 # 0
3.14159265 30.12.2014 18:50 # 0
Я думаю это будет уже не сишка. Ну в смысле полагаться на UB умного компилятора совершенно непортабельный способ.
1024-- 30.12.2014 19:55 # 0
> не сишка
А для debug-версии - идеал.
Запустил, посмотрел, исправил и скомпилировал оптимизированную версию.
bormand 30.12.2014 19:55 # +1
3.14159265 30.12.2014 21:41 # 0
>Запустил, посмотрел, исправил и скомпилировал оптимизированную версию.
Ну во-первых как правильно сказано выше дебаг это и сделает, а во-вторых запилены всякого рода санитайзеры, с кучей проверок.
bormand 30.12.2014 19:04 # 0
... если известно начало блока. Но sprintf же и в таком коде юзают: Вычисли-ка, сколько байт осталось в блоке, на середину которого ссылается buf.
P.S. Рантайм D это как-то делает, но там, емнип, специальный навороченный аллокатор, рассчитанный на это. Для сишки это будет оверкиллом.
guest 30.12.2014 19:42 # 0
TarasB 30.12.2014 19:18 # 0
bormand 30.12.2014 19:21 # 0
P.S. Для любителей комфорта и безопасности есть два решения - качать/писать нормальную либу для работы со строками или уходить на другой, более высокоуровневый, язык.
TarasB 30.12.2014 19:27 # +1
Не, можно отдельно хранить размер и как-то его спрашивать, но это уже не сишка.
bormand 30.12.2014 19:28 # 0
К примеру, в ней есть localtime и gmtime, но в обратную сторону есть только mktime, который... работает только с локальной tz, а варианта для utc тупо нет! Каким местом надо было думать, чтобы такое сделать и за столько лет не исправить? Я уж не говорю о работе с произвольной tz.
bormand 30.12.2014 19:34 # 0
wvxvw 30.12.2014 21:05 # 0
Rust,
(OCaml)
3.14159265 30.12.2014 21:42 # 0
И код переписывать не надо.
guest 30.12.2014 22:28 # 0
guest 30.12.2014 19:42 # 0
guest 30.12.2014 19:41 # 0
bormand 30.12.2014 19:02 # +1
Я не спорю, это полезная фича. Но проблему sprintf'а и прочего говна она совершенно не решает, а только загоняет под ковёр.
> почему юзер должен страдать хуйней...
...и писать на сишке, когда вокруг есть столько высокоуровневых языков.
guest 30.12.2014 19:44 # 0
bormand 30.12.2014 19:53 # 0
Лол, блять. Ну держи, фома неверующий:
guest 30.12.2014 19:55 # 0
bormand 30.12.2014 19:57 # 0
Т.е. вижуалка в таком коде всяко не будет делать замену sprintf на snprintf. Максимум какой-нибудь ворнинг кинет или ошибку.
P.S. Емнип, она вообще sprintf и прочие подобные функции обзывала deprecated и заставляла юзать свои альтернативные версии (которые как раз проверяют длину).
guest 30.12.2014 20:07 # 0
Это таки для cpp. Ну значит нехуй летать в нашем небе писать на си.
bormand 30.12.2014 20:22 # 0
Спасибо, значит память меня не подвела.
1) sprintf они считают deprecated и показывают предупреждение (и правильно делают!)
2) sprintf_s для сишки всегда требует указывать размер буфера вручную, как и snprintf из C99
3) sprintf_s для крестов для простых случаев типа char s[10] считает этот размер сам, в остальных же - требует указывать размер вручную
guest 30.12.2014 22:30 # 0
bormand 30.12.2014 22:42 # 0
Если ему наврать и передать неправильный размер - запросто приведёт. Если же размер передан правильно - всё будет ок, просто строка обрежется под размер буфера (об этом можно узнать по возвращаемому snprintf'ом значению).
guest 30.12.2014 22:46 # 0
bormand 30.12.2014 23:10 # 0
guest 30.12.2014 23:38 # +1
guest 30.12.2014 21:08 # 0
Известной в статике?
bormand 30.12.2014 21:13 # 0
Да, известной на момент компиляции. С VLA (variable length array) тоже работает, но VLA - это гццизм, на него можешь не обращать внимания.
guest 30.12.2014 22:29 # 0
1024-- 30.12.2014 20:00 # 0
sizeof(str) - размер указателя, sizeof(*str) - размер чара - ровно 1.
Размер блока есть, как пишут выше, у аллокатора и программиста.
Вижу, Борманд уже написал, но не пропадать же добру. Запощу.
Abbath 28.12.2014 18:59 # +4