The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Обновление Firefox 74.0.1 с устранением 0-day уязвимостей, opennews (??), 03-Апр-20, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


27. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  –3 +/
Сообщение от Fracta1L (ok), 04-Апр-20, 07:50 
Действительно, сишка ведь ни разу не дырявая XD
Ответить | Правка | Наверх | Cообщить модератору

29. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +/
Сообщение от Аноним (21), 04-Апр-20, 10:33 
> Действительно, сишка ведь ни разу не дырявая XD

Люди вообще склонны совершать ошибки, си тут ни при чём. Там, где язык простой, ошибки будут логические, а в сложном не только они.

Ответить | Правка | Наверх | Cообщить модератору

36. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +/
Сообщение от Ordu (ok), 04-Апр-20, 20:09 
Минутка философии.

Когда ты ищешь причину явления, то наиболее разумный метод выбирать что-то на роль причины -- это возможность как-то повлиять на следствие, влияя на причину. Обвиняя людей в ошибках, которые они совершают в C, ты загоняешь себя в тупик: людей ты не сможешь изменить. И заменить людей тебе нечем. А вот язык изменить можно.

Ответить | Правка | Наверх | Cообщить модератору

37. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  –1 +/
Сообщение от Аноним (21), 04-Апр-20, 20:17 
Проблема всегда в людях: самый лучший инструмент тебе не поможет, если ты не умеешь им пользоваться. И простой инструмент при этом и освоить каждый способен. А сложный слишком много возьмёт на себя -- ты не будешь иметь понятия, что он на самом деле делает, и начнёшь совершать дополнительные ошибки.
Ответить | Правка | Наверх | Cообщить модератору

38. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +2 +/
Сообщение от Ordu (ok), 04-Апр-20, 21:35 
> Проблема всегда в людях: самый лучший инструмент тебе не поможет, если ты
> не умеешь им пользоваться. И простой инструмент при этом и освоить
> каждый способен. А сложный слишком много возьмёт на себя -- ты
> не будешь иметь понятия, что он на самом деле делает, и
> начнёшь совершать дополнительные ошибки.

Ты можешь нежно поглаживать словами свой выбор причины сколько угодно, это не отменит того факта, что никому ещё не удавалось собрать команду C-программистов, которая бы не выходила бы многократно за границы буфера, не тестировала бы последствий use-after-free, и не вытворяла бы других глупостей.

Ответить | Правка | Наверх | Cообщить модератору

39. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  –1 +/
Сообщение от Аноним (21), 04-Апр-20, 22:42 
Когда создавались большинство проектов, ещё не существовало таких хороших анализаторов, как сегодня. Кстати, хоть какая-то польза от шланга, в том же ггц они появились по его примеру.
Ответить | Правка | Наверх | Cообщить модератору

40. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +1 +/
Сообщение от Ordu (ok), 05-Апр-20, 00:21 
> Когда создавались большинство проектов, ещё не существовало таких хороших анализаторов,
> как сегодня. Кстати, хоть какая-то польза от шланга, в том же
> ггц они появились по его примеру.

Создание анализатора для повышения качества кода -- это не изменение людей, а признание неисправимости людей и смещение фокуса борьбы с багами на язык и его инструментарий.

Ответить | Правка | Наверх | Cообщить модератору

41. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +1 +/
Сообщение от Аноним (21), 05-Апр-20, 00:26 
Так проблема-то действительно в людях. Обычно это либо "я знаю, что так нельзя, но мне виднее", либо "я всегда так делал и ничо". Теперь компиляторы за плохой код хотя бы могут бить по рукам.
Ответить | Правка | Наверх | Cообщить модератору

42. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +/
Сообщение от Ordu (ok), 05-Апр-20, 01:05 
> Так проблема-то действительно в людях.

Я выше описал критерии для выбора причины. Ты, я смотрю, их проигнорил и продолжаешь функционировать из каких-то своих критериев, которые ты либо тщательно скрываешь от меня, либо даже не в состоянии сформулировать для себя. Ты понимаешь, что осмысленный диалог при таком твоём поведении невозможен?

> Обычно это либо "я знаю, что так
> нельзя, но мне виднее", либо "я всегда так делал и ничо".

Эмм... Я не знаю куда ты смотришь, что для тебя это "обычно", я чаще вижу ситуации, которые не вписываются в твоё описание, и при этом я затрудняюсь выделить какие-то категории ситуаций, которые можно было бы назвать обычными: с обычными случаями люди обычно справляются без открытия багрепортов. Проблему представляют именно необычные, когда вроде всё продумал, решил, что например здесь не требуется особых заморок, чтобы избежать переполнения целого, потому как оно не может переполнится, но через полгода кто-то нашёл способ добиться переполнения целого именно в этом месте.

Тут проблема в том, что ты, думая о возможности переполнения думал, допустим, 5 минут, а тот кто нашёл переполнение думал, как его добиться, может быть, два дня. Но у тебя нет возможности думать по два дня над каждой строчкой кода.


Ответить | Правка | Наверх | Cообщить модератору

43. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +/
Сообщение от Аноним (21), 05-Апр-20, 01:19 
>переполнения целого

Так это и не баг вовсе. А какие ещё могут быть варианты? Предупреждать о возможном переполнении? Ну, где-то это сработает. Обложить всё костылями в рантайме? И это есть уже давно. Переполнение либо может быть, либо не может. Надо просто правильно выбирать типы данных

Ответить | Правка | Наверх | Cообщить модератору

44. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +3 +/
Сообщение от Ordu (ok), 05-Апр-20, 02:05 
> Так это и не баг вовсе.

Что значит "не баг"? С точки зрения языка это может и не баг, а фича, а с точки зрения программы переполнение может привести к тому, что твой индекс в массив окажется отрицательным, и когда ты проверишь что i<len, то получишь true, но когда пройдёшь по индексу окажешься за границами массива. То есть это, всё же, баг.

> А какие ещё могут быть варианты?

В смысле, как это можно решить на уровне языка? Тут несколько направлений возможно, которые не исключают друг друга.

1. Дать простые способы считать с проверкой на переполнение. То есть не какие-то кодовые высказывания языка, которые позволяют проверить на переполнение не наступив ни на какие грабли, не какое-то сакральное знание, требующее долгого обучения, которое не исключает высокой когнитивной нагрузки в процессе написания кода, а _простые_ способы. Это можно сделать либо на уровне библиотеки (например, определив тип checked_int, для которого будут определены все арифметические операции, но переполнение при их выполнении будет выкидывать исключение; или хотя бы функции checked_add, checked_sub, checked_mult, checked_div, которые будут делать то же самое, но над обычными int'ами), либо на уровне языка (например, дав возможность пометить блок кода для компилятора, чтобы тот всю арифметику в нём компилировал бы с проверкой на переполнение). Вариант с компилятором удачнее, так как он позволяет в компилятор вставить оптимизации, специально заточенные на арифметику с отловом переполнений. Скажем, компилятор сможет переупорядочивать операции, и может быть какие-то из проверок выкидывать.

2. Проверка индексов в рантайме. Это не так страшно, если включить агрессивный инлайн кода, и хороший оптимизатор, который сможет проверки выкидывать из циклов наружу, а когда не сможет то хотя бы за счёт спекулятивного выполнения сведёт их стоимость к ~нулю. Это не спасёт от переполнений целых в общем случае, но от довольно распространённых последствий этих переполнений спасёт.

3. Замена индексов итераторами и функционалами. Когда вместо for(i = 0; i < len; i++) sum += array[i]; ты пишешь sum = array.fold(sum, |acc, x| { return acc + x }), у тебя нет ну никаких шансов выйти за границы массива. Такой функциональный стиль не всегда удобен, но когда он удобен он устраняет не только возможность выхода за границы массивов, он ещё и гарантирует отсутствие ненужных проверок в рантайме (даже при -O0), а в некоторых случаях он позволяет оптимизировать код лучше, потому как этот стиль подталкивает программиста писать код, который хорошо векторизуется.

И, мне кажется, (1) наиболее важный пункт: постоянно обдумывать каждую операцию на предмет того, что может случится в случае переполнения, и может ли -- это очень утомляет. Утомление ослабляет внимание, а ослабленное внимание приводит к багам. Если же есть простые способы, которые не отвлекают от основной задачи, и всё что мне надо -- не забыть сказать компилятору, что тут очень важно чтобы не было переполнения, то всё становится резко проще. А если при этом ещё добавить строгую типизацию, и потребовать чтобы вся индексы имели бы тип off_t или size_t, и никакие int'ы не приводились бы к size_t и off_t молчаливо, а потом к size_t и off_t приделать обязательную проверку на переполнение, выполняемую компилятором, то тогда можно довести ситуацию, когда программисту проще писать с проверкой на переполнение, чем без неё, а это значит, что изворачиваться и уходить от этой проверки он будет только тогда, когда это действительно важно. То есть довольно редко, а если редко это делать, то и баги такие будут возникать редко.

> Надо просто правильно выбирать типы данных

Что ты имеешь в виду? off_t -- это знаковый тип, и тому есть причины. Его не удастся сделать беззнаковым, чтобы проверять на выход только за одну границу. Ты не сможешь сделать его больше. Точнее сможешь, но это бессмысленно, потому как перед применением всё равно придётся обрезать лишние биты. Да и дорого это: size_t и off_t, как правило размером с машинное слово, если ты сделаешь их больше, то вся арифметика станет резко дороже -- проще уж автоматически проверок на выход за границы в рантайме навтыкать.

Или ты к тому, что под количество денег в игре надо выделять не 32 бита, а целое произвольной точности, чтобы у игрока не было бы возможности, нырнув в глубокий минус, вынырнуть владельцем игровой вселенной? Может быть так и нужно делать. Но не всегда разумно использовать целое произвольной точности. А если просто взять 64 бита вместо 32, то это не обязательно спасёт: произведение двух 32 битных целых может опасно подобраться к переполнению 64 битного, то есть какой-нибудь промежуточный результат вычислений может переполнить и 64 бита, и... То есть это всё полумеры, если тебе нужна защита от переполнений, то нужно проверять на переполнения, то есть вставлять рантайм-проверки. И либо ты будешь делать это ручками, либо научишь компилятор делать это за тебя.

Ответить | Правка | Наверх | Cообщить модератору

45. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  –1 +/
Сообщение от Аноним (21), 05-Апр-20, 02:52 
Чёт длинно, я не в настроении читать простыни.

>дорого

Операции над машинным словом дешевле операций над его частью, в среднем, в принципе.

Я имею в виду, переполнение на пустом месте не возникает. Индексы не могут быть отрицательными, а разница индексов должна быть в 2 раза больше индекса. Это логическая ошибка программиста, если он допустил переполнение там, где его быть не должно.

Ответить | Правка | К родителю #44 | Наверх | Cообщить модератору

48. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +/
Сообщение от коржик (?), 05-Апр-20, 09:10 
я почитал за вас, было довольно интересно
Ответить | Правка | К родителю #45 | Наверх | Cообщить модератору

46. "Обновление Firefox 74.0.1 с устранением 0-day уязвимостей"  +/
Сообщение от Вебмакака (?), 05-Апр-20, 03:32 
>это не отменит того факта, что никому ещё не удавалось собрать команду C-программистов, которая бы не выходила бы многократно за границы буфера, не тестировала бы последствий use-after-free, и не вытворяла бы других глупостей.

Это были неправильные сишники.

Ответить | Правка | К родителю #38 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру