LINUX.ORG.RU

Предложение по контролю неопределённого поведения в Си

 , , неопределённое поведение


0

3

Привет, ЛОР!

В конце прошлого года было опубликовано предложение по добавлению в язык Си конструкций для контроля и упреждения неопределённого поведения.

Ссылка: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3211.pdf

Для Ъ:

Предлагается добавить специальную прагму MEMORY_SAFETY с вариантами DYNAMIC, STATIC и OFF. При включении MEMORY_SAFETY STATIC все варианты UB превращаются в ошибки сборки. Также, запрещаются многие конструкции, которые могут вызывать неопределённое поведение, например, операции над знаковыми числами, которые могут вызвать переполнение. В случае DYNAMIC, код, вызывающий неопределённое поведение, будет выбрасывать ошибку во время выполнения.

Что думаешь, ЛОРовец? Позволит ли это программистам на Си наконец перестать портить память?

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 2)

Позволит ли это программистам на Си наконец перестать портить память?

лучше отобрать память у тех, кто ее портит, и вернуть тем, кто ее потерял. то есть вернуть память пенсионерам.

alysnix ★★★
()

движение в защиту памяти напоминают левацкое движение за мир, с требованием выдать армии деревянные автоматы и надувные самолеты с поролоновыми бомбами. и разумеется министр обороны должна быть транссексуалом.

alysnix ★★★
()
Ответ на: комментарий от alysnix

разумеется министр обороны должна быть транссексуалом.

alysnix (02.03.25 19:44:18 GMT) шизофреник, эксперт по геям

Твоя экспертиза на ЛОРе незаменима.

hateyoufeel ★★★★★
() автор топика

Что-то аналогичное поведению c++ в constexpr функциях нужно.
В constexpr правда всё реализуется в компилтайме, а для реализации подобного в рантайме потребуются рантаймовые проверки

Позволит ли это программистам на Си наконец перестать портить память?

Нет конечно, желающие насрать каким-нибудь UB всегда найдутся, даже если возможность это сделать запрячут за семью печатями. Чего стоит проект на rust, использующий DefaultHash в сетевом протоколе... Запретили им срать в память, они в логику насрали

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 2)
Ответ на: комментарий от hateyoufeel

мариванна, мариванна! а петров неопределенно себя ведет! вчера он подарил мне конфету, а сегодня - забрал шоколадку.

мариванна: петров! надень желтую unsafe майку и делай с ней что хочешь!

alysnix ★★★
()
Ответ на: комментарий от apt_install_lrzsz

выбрасывать ошибку во время выполнения

На которую очередное дитя высшего сознания положит болт.

Ну и ладно, зато программа просто сразу упадёт, а не насрёт мимо буфера. Это уже будет намного лучше.

theNamelessOne ★★★★★
()
Ответ на: комментарий от mittorn

Что-то аналогичное поведению c++ в constexpr функциях нужно.

Например… constexpr?

https://en.cppreference.com/w/c/language/constexpr

Он в сишечке уже есть. Правда, как и всё в Си, урезанное до полного убожества. Функции в си не могут быть constexpr, например. Только переменные.

Нет конечно, желающие насрать каким-нибудь UB всегда найдутся, даже если возможность это сделать запрячут за семью печатями. Чего стоит проект на rust, использующий DefaultHash в сетевом протоколе… Запретили им срать в память, они в логику насрали

А где там UB? Присунуть рандом по сети – это не UB, это просто тупняк.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)

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

Так оно ж тогда будет определённым.

ya-betmen ★★★★★
()
Ответ на: комментарий от hateyoufeel

Я имею в виду поведение компилятора, когда он компилирует компилтаймовый вызов constexpr функции. В этом случае он не допускает никакие UB. Например, записать один член юниона, а прочитать другой нельзя. До c++20/23 не было способа получить битовое представление float/double - т.к все привычные способы это сделать - UB. Числовое значение указателя тоже нельзя получить, хотя указатели там есть. Доступ к массивам (в том числе через адресную арифметику) проверяется. Такой вот safe c++, жалко, только для constexpr

mittorn ★★★★★
()
Ответ на: комментарий от PPP328

Выше уже подсказали. Они в протоколе задействовали встроенный хэш для хэшмап. Мало того, что документация запрещает так делать и узнать что за хэш можно только в сорцах, в реализации для строк модифицированный вариант, из-за чего воспроизвести этот хэш оказалось очень сложно

mittorn ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Да вычитание походу тоже :) и многое многое другое. безопасно посчитать в уме и положить по адресу, так и живем ;) можно абак взять и логлинейку, чтоб не так тоскливо было

Morin ★★★★★
()
Ответ на: комментарий от alysnix

движение в защиту памяти напоминают левацкое движение за мир

Политоз головного мозга. Движение за введение ремней безопасности тоже левацким было?

red75prim ★★★
()
Последнее исправление: red75prim (всего исправлений: 1)