|
|
3.62, _kp (ok), 16:43, 24/01/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
Здесь костыль опциональный для отдельных файлов, и даже их частей,
а не всё что есть сплошной костыль.
И главное, нет мартышкиного труда по переписыванию, а можно использовать и существующий код и библиотеки.
Так что, этот вариант лучше.
| |
|
4.83, Аноним (83), 17:32, 24/01/2025 [^] [^^] [^^^] [ответить]
| –2 +/– |
> Так что, этот вариант лучше.
Если пытаться программы на расте проектировать и писАть в сишном стиле, то да, вариант из статьи лучше. Но наСИльники никак не могут понять, что надо не "си в раст тащить", а менять свою порочную парадигму "программно-разработнического" мышления. Тогда и с боровом бороться не придется, он для вас из "тюремщика" и "пыточных дел мастера" превратится в телохранителя и помощника. А так-то конечно - пытаетесь опасные, вредные и "хакерские" сишные приемчики применять в разработке на расте - он вас и бьет по рукам, нехороший.
| |
|
5.87, Аноним (87), 18:01, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Ой ну да, конечно. Все кто хейтят си, просто не понимают всей прелести низкоуровневой работы с памятью. Естественно в таком программировании надо быть осторожным.
Но вот заставлять всех использовать мифически безопасный язык, это нифига не выход.
Растаманы пытаются всех загнать в свое стоило. Пытаются стать диктаторами монополистами. Да еслиб все поголовно писали низкоуровневый код на расте, по было бы еще более тормознутым, чем есть сейчас.
Достаточно уже наворотили уровней абстракций, от которых софт разжирел и тормозит, вы еще и хотите лишить нас свободы манипулирования байтами. Нет уж, со своим растом сидите дальше в своих калифорниях, вместе с ооп.
| |
|
6.91, Аноним (-), 18:16, 24/01/2025 [^] [^^] [^^^] [ответить] | +/– | Сорок лет как под наркозом, Я работатал байтовозом но на выходе все рав... большой текст свёрнут, показать | |
|
5.149, Ivan_83 (ok), 00:12, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Вы хоть программировать то умеете?
А то у вас не раст а какой то розовый пони и не С а какой то злой дракон :)
НаСИльники - они сильно разные есть, с сильно разным error/bug rate :)
Старое поколение, ИМХО, много кто учился по книжкам, а там всё обмазано стандартной библиотекой и никак вопросы проверки границ не затрагиваются.
По стилю кода можно часто быстро понять чего ждать в целом :)
Если там стандартная либа и никаких проверок то ну его сразу :)
Если нет либы и нет или мало проверок - надо смотреть, может проверок нет потому что писал дзен мастер и их нет потому что они не нужны.
А бывает код обмазан проверками, каждый аргумент функции проверяется в самом начале и потом уже с ним работают и по ходу тоже везде проверки, для всех внешних данных.
Кстати гноомокцы против проверок, мне как то написали типа нафиг проверки пусть падает или типа того :)
| |
|
4.84, Аноним (-), 17:33, 24/01/2025 [^] [^^] [^^^] [ответить]
| +3 +/– |
> Здесь костыль опциональный для отдельных файлов, и даже их частей,
А какой тогда смысл???
Если ты знаешь что у тебя проблема с конкрентым файлом или даже его частью (это как? с конкретным циклом что ли?))), то не лучше ли просто исправить ошибку и добавить проверку руками?
Тут же проблема как раз в глобальности. У тебя есть огромная куча кода, которая где-то когда-то выходит за границы и портит память. А где - никто не знает.
| |
|
5.134, _kp (ok), 22:54, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Если ты знаешь что у тебя проблема с конкрентым файлом
Если это свой или знакомый файл, или не забытый, то проблемы считай, что нет, ибо подобное обязательно исправляется.
Исключение для отдельных сильно мудрёных манипуляций значительным объёмом данных.
Второй момент, тупо тесты, если не выявлено нарушений доступа к памяти, так можно смело пересобирать обычным компилятором.
А ведь на Си обычно код общего назначения сейчас не пишут, обычно это или системное ПО, или критичные молули, или вовсе встраиваемое ПО,когда потери быстродействия неуместны.
>добавить проверку руками?
Если совсем весь код на Си обложить проверками, то это и не читаемо и немеренно работы. А тут всё можно на автомате.
> и портит память. А
> где - никто не знает.
Особенно если это не заметно, и не проявляется при работе ПО, например из за резервирования размера буферов, проверки данных и переинициализации отдельных частей.
А с предлагаемым вариантом фиксируется факт нарушения доступа, например в лог, и даже если при старом тесте это могли не выявить, с этим вариантом нарушения будут выявлены.
| |
|
6.155, Аноним (-), 00:27, 25/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Второй момент, тупо тесты, если не выявлено нарушений доступа к памяти,
> так можно смело пересобирать обычным компилятором.
Тесты практически никогда не выявляют проблемы с памятью. Только в самых тривиальных случаях. Обычно для такого нужны "специально подготовленные данные" и/или фаззинг.
> А тут всё можно на автомате.
Не на автомате, в том то и дело.
> с этим вариантом нарушения будут выявлены.
Могут быть выявлены. Если повезет.
Но согласен что это лучше чем ничего.
| |
|
|
6.154, Аноним (-), 00:23, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Валгринд и асан знает.
Если это было так, то проблемы с памятью считай не было бы.
Но в реальности ты получаешь просто список репортов, и при их изучении оказывается что память где-то была испорчена.
Полностью восстановить ход событий невозможно, повторить не получается, заставить клиента юзать валгринд нереально, поэтому сиди проверяй все подозрительные места, выбрав их по логам. (Просто для контекста - кодовая база на 2М loc)
Если у вас есть идеи как лучшее решение - с удовольствием его выслушаю.
| |
|
7.166, Ivan_83 (ok), 01:18, 25/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
Ну вы сами злые буратины.
У нас в продукте давно внедрено что мы собираем с -O2 -g и все корки падают в одно место, там же с них извлекаются бэктрейсы в которых видны и названия функций и нумера строк и названия переменных с их значениями.
Это конечно не на 100% решает все проблемы, но все частые падения мы давно так отловили и пофиксили, насколько помню осталась у нас одна проблема которая проявляется редко при завершении работы, но жить это точно никому не мешает.
Ещё у нас инженера умеют делать тестовые стенды чтобы воспроизвести проблему, это тоже бывает сильно помогает.
Кодовая база - хз сколько там нынче строк, но тоже дофига.
| |
|
|
|
|
|
2.9, Аноним (-), 14:49, 24/01/2025 [^] [^^] [^^^] [ответить]
| +7 +/– |
> Растоконец?
Пффф... если бы...
> снижает производительность приложений в среднем на 5% (разброс от -1% до 29%)
> увеличивает размер кода на 9.1% (разброс от -1.4% до 38%)
> замедляет компиляцию на 11%.
Если на последнее можно забить, то предыдущие два выглядят остойно.
Плюс оно не будет работать со старым кодом автоматом:
> требует добавления в код специальных аннотаций и включения заголовочного файла "ptrcheck.h"
Пройтись по всей кодовой базе и подобавлять аннотации это конечно не так сложно как на раст переписать, но учитывая предыдущие недостатки... имеет ли оно вообще смысл?
Ну и вишенка - оно исправляет только выход за границы буфера.
А как же use-after-free? А как же double-free? А int overflow?
| |
|
3.16, Аналгин (?), 14:57, 24/01/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
Как будто в другиях ЯП проверки бесплатные. Нет, в расте магическим образом бесплатным оно не станет.
| |
|
4.20, Alladin (?), 15:03, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
в расте есть множество способов сделать это бесплатным, банально тип &[u8; 128] это уже тип с макс границей 128,
а обработка массивов на расте считает плохим тоном прямое обращение по индексу, люди используют итераторы.
а функции с платной проверкой границ максимально явные так как возвращают option.
| |
|
5.26, Аноним (26), 15:13, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> в расте есть множество способов сделать это бесплатным, банально тип &[u8; 128] это уже тип с макс границей 128,
И чё? Это просто другая форма записи того же самое, что и в новости. Это не бесплатно
| |
|
6.34, Alladin (?), 15:38, 24/01/2025 [^] [^^] [^^^] [ответить]
| +8 +/– |
и то, что зная что тип слайс с 128 элементами:
1. не нужно хранить количество элементов в runtime, а следовательно нет runtime проверок и не нужно доп памяти. прямое обращение к элементу с const номером не добавляет runtime проверок, а обращение к 129 элементу напрямую создает паник функцию (или None если это функция с option), также первый элемент массива абсолютно бесплатен.
2. нет потери характеристик типа между функциями. это также не пустой массив с 128 элементамм от функции к функции (всегда не null, указывает на не освобожденную память, по памяти такой же указатель, размер определен в compltime, размер и тип элемента определен).
и таких моментов в расте множество
| |
|
7.37, Аноним (37), 15:48, 24/01/2025 [^] [^^] [^^^] [ответить]
| –4 +/– |
Как не нужно-то, вот ты хочешь цикл фор по этому слайсу, откуда рантайму знать, сколько шагов нужно сделать?
| |
7.66, Аноним (66), 16:48, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
>1. не нужно хранить количество элементов в runtime, а следовательно нет runtime проверок
Ага, просто при итерации количество элементов прямо зашито в машинную инструкцию вместо области данных. Быстрее ли это? На самом деле нет.
>прямое обращение к элементу с const номером не добавляет runtime проверок, а обращение к 129 элементу напрямую создает паник
Прямо как в Си с флагом -Wall.
| |
|
|
5.31, Аноним (31), 15:19, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Здрасте, приехали. А тип "&[u8; 128]" — он что, бесплатен?
Если это не прямая абстракция железа, то очевидно, что либо оно не энфорсится и ограничения действуют только на этапе компиляции, либо оно энфорсится в рантайме и это каждый раз явные проверки на переполнение.
Или у растаманов своя вселенная и код не на реальном железе, а на святом духе и магической пыльце с крыльев феечек работает?
| |
|
6.124, Bottle (?), 20:40, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Rust - компилируемый язык, за неправильное приведение типов компилятор настучит по рукам программиста.
| |
|
5.144, _kp (ok), 23:39, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> в расте есть множество способов сделать это бесплатным..
Так с очевидными операциями с массивами и проблем обычно нет, и проверки простые
>>итераторы
А когда индексы/указатели получены на основе аргументов, да к ваниантным структурам, получаем те же проверки в рантайме.
| |
5.152, Ivan_83 (ok), 00:17, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Хоспаде, какие конченные люди.
Обращение к элементу массива по индексу это один из святых граалей, фича которая мастхэв.
Периодически бывает нужно или таблицу для перекодирования иметь или ещё что то удобно упихать в таблицу потому что на входе у тебя какие то числа на которые надо что то делать.
Если дрюкатся через итераторы то вместо o(1) будет o(n) сложность доступа до рандомного элемента массива.
| |
|
6.157, Аноним (-), 00:33, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Хоспаде, какие конченные люди.
Хоспаде, так это ты про себя же говоришь!
У тебя никто не отбирает доступ по индексу. Даже остается доступ без всех проверок вообще. Разобрался бы вначале о чем речь, а потом бы лез в комменты.
| |
|
7.170, Ivan_83 (ok), 01:29, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Все итераторы которые я видел не умели o(1) обращение по индексу. Они потому интераторыми и назывались что там другая механика работы и другой синтаксис.
| |
|
|
|
4.29, Аноним (29), 15:18, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Как будто в другиях ЯП проверки бесплатные. Нет, в расте магическим образом бесплатным оно не станет.
Разумеется.
Но в расте ты платишь в основном временем компиляции.
При использовании слайсов - проверка делается только один раз.
При использовании итераторов - тоже только один раз.
При использовании прямой итерации по массиву, то да - получается также как тут.
Т.е. получается лучше во всех случаях кроме такого.
| |
|
5.33, Аноним (37), 15:33, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
Так а что мешает обсуждаемому компилятору, раз он уже знает максимально возможный индекс, проверить только его? Ничего.
| |
|
6.45, Аноним (-), 16:08, 24/01/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
> Так а что мешает обсуждаемому компилятору, раз он уже знает
> максимально возможный индекс, проверить только его? Ничего.
Неа. Оно должно работать с generic code.
Ты можешь в нем напр. изменить i. Поэтому они вынуждены проверять на каждой итерации.
А со слайсом/итератором - уже внутри делается проверка на границы один раз.
| |
|
|
8.81, Аноним (-), 17:25, 24/01/2025 [^] [^^] [^^^] [ответить] | +1 +/– | Пффф берешь указатель на i и передаешь как параметр в функцию слинкованной ли... текст свёрнут, показать | |
|
9.97, Аноним (37), 18:31, 24/01/2025 [^] [^^] [^^^] [ответить] | +/– | В этом случае да, придётся чекать каждый раз но и на расте тоже Но обычно всё... текст свёрнут, показать | |
|
|
|
|
|
4.32, Аноним (32), 15:22, 24/01/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
В расте большая часть проверок в compile-time.
Т.е разработчику придется подождать подольше, CI будет бегать не так шустро.
Может придется купить билд-машину помощнее.
А в предложенном варианте
> снижает производительность приложений в среднем на 5% (разброс от -1% до 29%)
у КАЖДОГО пользователя.
А если их будут миллионы?
| |
4.41, Аноним (-), 16:04, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
Станет, но без всякой магии.
Например:
for (size_t i = 0; i < count; ++i)
buf[i] = i;
можно переписать как:
buf.iter_mut().enumerate().map(|(i, b)| *b = i);
Или если count != buf.len(), то:
buf.iter_mut().take(count).enumerate().map(|(i, b)| *b = i);
В обоих случаях это развернётся в код, в котором на каждой итерации будет одна проверка на окончание цикла (то есть как будто без проверок на выход за границы), дополнительные проверки, если они и будут, будут производится вне цикла.
Проверки в расте не бесплатные, но они дешевле, чем 5% производительности.
| |
|
5.51, Аналгин (?), 16:23, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
Какой ужас. Даже джава в первом примере автоматически уберет проверку.
| |
|
6.146, Аноним (-), 23:52, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Я думаю, что C тоже удалит её, но ситуации бывают сложнее, и вот там функциональщина начинает рулить.
| |
|
5.141, Аноним (140), 23:16, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Проверки в расте не бесплатные, но они дешевле, чем 5% производительности.
Это кто сказал? Тутна Сях даже удаляешь прстую команду - бац +30% тормозов, из-а архитектурных особенностей / недетерминизма, а у вас максимум 5% всегда......
Так же, хначит и в Си будет - не больше чем на Rust, в конкретном случае. Вы меня просто поражаете!
| |
|
6.148, Аноним (-), 00:11, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Это кто сказал?
Проскакивало что-то в информационном потоке, какие-то попытки оценить накладные расходы на реальном проекте. Я не помню, что именно, поэтому ссылки не будет.
> хначит и в Си будет - не больше чем на Rust
Проверок будет меньше, а тормозов больше, потому что хоть на локальном уровне компилятор C может не хуже раста соображать, но констрейнты с глобального уровня он тягать практически не может. Он вообще никогда не может доверять программисту.
| |
|
5.153, Ivan_83 (ok), 00:21, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> buf.iter_mut().take(count).enumerate().map(|(i, b)| *b = i);
Нечитаемая галомотня.
| |
|
6.159, Аноним (-), 00:37, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Нечитаемая галомотня.
Мда... просто перепись неосиляторов с сишкизмом голового мозга в терминальной стадии.
В таком случае понятно почему вы кроме си ничего осилить не можете. Там же сложнаааа.
Как раз все просто и понятно:
- берешь итератор, именно мутабельный
- указываешь что нужны первые count
- итерируешься и для каждого элемента выполняешь присваивание
| |
|
7.174, Ivan_83 (ok), 02:08, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Вопрос не в неосиляторстве а в том нафига делать так сложно.
> buf.iter_mut().take(count).enumerate().map(|(i, b)| *b = i);
У вас тут 5 уровней, а в конце ещё что то непонятное в качестве аргумента для map().
Если бы я писал что то похожее то я бы на каждом этапе проверял на NULL прежде чем обращатся дальше.
Но я бы такое сложное писать не стал, ведь изначально вы это написали как замену банальному циклу:
for (size_t i = 0; i < count; i ++) { buf[i] = i; }
У меня даже в строчку это получилось короче записать чем у вас.
При условии что count меньше или равен sizeof(*buf) оно будет работать без проблем и не требует никаких проверок.
Так вот, этот ваш крипто код конечно занятный, но копатся в этом не интересно.
Интересно открыть код, понять про что он и где проблема, поправить и занятся чем то приятным.
Ваша запись более длинная и более сложная, нужно знать больше ключевых слов и понимать как они работают чтобы представить какой оно даёт результат.
Зачем это надо когда есть более простое и наглядное решение делающее ровно то же самое?
| |
|
|
|
|
3.25, Аноним (25), 15:08, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Так кланг же высылает ворнинги при использовании обнуленного указателя
| |
3.67, _kp (ok), 16:51, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
> снижает производительность приложений в среднем на 5% (разброс от -1% до 29%)
> увеличивает размер кода на 9.1% (разброс от -1.4% до 38%)
>> выглядят остойно.
Если сплошной код типа *x++ ? x[*y+n] = *z++...
то и будут максимальные потери. И будут они на любом языке с проверкой границ.
Но для критичных мест есть же #pragma
>>не так сложно как на раст переписать
Переписать можно и на С++ безопасно. Если делать нечего то и на JS.
А если переписывание не финансируется? За чей счет несложно переписать?
Зато с предлагаемым вариантом можно перекомпилировать код, и
и можно сразу запустить. А когда перепишут всё. Что тоже значительная разница.
| |
|
4.76, Аноним (-), 17:12, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
> А если переписывание не финансируется? За чей счет несложно переписать?
Эм... я вроде и написал, что то что предлагают проще и дешевле чем переписывать.
Откуда вы взяли "несложно переписать"?
> Зато с предлагаемым вариантом можно перекомпилировать код,
> и можно сразу запустить.
И... И ничего не поменяется)))
Чудес не бывает - вам все равно придется пройтись по ВСЕМ циклам и расставить нужные аннотации. И желательно ничего не напутать в процессе.
Что не такая уж маленькая работа по сравнению с "перекомпилировал и запустил".
| |
|
3.125, анон (?), 21:09, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Не так давно здесь писали про компилятор fil-c для C/C++ (форк Clang). Теже 5%. Чудес не бывает - это скрытые проверки на диапазоны массивов. Много программ собирается без переписывания, но изменяется ABI.
| |
3.128, Sergey (??), 21:15, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Ещё со времен Windows 2000 дебаггер имел возможность ставить хардварные брейкпоинты на запись в область памяти. Gdb так не умеет? Прошу прощения за глупый вопрос, недавно с линуксом работаю.
| |
|
2.89, Аноним (89), 18:12, 24/01/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
все прям бросили раст, плюсы, го и побежали писать на древнем С. Ядро Линукса, xne, драйверы , контроллеры и легаси тулы линукса - вот и вся ЦА этого языка
| |
|
|
4.142, Аноним (140), 23:25, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Да это вы тут какой то фантазёр, я ранее тут даже приводил ссылку на оч.крутой benchmark, а не как обычно от Васяня, и даже сделал суммирующий анализ оттуда табличек производительности разных языков. Пусть Rust не самое дно по производительности - но, дно.
Не знаю как у них так криворуко получилось. Выше даже вон привёл анализ чьего то примера ассемблера от него, на простейшем цикле.
Так кто тут фантазёр?...
| |
|
5.160, Аноним (-), 00:40, 25/01/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
> я ранее тут даже приводил ссылку
> даже сделал суммирующий анализ
И никаких пруфов. Даже на свой коммент тут.
> Так кто тут фантазёр?...
Ну, получается что ты.
Talk is cheap. Show me the link.
| |
|
|
|
|
1.4, laindono (ok), 14:39, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| –2 +/– |
В современных языках это и так есть по умолчанию. В целом хорошая идея, всё равно сишников заставить писать нормальный код невозможно. А так хоть падать будет с читабельной ошибкой. Это определённо лучше, чем код, который то работает, то не работает, то работает, но странно.
| |
|
2.143, Аноним (140), 23:30, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Синтаксис плохенький :( и ещё ряд жутких идеалогических недостатков :(
- использовать это мало кто будет.
Т.б.было уже подобное - в GCC, не много ни мало лет двадцать назад. Выпилили позже из-за недоделанности и заброшенности, никому не надо оказалось. Либо с такими же проблемами реализации как тут.
| |
|
1.7, Аноним (7), 14:46, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +2 +/– |
> Включение режима "-fbounds-safety" снижает производительность приложений в среднем на 5% (разброс от -1% до 29%), увеличивает размер кода на 9.1% (разброс от -1.4% до 38%) и замедляет компиляцию на 11%.
Ахахах, т.е. мяу! (с)
Нафига оно тогда надо?
Напомнило историю с MiraclePTR
| |
|
2.10, Аноним (10), 14:52, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
We anticipate that MiraclePtr meaningfully reduces the browser process attack surface of Chrome by protecting ~50% of use-after-free issues ...
| |
|
3.19, Аноним (-), 15:01, 24/01/2025 [^] [^^] [^^^] [ответить] | +1 +/– | Потребление памяти основным процессом браузера при применении MiraclePtr увелич... большой текст свёрнут, показать | |
|
4.130, Bottle (?), 21:44, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Я знаю как. Оберни это сугубо в шаблоны. Header-only, хотя отчасти это следует из шаблонов.
Не забудь ещё завернуть это дело в десяток билд систем. И чтобы при этом всё скачивалось с интернета, чтобы при очередном апдейте весь проект падал.
| |
|
|
2.15, Аноним (15), 14:56, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Ну т.е., меньшее замедление, чем затыкание всевозможных Spectre-Meltdown'ов.
| |
|
1.8, Аноним (26), 14:48, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +2 +/– |
> char *buf = (char *)malloc(10); // для указателя buf будут сохранены сведения о границах
Если это Си, а не С++, то приведение типов тут не нужно, void* можно сохранить в любой указатель
| |
|
2.53, Аноним (53), 16:27, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
Нет ничего хуже человека, который реально пишет на C++, но при этом думает, что знает чистый Си.
| |
|
|
|
|
4.47, Аноним (-), 16:13, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Чтобы сам компилятор собирался 9 часов? Ненужно.
А зачем вы собираете компилятор?
Вы что, из этих?
> Ненужно.
Угу. Намного нужнее выходить за границы буферов.
| |
|
5.73, Аноним (15), 17:07, 24/01/2025 [^] [^^] [^^^] [ответить]
| –2 +/– |
Я из гентушников и что? Пока право выбирать дистры, к счастью, не отменили.
А вот вам сделали достаточно простое решение, чтоб не выходить за границы. И без всяких чекеров бровов.
| |
|
6.77, Аноним (27), 17:15, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
Так и в Генте вроде компилятор не часто собирают, разве нет?
А борроу чекер проверяет очень много всего, вещь нужная, отказываться не хотим
| |
|
7.168, Аноним (167), 01:25, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
собирали бы нечасто, если бы от этого мусора не зависели ff и thunderbird. а так можно было бы годами llvm не трогать, чтобы не воняло
| |
|
6.78, Аноним (-), 17:19, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Я из гентушников и что?
> Пока право выбирать дистры, к счастью, не отменили.
Не, не, ничего. Все и так понятно.
Разумеется это отлично. Не беспокойтесь, я нормально отношусь ко всяким меньшинствам
> А вот вам сделали достаточно простое решение, чтоб не выходить за границы.
Это не мне сделали, а дыряшечникам.
Ну, посмотрим поможет ли это им. Потому что самые упоро... т.е. упорные признают только гнутость, а туда это не добавляли и не факт что добавят.
| |
|
7.115, Neurasthenic (ok), 19:32, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
"Не беспокойтесь, я нормально отношусь ко всяким меньшинствам"
Большинство бы так не сказало...
| |
|
8.120, Аноним (-), 20:08, 24/01/2025 [^] [^^] [^^^] [ответить] | –1 +/– | Ты наверное никогда не общался с большинством, возможно в твоем окружении одни м... текст свёрнут, показать | |
|
|
6.93, Аноним (89), 18:21, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
Вот вы гентушки и пользуйтесь этим костыльным решением. А мир вокруг вас тоже пользуется своим правом и выбирает безопасный и современный язык
| |
|
|
4.48, Аноним (48), 16:16, 24/01/2025 [^] [^^] [^^^] [ответить]
| +6 +/– |
> Чтобы сам компилятор собирался 9 часов? Ненужно.
Ты каждый день компиляторы собираешь?
Может ты на компиляторо-сборочном предприятии работаешь?
Самое главное - чтобы оно быстро работало у юзера.
А тут в худшем случае почти 30% дропа производительности.
| |
|
5.114, Аноним (114), 19:26, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Ты каждый день компиляторы собираешь?
Он же выше уже написал, что является гентушником. То есть да, ежедневно, и далеко не только компиляторы. 😂
| |
|
|
3.43, Аноним (43), 16:06, 24/01/2025 [^] [^^] [^^^] [ответить]
| –3 +/– |
В С++ он встроенный - std::shared_ptr и std::unique_ptr называется.
| |
|
4.46, Аноним (-), 16:11, 24/01/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
Компайл-тайм в плюсы не завезли и сомневаюсь что завезут в ближайшие лет десять.
> std::shared_ptr и std::unique_ptr называется.
А все ваши *_ptr - это тормознутое рантайм поделие.
Которое все равно позволяет выстрелить себе в ногу.
| |
|
5.70, Аноним (66), 17:02, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
>Компайл-тайм в плюсы не завезли и сомневаюсь что завезут в ближайшие лет десять.
Про constexpr ты видимо не слышал.
| |
5.75, Аноним (15), 17:10, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
Компайл тайм в C++ завезли с момента появления в нём шаблонов.
| |
|
6.79, Аноним (-), 17:21, 24/01/2025 [^] [^^] [^^^] [ответить]
| +3 +/– |
> Компайл тайм в C++ завезли с момента появления в нём шаблонов.
Ну, ну.
Покажи мне "Borrow checker" на плюсах в компайлтайме.
Хоть на шаблонах, хотя constexpr как предложил другой анон в уже скрытом комменте.
| |
|
7.156, Аналгин (?), 00:29, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Боров чекер - это ворованный из плюсов unique_ptr, стыдно должно быть не знать.
| |
|
|
|
4.95, Аноним (-), 18:25, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
Вы или не знаете как устроен shared_ptr, или что такое borrow checker. А вероятнее всего, ни первого, ни второго.
| |
|
3.55, Аноним (3), 16:37, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Боров пишется за сутки на любом языке. Другое дело что он так раздражает и если его можно отключить его отключают.
| |
|
4.80, Аноним (-), 17:23, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Боров пишется за сутки на любом языке.
Пруфов, как обычно, не будет?
> Другое дело что он так раздражает и если его можно отключить его отключают.
Если не 6ыdloкодить и соблюдать правила владения, то он даже не ругается.
Но раз он вас настолько раздражает, что вы аж его отключаете... то у меня для вас плохие новости)))
| |
|
5.123, Аноним (123), 20:39, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Я гуглить за тебя на буду. Боров просто проверяет что объект не мутировал это один иф.
| |
|
6.136, Аноним (114), 23:04, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Боров просто проверяет что объект не мутировал
Настало время восхитительных историй...
> Я гуглить за тебя на буду
А зря. Если бы ты таки погуглил, что такое borrow checker, то чушь не писал бы.
| |
|
|
|
|
|
1.28, Аноним (26), 15:17, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +1 +/– |
> for (size_t i = 0; i < count; ++i) {
> buf[i] = i; // проверка "if (i < 0 || i >= count) trap()" добавлена не будет, так как выше уже имеется условие "i < count" и i не может быть меньше 0.
> }
А если count - 1 > длинны буфера?
| |
|
2.35, Аноним (-), 15:42, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
> А если count - 1 > длинны буфера?
Ты что не любишь сюрпризы? (с)
И вообще, надо оставлять фичи для следущих релизов - чтобы было видно, как в поте лица работают.
| |
2.82, анонимус123 (?), 17:31, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
либо я чего-то не понимаю, либо оба примера с проверками в цикле бессмысленны. В первом примере проверяется то, что и так обеспечивается условиями цикла, а во втором (да и в первом тоже) не проверяется то, что на самом деле может являться причиной ошибки...
| |
|
1.30, bOOster (ok), 15:18, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +9 +/– |
Единственно что смог раст - так это потянуть дидов все-таки начать что-то делать с проверками границ буферов и т.п.
| |
|
2.36, anonymmmeer (?), 15:47, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
можно было писать на dafni и генерировать си код.
анотации можно было и на frama-c делать, там они вообще в коментах
| |
2.56, Аноним (3), 16:38, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
Сам ты делать конечно же ничего не будешь. Это деды тебе должны? У тебя инфантильность 80 лвл.
| |
2.158, Ivan_83 (ok), 00:34, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Глупости.
Кто хотел и интересовался - читал МыщьХ ещё в начале 200х и применял всякое разное из его советов чтобы писать код который меньше падает.
Там среди советов было и проверять все входные параметры всех функций как будто враги всегда их будут вызывать с заведомо неверными параметрами. Заодно и все входные данные извне, типа файлов или сети.
Менять местами костанту и переменную в условиях: if (0 == i) на случай если вдруг оно станет if (0 = i) - тогда компелятор сразу такое отбракует. В те времена компеляторы не сыпали варнинги на присвоение в условиях. Да и щас их никто не читает.
Да и в принципе индустрия в той части где код на С и С++ за последние лет 15 очень сильно изменилась, даже для обычного пользователя: программы вылетают сильно реже чем в начале 2000х.
| |
|
1.40, Аноним (40), 16:02, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +1 +/– |
грешим на людей, что они глупы и тем самым хотим создать "умный" компилятор, но "умному" компилятору надо подсказать как по "умному" поступать, а кто подскажет? - глупец?
| |
|
|
3.54, Аноним (40), 16:37, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
пусть имитация интеллекта сначала считать научится
"""
Вопрос:
сколько простых чисел от 0 до 512
Ответ:
Простые числа — это числа больше 1, которые делятся только на 1 и на себя.
Числа от 0 до 512, которые являются простыми, это:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509.
Их 101 штука.
"""
пс: это ИИ на которую выделили 500 лярдов
| |
|
4.60, Аноним (3), 16:41, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
Ещё не выделили. Ты пытаешься самоутвердиться указав на незначительную ошибку. Хотя во всех других задачах ИИ на 10 голов лучше тебя.
| |
|
5.65, Аноним (40), 16:46, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Хотя во всех других задачах ИИ на 10 голов лучше тебя.
выделите мне 500 лярдов и я буду умнее всех :)
| |
|
4.96, Аноним (96), 18:26, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
в списке выше 97 чисел, а не 101 или 104
(копируем список в текстовый редактор, заменяем пробел на \n, смотрим количество строк)
| |
|
|
|
7.175, Аноним (40), 02:15, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
а ну конечно, он там припрятал уже доказательство гипотезы Римана, осталось только у него это выудить (отпромптинжинерить) :р
| |
|
|
|
|
3.57, Аноним (40), 16:39, 24/01/2025 [^] [^^] [^^^] [ответить] | +/– | точно Да, я перепроверил Все числа, которые я перечислил, являются простыми, и... большой текст свёрнут, показать | |
3.58, Аноним (40), 16:39, 24/01/2025 [^] [^^] [^^^] [ответить]
| –1 +/– |
ты уверен?
Давай точно перепроверим. Я пересчитаю все числа еще раз.
Вот правильный список простых чисел от 0 до 512:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509.
Их 106.
Прошу прощения за предыдущую ошибку, теперь это верный ответ. Простых чисел от 0 до 512 действительно 106.
| |
|
4.74, Слава Роботам (-), 17:07, 24/01/2025 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Прошу прощения за предыдущую ошибку, теперь это верный ответ. Простых чисел
> от 0 до 512 действительно 106.
Что такое? У нас мясной мешок который не прошел IQ тест который сам же и предложил?! Поразвелось тут всяких квазиразумных.
| |
|
|
6.178, Аноним (10), 03:19, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Unable to load site
Please try again later. If you are using a VPN, try turning it off. Check the status page for information on outages.
| |
|
|
|
|
2.49, Аноним (-), 16:20, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Просто писателей компиляторов на порядки меньше чем обычных сишко-кодеров.
И ревьювить, и тестировать кода компилятора можно намного тщательнее чем типикал код.
Но сама идея довольно костыльная. Вот что помешает передать в проверку не то значение?
| |
|
3.63, Аноним (40), 16:44, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Вот что помешает передать в проверку не то значение?
то есть сишник должен быть не глупцом, а раз не глупец, на кой это хрень?
| |
|
|
1.71, Аноним (-), 17:05, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +4 +/– |
> "__counted_by(N)" - определяет размер буфера в элементах целевого типа.
А синтааксис из стандарта [[attribute]] им, видимо, не зашел? И надо вместо этого сдеоать анномацию похожую на вызов функции? Вот уж господа голубых кровей.
| |
|
2.88, Аноним (-), 18:03, 24/01/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
> Ха, всего то 1 заголовочный фаил вместо нового языка.
Ха, всего-то добавить аннотации для всех циклов во всем коде.
Ну и один заголовочный файл. Вот без него не взлелит.
| |
|
1.94, Аноним (94), 18:25, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +2 +/– |
Самое смешное, что нормальные С программисты выдуманных для них проблем не испытывают.
| |
|
2.99, Аноним (-), 18:43, 24/01/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
> Самое смешное, что нормальные С программисты выдуманных для них проблем не испытывают.
"не испытывают" потому что "нормальный С программист" это мифическое существо, вроде розового невидимого единорогога?)) Покажите хоть одного?
А вот "обычные типичные С программисты" проблем не испытывают потому что им и так намана.
Ну переполнил буфер, ну хакнули сервер.
Ну нажал Backspace 28 раз, ну зашел без пароля.
Ну прочитал за пределами буфера, ну 300 тысяч серваков оказались уязвимыми в течении непонятного времени.
Ничего страшного, дело-то житейское.
Главное сишникам намана!
| |
|
3.101, Аноним (101), 18:48, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Покажите хоть одного?
тут же был на днях федя цо
рассказывал что за бабло готов на всё
| |
|
4.107, Аноним (-), 19:06, 24/01/2025 [^] [^^] [^^^] [ответить] | +1 +/– | Так это как раз типикал сишник Процитирую анона из другого треда code Напомн... большой текст свёрнут, показать | |
|
3.161, Ivan_83 (ok), 00:45, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Код пишут люди, люди совершают ошибки.
В перечисленных вами примерах ничего особенного нет: нашли - исправят.
Если вы за мир где всё делают компуктеры, то не нужно думать что там ошибок не будет, но вот процесс их исправления будет намного хуже.
Раньше везде сидели всякие тётеньки и дяденьги, писали, считали. Они ошибались. Им тыкали в морду и они переделывали.
Потом поставили компьютеры и к ним операторов. Когда случалась ошибка оператор говорила: ну тут компьютер так выдал, идите куданибудь и там разбирайтесь, не мешайте работать.
Мне вот с год назад делали электронный ID с ЭЦП, там внутри обычная смарткарта с NFC а в ней обычный сертификат который госы выпускают и подписывают своим ключём.
Для серта нужен e-mail. Ну я и дал им свой e-mail, он у меня вида: xxx@yyy.email
да да, домен .email. Вот прямо так.
На месте выяснилось что такой адрес в программу ввести не возможно, потому что он не корректный (по мнению программы, вернее того кто писал валидатор). В итоге была куча перезвонов и попыток меня убедить что это какой то не правильный адрес, я даже с каким то там разработчиком вообщался. И пришлось в этот раз дать им gmail.com чтобы они подавились.
А что ты будешь делать когда компьютеры будут писать сами себе программы а ты не впишешься в какой то редкий фильтр а тебе прям без этого жизни не будет?)
| |
|
2.103, Аноним (27), 18:50, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Все подобные аргументы звучат как-то вот так
"Что за бред этим ваши ремни безопасности? Нормальные водители проблем с ДТП не испытывают"
| |
|
3.162, Ivan_83 (ok), 00:52, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Таки что из этого должно следовать?
Ремни в ДТП снижают травматичность лишь до определённой степени.
После 40 км/ч ремни уже слабо помогают и если нет подушек безопасности то риски смерти растут по экспоненте к скорости. Да в общем и на 40 км/ч резкая остановка об стену до 0 км/ч будет довольно болезненной и травматичной.
После 70 км/ч уже огромное влияние того как сделан кузов и как он гасит удар.
Если посмотреть на типичные скорости и типичные авто то лучше вообще в этом не ездить :))))
| |
|
2.112, Аноним (27), 19:08, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
А вообще, вот такие рассуждения про, что "нормальные программисты на Си проблем с памятью не ведают" - как раз выдает того, кто не имеет никакого понятия про нормальное программирование на Си. Нормальный Си как раз отдает себе отчёт, что у него в руках опасная бритва
| |
|
3.121, Аноним (94), 20:21, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Расскажи моему спутниковому софту, что я не умею писать на сях без всего этого "безопасного" дерьма.
| |
|
4.131, Аноним (131), 21:46, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Расскажи моему спутниковому софту, что я не умею писать на сях
> без всего этого "безопасного" дерьма.
Да, да, разумеется умеешь! И софт спутниковый, и по для атомных станций, и ядро линукса.
Все ты можешь, все ты умеешь!
*два кубика галоперидола ему и в палату*
| |
|
5.163, Ivan_83 (ok), 00:53, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Чувак, это тебе лекарств не хватает, раз ты глючный код сравниваешь с бритвой.
| |
|
|
|
|
1.116, Аноним (116), 19:44, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
В Java такие проверки изначально встроены в язык. И удаление ненужных проверок (т.н. "bounds-checking elimination") гораздо более продвинуто сделано.
Проблема этой магии в том, что не глядя на ассемблерный код ты фиг поймёшь, где и сколько будет проверок. Может быть ни одной (если их все удалил компилятор), а может прямо в середину оптимизированного цикла влепить пару десятков. Как следствие, реальная потеря производительности непредсказуема.
| |
|
2.171, Аноним (167), 01:34, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
на расте пишут те же люди, которые пишут на js. им просто невозможно объяснить, что такое быстрый код. для них быстрый - это раст, им так в бенчмарках сказали
| |
|
1.118, Илья (??), 19:52, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
А это разве не решается через введение безопасной абстракции (мимо дотнет-разработчик)
| |
|
2.132, maximnik0 (?), 21:53, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
>это разве не решается через введение безопасной абстракции (мимо дотнет-разработчик)
Я не знаю зачем Эппл пилит эту библиотеку.Унаследованный проект или на всякий случай ? Они же перешли на ARM64, а там защита гораздо лучше.В АRM64 реализована атрибутная защита памяти MTE ,а теперь добавлена ARM64 GCS (Guarded Control Stack) для аппаратной защиты адресов возврата из функций.Все, описал атрибутами буфера- в случае переполнения срабатывает аппаратная защита.
| |
|
3.133, Аноним (133), 22:11, 24/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Я не знаю зачем Эппл пилит эту библиотеку.Унаследованный проект или на всякий
> случай ? Они же перешли на ARM64, а там защита гораздо лучше.
Последний макбук на интеле вышел в 2020 году.
Он полноценно поддерживает последнюю MacOS Sequoia (вышла всего 4 месяца назад).
И есть шансы что будет поддержка еще и следующей MacOS 16.
Поэтому им вполне полезен этот проект.
Ну и эпл - это не только консюмерские девайсы, а еще и огромная инфраструктура.
А она крутится скорее всего не на армах. Ну, или как минимум не только на армах.
| |
|
2.165, Ivan_83 (ok), 01:13, 25/01/2025 [^] [^^] [^^^] [ответить]
| +/– |
Так пиши сразу на другом языке :)
Всмысле нет, там разные кейсы проверок и оно привязано к базовому синтаксису языка.
В любом случае нужно будет много править код, что никому не впёрлось.
| |
|
1.119, Аноним (119), 20:03, 24/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Раньше все достаточно сложные программы на Си содержали в себе только кривую реализацию подмножества Лиспа. Теперь ещё и кривую реализацию подмножества Раста будут содержать.
| |
1.147, Ivan_83 (ok), 00:03, 25/01/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Частично это повторяет функционал: -D_FORTIFY_SOURCE=2
который не требует вообще никак трогать исходники. Одно время я с этим все порты в системе и саму систему собирал. По итогу из того что я заметил оно отловило только в claws-mail выход за границы буфера, за примерно год+ использования.
Полагаю и от того что в огрызке накодили будет столько же толку.
А учитывая что ещё и код надо править то проще вообще без этого обойтись и просто ещё раз проверить что проверки есть в нужных местах.
В целом было бы больше проку если бы оно работало как статический анализатор и насовывала варнингов при включении на те места где проврок не хватает и без необходимости править код.
| |
|