Pull to refresh

Comments 15

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

В RFC пишут об обратном: "The proposed Safe C++ should be a pure subset of ISO C++ except few ignorable pragma and attributes. So that other compilers which don’t support the extension can compile the codes accepted by Safe C++."

https://discourse.llvm.org/t/rfc-a-clangir-based-safe-c/83245

Я правда тоже пока не gонял как они собираются делать совместимость в сложных примерах а не приведенных демках. Но вроде как это объявлено целью.

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

Совместимость есть в примерах из RFC (вторая ссылка), как это объединять с первой будут мне тоже не понятно, о чем тоже написал.

тут смотря что еще понимать под легаси если легаси С то есть моменты (например операторы дальше я пока сам наглядно не сталкивался)

Скрытый текст
vec2 t(vec2 x)
{
  return x-1*2+100;//не заработает в С
}

тут как бы напрашивается момент где начинается граница ошибок

если стандарты языка С++, то вроде просто надо выбрать стандарт и в него компилировать (но я когда писал компилировал старый код в 23 стандарт и пользовался не всеми преимуществами стандарта - писал на шаблонах + наследование, ну стандартный С++ как мне кажется, с доступными штуками - там вроде всё тривиально, а вот по статье по ссылке где пишут что С++ не безопасен я смотрел ее и никогда не думал так писать - двоякое ощущение), мне лично показалось когда видел ту статью что так можно где угодно ошибки найти

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

Windows.h линкуется собирается с 23 стандартом и вы даже brush сможете вызвать и воспользоваться и другими вызовами, где легаси, где опасность, в чем там проблемы я пока не понял

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

Предложенный подход в пределе означает реализовать borrow checker для C++ (имеется в виду анализатор схожей мощности). Вряд ли много компаний-пользователей компилятора способны написать такое сложное расширение (это мягко говоря). Если оно будет написано, скорее всего, удобнее будет интегрировать эти наработки в апстрим, чтобы упростить поддержку.

а какой конкретный пример есть на этот счет? может сервер - web не сможет работать с обращениями и будет что сбой? или что произойдёт, что конкретно в race condition плохого у С++?

может легаси не соберётся в чем там проблема можно пример?

у меня есть пример возможно плохой

		thread = SDL_CreateThread(TestThread, "TestThread", (void *)NULL);

		SDL_WaitThread(thread, &threadReturnValue);

я запускал 2-3 окна игроки рендерились

это код дедикейтед сервера

Всё упирается в то что все постоянно пытаются выстроить жесткую систему. А жесткие системы они всегда хрупкие. И чем жестче вы будете контроль тем "веселее" и масштабнее будут разрушения. А если еще учесть что язык позволяет использовать противоречащую здравому смыслу логику для оптимизаций, то язык может и будет безопасным, но всегда будет способен неприятно удивить.

Это решает одну и туже задачу с помощью одних и тех же инструментов (аннтоации).

Но Саттер настаивает на добавления новых аннотаций в стандарт, тогда как мне кажется, что уже С++20 возможностей достаточно для реализации предложенной концепции.

Язык позволяет записать любые данные по любому адресу, это база. Запретите это, и это будет уже не C++. А вы "ошибки", "ошибки"...

Не совсем понял, что вы имеете в виду под "необходимость синхронно поддерживать и использовать одни и те же режимы компиляции исходных текстов программ" в той части, где пишете про использование статического анализа?

Google, например, не смотря на стратегию перехода на Memory safe языки (e.g. Rust) в новых проектах продолжает развивать сторонние инструменты, делающие разработку на C++ более безопасной.

У С и С++ исторически сложились сложные отношения с препроцессором. В зависимости от параметров его работы исходный код компилируемой программы может быть трансформирован самым неожиданным образом. И самое плохое, что подобные трансформации кода могут зависеть от встроенных в компилятор препроцессорных определений, версий языка или даже названия самого компилятора.

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

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

Sign up to leave a comment.

Articles