Comments 90
Не всем думаю будет понятно, да и комит не в самом верху страницы.
Пробел после /usr. Меня тогда пронесло, не успел обновится.
-BUMBLEBEEVERSION=1.4.31
+BUMBLEBEEVERSION=1.4.32
@@ -348,7 +348,7 @@ case "$DISTRO" in
ln -s /usr/lib/mesa/ld.so.conf /etc/alternatives/gl_conf
rm -rf /etc/alternatives/xorg_extra_modules
rm -rf /etc/alternatives/xorg_extra_modules-bumblebee
- rm -rf /usr /lib/nvidia-current/xorg/xorg
Пробел после /usr. Меня тогда пронесло, не успел обновится.
я вот всегда искренне неудомеваю — а что в open-source продуктах юнит тесты и функциональные тесты никто принципиально не пишет?
>>> Android <...> То есть один из передаваемых в функцию параметров вообще не используется.
Очень странно, что такой баг возник, учитывая, что большинство (если не все) IDE на такие вещи истерично ругаются.
Очень странно, что такой баг возник, учитывая, что большинство (если не все) IDE на такие вещи истерично ругаются.
Не только IDE, но и компиляторы.
Описание этого бага выдаёт автора (точнее, что тот ни в зуб ногой в том, о чём пишет).
Параметр v и не должен возвращаться, это то значение, которым заполняется память по заданному указателю. Возвращается всё правильно в обоих случаях, баг был в том, что память всегда обнуляется.
Параметр v и не должен возвращаться, это то значение, которым заполняется память по заданному указателю. Возвращается всё правильно в обоих случаях, баг был в том, что память всегда обнуляется.
UFO just landed and posted this here
Например, «замемсеттить» RGB24 буфер значением 255, чтобы получить белую канву. Но это я так, к слову — обычно канва нужна чёрная :)
В релизе — да, а для отладки забивают 0xCC или 0xDEADBEEF или еще чем-то в этом роде. Так что этот баг слегка затруднял отладку. Промахнулся на один уровень.
UFO just landed and posted this here
Тоже хотел написать про это.
Но раз уж Вы опередили, то вот другой вопрос — неужели memset там реализован через цикл? Небольшое гугление говорит, что
The underlying implementation might be in assembler specific to that architecture to take advantage of whatever its native properties are. It might also have internal special cases to handle the case of zeroing (versus setting some other value).
Но раз уж Вы опередили, то вот другой вопрос — неужели memset там реализован через цикл? Небольшое гугление говорит, что
The underlying implementation might be in assembler specific to that architecture to take advantage of whatever its native properties are. It might also have internal special cases to handle the case of zeroing (versus setting some other value).
Потому что vim. В исходниках Android очень много такой фигни.
Использование vim какбэ не отменяет GCC-флаги -Wall -Wextra -Werror. Если человеку наплевать на предупреждения компилятора, то ему и на IDE будет наплевать.
Работает, только если при компиляции у вас не генерится еще 1000 'unused parameter' warning-ов. Достаточно одного человека в команде, который допускает в коде предупреждения, чтобы проанализировать лог компилятора стало сложно.
Если у вас есть такой человек, то vim и warning'и — это ещё не самая большая из ваших бед. Устранять надо корень проблемы, а не следствия.
К сожалению, в больших проектах такое бывает. Человек может банально собирать в другой конфигурации, в которой переменные используются.
__attribute__((__unused__))
?Для этого надо хотя бы знать, что переменная не используется.
если есть код
И вы всегда собираете с EXT_LOG defined, а ваш товарищ — всегда с EXT_LOG undefined, то тут и возникает проблема.
если есть код
int x = bar();
#ifdef EXT_LOG
ext_log(x);
#endif
И вы всегда собираете с EXT_LOG defined, а ваш товарищ — всегда с EXT_LOG undefined, то тут и возникает проблема.
#ifndef EXT_LOG __attribute__((__unused__) #endif int x = bar();
?
Хотя тогда уже проще само существование переменной x поставить в зависимость от EXT_LOG.
Наконец, если у вас действительно тысячелетний проект и вокруг все программисты — старцы с воооот такими бородами (бывает), то приведите в порядок тот исходник, над которым работаете, а остальные оставьте пока.
Да вы поймите, что товарищ, который код правит — не получает предупреждения и потому не замечает ошибки. А вы тоже не хотите лезть со своими правками в чужой код.
Практика code review у вас не распространена? Кроме того, можно попросить коллегу внести эти изменения в код, потому что это упростит вам работу и потенциально позволит избежать проблем в релизе. И вообще, не вижу ничего плохого в том, чтобы предложить другому человеку патч, тем более столь тривиальный и лаконичный.
С этими словами он бросил в сумку АКСУ и несколько магазинов к нему, после чего последовал к выходу.
Регулярно собирая open source софт из исходников, могу сказать, что ВЕСЬ софт написанный в vim просто пестрит ворнингами.
В Android штука интересная в том, что большинство кода написано на Java, а компилятор не линтует код. При этом любая IDE для Java гоняет линт автоматом и сразу бьёт по рукам. Не сильно, но надоедливо. Люди, привыкшие к консоли линт не юзают в принципе, а потом их код зарастает тоннами навоза.
IDE очень сильно дисциплинирует и пресекает множество мелких косяков на корню. За использование текстовых редакторов в программировании надо выгонять из профессии. Это вам не посты в бложики писать.
В Android штука интересная в том, что большинство кода написано на Java, а компилятор не линтует код. При этом любая IDE для Java гоняет линт автоматом и сразу бьёт по рукам. Не сильно, но надоедливо. Люди, привыкшие к консоли линт не юзают в принципе, а потом их код зарастает тоннами навоза.
IDE очень сильно дисциплинирует и пресекает множество мелких косяков на корню. За использование текстовых редакторов в программировании надо выгонять из профессии. Это вам не посты в бложики писать.
Уважаемый, да вам с таким подходом в Госдуму надо идти вырабатывать требования к профессиональным программистам. Серьёзно, я даже не знаю, что тут ещё можно сказать
Если некто не умеет пользоваться неким инструментарием, это ещё не повод навязывать всем окружающим своё мнение. Казалось бы, это банальность, да?
Если некто не умеет пользоваться неким инструментарием, это ещё не повод навязывать всем окружающим своё мнение. Казалось бы, это банальность, да?
Понимаете, если плотник не умеет пользоваться молотком, то это плохой плотник. А если программист не умеет пользоваться своими инструментами, то это уже личное мнение? Вы уж извините, но вы бред пишите.
Плохая аналогия подобна котёнку с дверцей. Это раз.
Если ваш плотник достигнет феноменальной выработки при минимальных затратах, забивая гвозди микроскопом, то последнее, что вы должны делать — отбирать у него микроскоп и совать ему свой проклятый хлипкий молоток с зазубринами и неудобной ручкой. Оценивайте результаты, а не инструменты, чтобы не выяснилось как-нибудь, что вы ненароком половину разработчиков ядра Linux из профессии выгнали. Это два.
Если ваш плотник достигнет феноменальной выработки при минимальных затратах, забивая гвозди микроскопом, то последнее, что вы должны делать — отбирать у него микроскоп и совать ему свой проклятый хлипкий молоток с зазубринами и неудобной ручкой. Оценивайте результаты, а не инструменты, чтобы не выяснилось как-нибудь, что вы ненароком половину разработчиков ядра Linux из профессии выгнали. Это два.
>Регулярно собирая open source софт из исходников, могу сказать, что ВЕСЬ >софт написанный в vim просто пестрит ворнингами.
Я вот специально скачал последнюю версию GCC из транка и собрал без ключа --disable-bootstrap. Предупреждения:
1) format not a string literal and no format arguments
2) unknown conversion type character ‘X’ in format
3) too many arguments for format
Все они -Wformat* и не ломают бутстрап, ибо признаны некритичными. Однако стоит объявить переменную и не использовать ее, сразу же ошибка бутстрапа.
Так ли вы уверены, что код, написанный без IDE плох?
>IDE очень сильно дисциплинирует и пресекает множество мелких косяков на корню
Посоветуете IDE, которая понимает ВЕСЬ GCC, со всей магией?
Я вот специально скачал последнюю версию GCC из транка и собрал без ключа --disable-bootstrap. Предупреждения:
1) format not a string literal and no format arguments
2) unknown conversion type character ‘X’ in format
3) too many arguments for format
Все они -Wformat* и не ломают бутстрап, ибо признаны некритичными. Однако стоит объявить переменную и не использовать ее, сразу же ошибка бутстрапа.
Так ли вы уверены, что код, написанный без IDE плох?
>IDE очень сильно дисциплинирует и пресекает множество мелких косяков на корню
Посоветуете IDE, которая понимает ВЕСЬ GCC, со всей магией?
Вот вам код из статьи в Vim с плагином YouCompleteMe.
Скрытый текст
Люди, привыкшие к консоли линт не юзают в принципе
Из консоли — это "
javac *
"? Мсье знает толк в несвежих извращениях.любая IDE для Java гоняет линт автоматом
1) Не любая.
2) Инспекции для начала надо бы и настроить.
Так что не панацея.
Странно. Пишу код в Vim. И этот самый Vim выдает мне и ворнинги, и ошибки и все-все-все. Комплита нет, да, потому что не настраивал, ибо не люблю.
UPD. Да, gdb я к нему тоже прикручивал ради фана.
UPD. Да, gdb я к нему тоже прикручивал ради фана.
>Debian OpenSSL
При использовании нормального IDE это невозможно
А вот поделки типа IWARM — там еще и не такой хрени понаделаешь
При использовании нормального IDE это невозможно
А вот поделки типа IWARM — там еще и не такой хрени понаделаешь
И что же нормальная IDE тут сделает-то?
высветит строку как коммент
Насколько я понял, строка была закоментирована намеренно, по причине "
Don't add uninitialised data.
"… во время отладки, а в релизе забыл раскомментить, потому что смотрелось ок
хотя кто знает
хотя кто знает
Вообще-то закомментировали намеренно, т.к. кому-то пришла в голову (или родилась на совещании в АНБ) гениальная мысль пройтись по исходникам профилировщиком valgrind, который высветил «использование не инициализированных данных», которое было бы ошибкой в любом проекте, кроме ГПСЧ, где это внезапно оказалось фичей.
Да, и был большой срач между дебиановцами и openssl'щиками. Потому что собирать энтропию из неинциализированной памяти — та ещё эвристика.
Там эта переменная частично инициализирована. Они берут большой буфер и начинают класть в него всё подряд: информацию о процессах, что-то из /dev/random, etc. Но до конца буфер так и не заполняют, в результате чего часть буфера так и остаётся неинициализированной. После чего весь буфер скармливается в ГПСЧ.
Так что неинициализированные данные — это далеко не основной источник энтропии для ГПСЧ — но основной источник ругани valgrind'а. Уж сколько раз твердили миру, что все автоматические тулы — это лишь помощники, для интерпретации их сообщений голова нужна.
Так что неинициализированные данные — это далеко не основной источник энтропии для ГПСЧ — но основной источник ругани valgrind'а. Уж сколько раз твердили миру, что все автоматические тулы — это лишь помощники, для интерпретации их сообщений голова нужна.
Вообще-то эта строка вообще является undefined behaviour, gcc и clang могут такую строку вовсе выкинуть из исходников, перенести в другое место с нарушением сайд эффектов и натворить прочие радости.
Я целую минуту всматривался в строчку
пытаясь понять ее смысл. Потом заметил.
if (getuid() != 0 && geteuid() == 0)
пытаясь понять ее смысл. Потом заметил.
Вот что значит неудачный идентификатор…
при подсветке в IDE, обычно видна разница между функцией и переменной.
что не умаляет не смешивать имена оных.
что не умаляет не смешивать имена оных.
Да нет. Тут беда в том, что имена функций различаются в одну букву. Я тоже тупил секунд 10. А не знал бы — и не заметил бы.
эм. а разве разница не в том, что после «geteuid» не было скобок?
Для любого юниксоида разница между euid и uid понятна, и путать их — всё равно, что путать slip() и sleep().
get_uid()/get_euid(), getUid()/getEuid()
в зависимости от принятых стандартов, и ещё масса вариантов. Дело не в разнице или её знании/не знаии, дело просто в зрительном восприятии.
Ну так функций, которые на одну букву отличаются в названии очень много (vnsprintf vs vnprintf). Это вполне стандартная практика в Си, и с учётом того внимания, которое надо проявлять при работе с памятью, внимание к имени функции просто неощутимо.
Минимум 2 из 5 ошибок были бы найдены самым простым статическим анализатором кода.
У меня тут таких ляпов.... Другое дело, что это просто ошибки, а не известные epic fail.
Используйте варнинги компилятора и статический анализ. Часто помогает.
Используйте варнинги компилятора и статический анализ. Часто помогает.
А как же the most expencive overbar in history?
Баг у xserver вообще некритичный, ни разу. Более того, эта проверка ещё и не нужна, ибо лучше не проверять на рутовость, а просто обламываться там, где не хватает прав, желательно с адекватной диагностикой. Это гораздо более гибкий подход, ведь иногда пользователь может входить в нужную группу/обладать достаточными привилегиями, но при этом EUID не будет root'овым.
Этот код не имеет отношения к проверке прав. Это — защита на тот случай, если админ поставил программе флаг setuid. Смысл защиты в том, что в режиме setuid программа может работать так, как была настроена — но не может быть перенастроена заного. Лично я не понимаю, зачем вообще так делать — но, видимо, юзкейсы были.
О чём я и говорю — при
-configure
сервер запишет новый конфиг-файл. Проверка почему-то предполагает, что не-root-пользователь этого сделать не должен, но, что если именно этот пользователь является владельцем конфиг-файла, и, соответственно, по-логике вещей, должен был бы суметь воспользоваться этой опцией. Типичный случай, когда assumption is the mother of all f*ckups.Вглядитесь еще раз в эту строчку:
Если админ не выставлял программе флага setuid — любой пользователь без проблем настроит свой личный конфиг.
if (getuid() != 0 && geteuid() == 0) {
Если админ не выставлял программе флага setuid — любой пользователь без проблем настроит свой личный конфиг.
Что ж так упорно понимать не хотите?
www.wikihow.com/Configure-X11-in-Linux:
+ man:
www.wikihow.com/Configure-X11-in-Linux:
A new file has been created in /etc/X11/ called xorg.conf
+ man:
Суть моего коммента в том, что пользователи могут что-то вполне административно-легально (права-членства в группах, или собственность) делать вещи, которые обычно может делать root. Данная проверка этой возможности его лишает. Именно поэтому нужно «… не проверять на рутовость, а просто обламываться там, где не хватает прав, желательно с адекватной диагностикой. …».-configure
When this option is specified, the Xorg server loads all video driver modules, probes for available hardware, and writes out an initial xorg.conf(5) file based on what was detected. This option currently has some problems on some platforms, but in most cases it is a good way to bootstrap the configuration process. This option is only available when the server is run as root (i.e, with real-uid 0).
Данная проверка — не лишает! Что же вы вчитаться в булево условие не желаете так упорно?..
PS и да, хотелось бы посмотреть на пользователя, имеющего права на загрузку драйверов…
PS и да, хотелось бы посмотреть на пользователя, имеющего права на загрузку драйверов…
То есть выдержка из man'а, где просто по-английски написано, что -configure можно выполнить только будучи root'ом, не смущает. Я даже курсивом выделил.
> PS и да, хотелось бы посмотреть на пользователя, имеющего права на загрузку драйверов…
Наслаждайтесь, чё…
> PS и да, хотелось бы посмотреть на пользователя, имеющего права на загрузку драйверов…
Наслаждайтесь, чё…
Меня смущает не выдержка из мана, а тот факт, что обвиняют совершенно постороннюю проверку.
PS спасибо.
PS спасибо.
Пожалуйста. А теперь попробуйте подумать логически о том, что я выше написал.
Проверка «если root не настоящий» (а только SETUID'ный)
— ну а как же, вдруг Вася Пупкин изуродует более культурный конфиг, более автоматическим.
А теперь — что если Вася Пупкин как раз и есть владелец /etc/X11/xorg.conf? Почему Вася, не должен смочь записать новый конфиг?
-configure
даёт возможность получить текстовое представление рабочего конфига сервера. Автоматически. root-пользователь просто запускает с этим ключом сервер, тот сохраняет рабочий конфиг.Проверка «если root не настоящий» (а только SETUID'ный)
-configure
делать запрещаетErrorF("The '-configure' option can only be used by root.\n");
— ну а как же, вдруг Вася Пупкин изуродует более культурный конфиг, более автоматическим.
А теперь — что если Вася Пупкин как раз и есть владелец /etc/X11/xorg.conf? Почему Вася, не должен смочь записать новый конфиг?
Потому что для этого нужна более сложная проверка. Зачем тратить силы на те юзкейсы, которыми никто не пользуется?
Васе же Пупкину никто не запрещает сделать так (если у него есть права грузить драйвера — то и куда исполнимый файл записать найдется):
И еще есть тот вариант, в котором рут снимает флаг setuid с файла Xorg — и Васе Пупкину ничего не надо никуда копировать.
Васе же Пупкину никто не запрещает сделать так (если у него есть права грузить драйвера — то и куда исполнимый файл записать найдется):
cp /path/to/Xorg ./Xorg
chmod +x ./Xorg
./Xorg -configure
И еще есть тот вариант, в котором рут снимает флаг setuid с файла Xorg — и Васе Пупкину ничего не надо никуда копировать.
Потому что для этого нужна более сложная проверка. Зачем тратить силы на те юзкейсы, которыми никто не пользуется?
Во-1-х, потому что идеологически правильнее проверять должна операционная система. Например, из-за появления тех же capabilites в Linux, кучу таких проверок пришлось найти, и выбросить…
Во-2-х, «никто не пользуется» — да-да. Расскажите UNIX-администраторам, что они не должны больше пользоваться стандартной моделью прав доступа, а должны каждому Васе сразу выдавать права root.
если у него есть права грузить драйвера — то и куда исполнимый файл записать найдется):
Если SETUID на данной платформе был реально необходим для штатной работы X-сервера, то после копирования, файл X превратится в тыкву.
(Думаю теперь можно поставить точку в этом диалоге.)
Вы сами себе противоречите. Все-таки, есть у Васи Пупкина необходимые права — или нет?
Конечно же, можно вместо сообщения об ошибке написать следующее:
Это вернет проверку прав на уровень ОС — но такое действие эквивалентно флага setuid у файла. То есть возвращаемся к варианту
PS хорошие админы UNIX давно уже усвоили, что setuid — зло. Поэтому хорошим админам эта проверка совсем не мешает.
(Думаю, да, теперь можно и точку поставить)
Во-1-х, потому что идеологически правильнее проверять должна операционная система. Например, из-за появления тех же capabilites в Linux, кучу таких проверок пришлось найти, и выбросить…Скажите мне, КАК должна операционная система проверять права Васи Пупкина, если программа работает под euid 0? Проблема именно в том, что setuid root выключает все проверки со стороны операционной системы — и прикладная программа должна проводить их самостоятельно.
Конечно же, можно вместо сообщения об ошибке написать следующее:
if (getuid() != 0 && geteuid() == 0)
setuid(getuid());
Это вернет проверку прав на уровень ОС — но такое действие эквивалентно флага setuid у файла. То есть возвращаемся к варианту
Если SETUID на данной платформе был реально необходим для штатной работы X-сервера, то после копирования, файл X превратится в тыкву.
PS хорошие админы UNIX давно уже усвоили, что setuid — зло. Поэтому хорошим админам эта проверка совсем не мешает.
Автор, а почему вы не указываете что это перевод?
Забавно, как раз сегодня отловил такой баг:
$a = true;
$b = false;
$c = $a and $b;
var_dump($c); // bool (true)
Прошу прощения за мое невежество, но это на каком языке?
В чем баг?
Это не баг. Это, немного неожиданное для рядового программиста, нормальное поведение.
$c = $a and $b;
читается как
($c = $a) and $b;
ua1.php.net/operators.precedence
$c = $a and $b;
читается как
($c = $a) and $b;
ua1.php.net/operators.precedence
(уже написали)
Sign up to leave a comment.
История однострочных багов