LINUX.ORG.RU
ФорумTalks

Бьёрн Страуструп призвал стандартизировать профили C++ для безопасной работы с памятью

 , , ,


0

3

https://www.opennet.ru/opennews/art.shtml?num=62821

Бьёрн Страуструп (Bjarne Stroustrup), создатель языка C++, призвал комитет WG21, отвечающий за разработку стандартов для языка C++, предпринять меры для сохранения актуальности C++ в условиях активного продвижения инициатив по переходу на языки, обеспечивающие безопасную работу с памятью. Страуструп считает, что язык С++ уже содержит все возможности, необходимые для безопасной работы с памятью. Остаётся только предоставить средства, гарантирующие, что код написан с использованием только безопасных возможностей.

По мнению Страуструпа, времени осталось очень мало и необходимо до 2026 года успеть предпринять какие-то меры, так как Агентство по кибербезопасности и защите инфраструктуры США и ФБР стали более активно продвигать среди производителей ПО идею перехода на языки, безопасного работающие с памятью. До 2026 года производителям ПО рекомендовано разработать план по применению в своих продуктах технологий, защищающих от ошибок при работе с памятью, или переходу на использование языков, безопасно работающих с памятью.

Стандартизация возможностей для безопасной разработки на C++ позволит сохранить интерес к языку С++, особенно с учётом того, что разработчики существующих проектов на С и C++ смогут постепенно наращивать безопасность своих продуктов, не прибегая к инициативам по переписыванию на другом языке. В частности, проекты на C можно преобразовать в код С++, а за тем поэтапно переводить код на безопасные конструкции, следуя рекомендациям из руководства «C++ Core Guidelines».

Для обеспечения разработки безопасного кода Страуструп предлагает стандартизировать систему профилей C++, вводящих дополнительные требования к коду. Профили близки к применению флагов -Wall и -Wextra при компиляции, но в отличие от них работают на уровне запрета применения определённых возможностей языка. К реализации предлагаются профили для безопасных типов, контроля времени жизни объектов, работы с допустимыми диапазонами значений и целочисленной арифметики. Привязку к профилям можно задавать не только для проекта и файлов (например, [[profile::enforce(type)]]), но и включать/отключать на уровне отдельных конструкций (например, [profile::suppress(lifetime))] this->succ = this->succ->succ;).

Работа по повышению безопасности будет сводится к включению профиля для определённого кода и переписыванию частей, использующих небезопасные возможности языка, охватываемые выбранным профилем. Например, использование профилей поможет уйти от применения в коде сырых указателей и массивов, избавиться приведения типов и защититься от обращений к неинициализированным объектам. Вместо сырых указателей можно использовать, например, умные указатели std::unique_ptr и std::shared_ptr с отслеживанием владения. При наличии в коде циклов «for», перебирающих отдельные элементы Си-массива, потребует заменить данные циклы на вариант с обработкой диапазонов for(type variable : vector), использующий std::vector.

Предложены следующие профили:

  • type – каждый объект должен быть инициализирован, не допускается приведение типов.
  • lifetime – запрещены ссылки на освобождённые или неиспользуемые области памяти, разыменование указателей, явный вызов new/delete.
  • bounds – требуется проверка допустимых диапазонов при работе с указателями, запрещены арифметические операции с указателями.
  • arithmetic – блокируются целочисленные переполнения, запрещены знаковые/беззнаковые преобразования, изменяющие значение.
  • concurrency – исключает операции, приводящие к взаимным блокировкам и состояниям гонки.
  • RAII (Resource Acquisition Is Initialization) – требует проверки владения для каждого ресурса.

Гарантии, реализуемые при использовании профилей:

  • Обращение к объекту допускается только в соответствии с типом, под которым этот объект был определён.
  • Каждый объект должен быть корректно создан и освобождён.Каждый объект должен быть корректно создан и освобождён.
  • Каждый указатель должен указывать на корректный объект или нулевой указатель.
  • Каждая ссылка через указатель не должна переходить по нулевому указателю.
  • Каждое обращение через индексированный указатель должно находиться в пределах допустимого диапазона.
★★★★★

Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от Obezyan

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

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

Уровень аргументации - ссылка на юмористическую статью на Хабре.

Я не растофанбой, просто понимаю КАКИЕ подходы использует раст пытаясь убрать проблемы С и откуда у них растут ноги.

Из опыта, мне приходилось на С реализовывать математику работы с 256 битными числами и реализовывать для них мат операции для расчётов на видеокартах. Такая же дичь как начало статьи на хабре.

Obezyan
()
Ответ на: комментарий от X512

моделью памяти Rust на основе владения.

Я ж и пишу, вы дупля не отбиваете в js. Это та же область видимости переменной в block scope куда добавили подсказки-аннотации (lifetime) для компилятора тк он не может как интерпретатор автоматически определять это все сам.

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

Из опыта, мне приходилось на С реализовывать математику работы с 256 битными числами и реализовывать для них мат операции для расчётов на видеокартах. Такая же дичь как начало статьи на хабре.

Что-то я сомневаюсь, что вы на сишечке реализовали собственную математику для 256bit чисел на основе типов. Максимум что вы могли сделать, так это собственное представление и функции вида:

void v_bignum_add(VBigDig *x, const VBigDig *y) {
	unsigned int	i, xs = *x++, ys = *y++, s, carry, t;
	s = xs < ys ? xs : ys;
	for(i = carry = 0; i < s; i++) {
		t = x[i] + y[i] + carry; x[i] = t; carry = t > MAX_DIG;
	}
	for(; carry && i < xs; i++) {
		t = x[i] + carry; x[i] = t; carry = t > MAX_DIG;
	}
}

void v_bignum_sub(VBigDig *x, const VBigDig *y) {
	unsigned int	i, xs = *x++, ys = *y++, s, carry, t;
	if(x == y) {
		v_bignum_set_zero(x - 1);
		return;
	}
	s = xs < ys ? xs : ys;
	for(i = carry = 0; i < s; i++) {
		t = x[i] - y[i] - carry; x[i] = t; carry = t > MAX_DIG;
	}
	for(; carry && i < xs; i++) {
		t = x[i] - carry; x[i] = t; carry = t > MAX_DIG;
	}
}
Эта дичь не такая же, а обычная императивщина.

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

А что ты хотел? Если ты намеренно занимаешься набросом, то какое к тебе отношение?
Ты бы ещё привёл в пример крейт libc, который внезапно является биндингом к сишной стандартной либе.
И бегал бы показывая всем сколько там много unsafe.

Так что смотри внимательнее, на crates.io наверняка есть либы с большим количеством unsafe и не связанные с ffi.
Ты только получше поищи.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от X512

В JavaScript совершенно другое, там владение основано на сборке мусора и обходе ссылок, а не «block scopes».

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

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

привёл в пример крейт libc

люди обозвавшие модуль крейтом социально опасны. на моей памяти, из технического, так называлась корзина, куда вставлялись(и вставляются) электронные модули.

кстати вот

https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B5%D0%B9%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0

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

Путаешь мощную систему типов со сложностью языка?

мощная система типов без ооп… это жалкий кастрат, для оргий и извращений.

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

ктсати, если погулить - «memory leaks in rust» открывается целая страна, полная неожиданностей и приключений.

короче код на русте может запросто течь, и при этом компилятор не сможет ничего найти. и код будет вполне себе safe.

в силу того, что в русте память находится под неким «статически-динамическим» контролем, ни в чем нельзя быть уверенным, и потужное тестирование на утечки - это категорический мастхев в разработке на этом чуде.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)