Ответ не обязательно придет сразу, это же опенсорс. Мейнтейнер вашего куска кода может быть в отпуске или в тюрьме. А если исправление касалось очень старого драйвера — возможно сам драйвер попахивает и пора поднимать вопрос о его исключении? Для оперативного обсуждения можно попробовать в IRC (тоже не факт что ответят сразу).
Алгоритм маляра Шлемиэля даже в ядре? Хотя это скорее всего никому не нужный драйвер. Одно дело если бы такая ошибка была в fs/ и другое — в каком-то драйвере, которым пользуются только экстремалы.
Очень круто. Это из серии «надо бы сделать такую штуку, но лень». Но бывают и такие тесты:)
Не уверен, что правильно понял идею, но в gcc вроде бы a[5] = {0,0,0,0,0} то же что и a[5] = {0}. Т.е. можно задать длинный-предлинный массив и по ходу регистрации тестов закидывать в него указатели.
Я думаю это всё же контроль ошибок для объектов ядра. А объекты берутся явно не с потолка, для них сначала выделяют память через kmalloc, который не должен выделять адреса из пространства, зарезервированного под коды ошибок, так как сам возвращает коды ошибок из этого диапазона — круг замкнулся. По сути нужно лишь гарантировать, что malloc не вернёт адрес из области 0-MAX_ERRNO, а это достаточно просто.
Можно в принципе не полагаться на теорию вероятностей, а посмотреть, как происходит распределение сегментов памяти в программе. По крайней мере NULL — это невалидный указатель. Далее исходим из того, что память ядро выравнивает по 4 килобайта, а также из того, что по младшим адресам всегда помещаются сегменты кода и данных. То есть ядро (и тем более malloc) не будет размещать какие-либо данные как минимум в диапазоне адресов 0-4095.
Ну и /proc/xxxx/maps в помощь. Минус в том, что за все операционные системы ручаться нельзя, да и непонятно, что там на встраиваемых системах. На 64-разрядной машине виртуальная область памяти вообще содержит массу «дырок»:
Оставим невесть куда утекающие 87424K «кучи» на совести разработчиков, и обратим внимание, что ядро оставляет приличные области адресного пространства как «сверху», так и «снизу».
А в жизни обычно приходится ковыряться вот в этом: developer.gnome.org/glib/stable/glib-Error-Reporting.html Т.е. мы имеем: код возврата, указатель на объект, который хотим получить и указатель на объект «Ошибка», если код возврата false, после которого ещё надо память освобождать. Но зато можно передавать произвольные ошибки с произвольными сообщениями об ошибках.
Не думал, что в фише такой чудной синтаксис. Т.е. обратная совместимость напрочь отсутствует. Медленнее может быть из-за seq (внешняя команда).
dash быстр, но он требует дедовских методов программирования на шелле, так как по возможностям уступает даже busybox. И тут даже видно, как его обгоняет zsh:
$ time busybox sh -c 'for i in $(seq 1000000); do [[ "$1" = "123" ]] && echo ok; done'
real 0m3.783s
$ time busybox sh -c 'for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok; done'
real 0m3.719s
$ time sh -c 'for i in {1..1000000}; do [[ "$1" = "123" ]] && echo ok; done'
real 0m6.310s
$ time sh -c 'for i in {1..1000000}; do [ "$1" = "123" ] && echo ok; done'
real 0m10.340s
$ time dash -c 'for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok; done'
real 0m2.394s
$ time zsh -c 'for i in {1..1000000}; do [ "$1" = "123" ] && echo ok; done'
real 0m5.541s
$ time zsh -c 'for i in {1..1000000}; do [[ "$1" = "123" ]] && echo ok; done'
real 0m1.975s
Баш существо загадочное, соглашусь что это builtin (разница с не-builtin налицо), но и не возьмусь объяснить, почему так происходит:
$ time for i in {1..10000}; do [[ "$1" = "123" ]] && echo ok; done
real 0m0.061s
$ time for i in {1..10000}; do [ "$1" = "123" ] && echo ok; done
real 0m0.108s
$ time for i in {1..10000}; do /bin/[ "$1" = "123" ] && echo ok; done
real 0m10.617s
— функция есть не везде (у меня на андроиде busybox, и хотелось бы, чтобы там этот PS1 тоже работал);
— по ссылке — шелл-портянка, у меня всего две строчки, и делают то что надо.
<зануда>По скорости. Во многих «стандартных» скриптах используют синтаксис условий [ ] для совместимости. Совмещать приходится для убунты/дебиана из-за велосипеда под названием dash и для всевозможных бсдей. На деле [ является внешней командой, а [[ — внутренней, благодаря этому отрабатывает намного быстрее. Фича есть в баше и busybox, а больше и не надо.</зануда>
Как раз очень раздражающий факт состоит в том, что стол реагирует ещё до прикосновения. Обратная связь отсутствует практически полностью.
То есть если я хочу паралелльно запустить красивые визуалы и синтез звука, то мне нужен ретранслятор, поскольку если модуль сопряжения принимает TUIO обьект, то допустим Flash визуалы этот обьект уже не видят.
Для этого в ядре Linux есть интересная возможность — reuse сокеты.
Алгоритм маляра Шлемиэля даже в ядре? Хотя это скорее всего никому не нужный драйвер. Одно дело если бы такая ошибка была в fs/ и другое — в каком-то драйвере, которым пользуются только экстремалы.
if(__LINE__ > 1000) exit(-1);
Ошибка всплывёт не на этапе компиляции, но хотя бы в рантайме.
Не уверен, что правильно понял идею, но в gcc вроде бы a[5] = {0,0,0,0,0} то же что и a[5] = {0}. Т.е. можно задать длинный-предлинный массив и по ходу регистрации тестов закидывать в него указатели.
Ну и /proc/xxxx/maps в помощь. Минус в том, что за все операционные системы ручаться нельзя, да и непонятно, что там на встраиваемых системах. На 64-разрядной машине виртуальная область памяти вообще содержит массу «дырок»:
А чем NULL в free не понравился?
dash быстр, но он требует дедовских методов программирования на шелле, так как по возможностям уступает даже busybox. И тут даже видно, как его обгоняет zsh:
— по ссылке — шелл-портянка, у меня всего две строчки, и делают то что надо.
<зануда>По скорости. Во многих «стандартных» скриптах используют синтаксис условий [ ] для совместимости. Совмещать приходится для убунты/дебиана из-за велосипеда под названием dash и для всевозможных бсдей. На деле [ является внешней командой, а [[ — внутренней, благодаря этому отрабатывает намного быстрее. Фича есть в баше и busybox, а больше и не надо.</зануда>
Для этого в ядре Linux есть интересная возможность — reuse сокеты.
Эх, где вы были, когда я был студентом:)
У меня не странный результат — где-то ошибки округления:
^R
PgUp/PgDown
А чтобы команды листались по стрелке вверх, достаточно добавить в bashrc: