LINUX.ORG.RU

Всё, поцоны, выкидываем Rust – у Бьярне есть план...

 ,


1

6

…по повышению безопасности в С++

Решение Бьярне Струструпа по повышению безопасности в С++ опирается на концепцию «профилей». Это наборы правил, при соблюдении которых достигаются определенные гарантии безопасности. Профили будут определены в стандарте ISO C++ и будут касаться таких распространенных проблем безопасности, как указатели, диапазоны массивов и т.д.

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

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

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

Струструп также отметил, что сообщество может внести свой вклад в доработку этих профилей и формализацию их спецификаций. Для этого он создал репозиторий на GitHub.

https://thenewstack.io/bjarne-stroustrups-plan-for-bringing-safety-to-c/



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

Ответ на: комментарий от Dr64h
2023-10-30 17:24 -0700 Richard Smith      Support for `as` expressions. (#3348)
2023-10-30 11:11 -0700 Jon Ross-Perkins   Add partial raw identifier support. (#3344)
2023-10-27 18:00 -0700 Richard Smith      Diagnose attempts to copy a non-copyable type. (#3345)
2023-10-27 17:55 -0700 Richard Smith      Allow fields to be reordered in struct initialization. (#3346)
2023-10-27 13:47 -0700 josh11b            Expand comments in `enum_base.h` (#3315)
2023-10-27 13:41 -0700 Richard Smith      Support for type-checking and lowering method calls. (#3343)
...
dataman ★★★★★
()

Очень интересно когда хотя бы 50% программирующих на C++ смогут пользоваться этим на каждодневной основе.

Предположу, что не раньше, чем через 10 лет. А то и 15.

Вспоминается с какой помпой презентавалась GSL (C++ Core Guidelines Support Library). Уже лет 6 прошло, что-то не доводилось слышать/видеть, чтобы каждый второй ее использовал.

А еще было мега-предложение Герба Саттера про deterministic exceptions. Года эдак три или четыре назад. Вроде как застряло в процессе стандартизации (хотя касательно этого предложения может оно и к лучшему).

В общем, один из главных вопросов – когда? А то вот pattern matching-а уже сколько лет ждем-с… :(

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

Когда вводили модули был разговор о том, а давайте в модулях сделаем что-то вроде «поколений» из Rust-а (или как там Rust-овские «editions» правильно на русский перевести). Типа, в начале модуля указываем в какой редакции пишем код внутри модуля и компилятор бьет по рукам за попытки использовать что-то вне редакции.

Тогда была бы возможность делать новые подмножества C++ (в том числе и выбрасывая из C++ устаревшее и небезопасное) и контролируемо использовать эти подмножества.

Но не взлетело.

Совместимость важнее.

Ну и как-то с тезисом про совместимость сложно спорить.

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

Ну и как-то с тезисом про совместимость сложно спорить.

Да не, нихрена не сложно. Просто объявляем, что в модулях будет новый C++ под названием C++++, а все несогласные идут в лес и совокупляются с медведями, либо используют старый вариант. Со временем, лет через 10, старый C++ отмирает и остаётся только в страшных кошмарах^W^Wдревнем коде на поддержке.

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

Первый же пример с карбоном энтим:

// C++:
#include <math.h>
#include <iostream>
#include <span>
#include <vector>

struct Circle {
  float r;
};

void PrintTotalArea(std::span<Circle> circles) {
  float area = 0;
  for (const Circle& c : circles) {
    area += M_PI * c.r * c.r;
  }
  std::cout << "Total area: " << area << "\n";
}

auto main(int argc, char** argv) -> int {
  std::vector<Circle> circles = {{1.0}, {2.0}};
  // Implicitly constructors `span` from `vector`.
  PrintTotalArea(circles);
  return 0;
}

vs

// Carbon:
package Geometry api;
import Math;

class Circle {
  var r: f32;
}

fn PrintTotalArea(circles: Slice(Circle)) {
  var area: f32 = 0;
  for (c: Circle in circles) {
    area += Math.Pi * c.r * c.r;
  }
  Print("Total area: {0}", area);
}

fn Main() -> i32 {
  // A dynamically sized array, like `std::vector`.
  var circles: Array(Circle) = ({.r = 1.0}, {.r = 2.0});
  // Implicitly constructs `Slice` from `Array`.
  PrintTotalArea(circles);
  return 0;
}
cocucka_B_TECTE
() автор топика
Ответ на: комментарий от GAMer

А что там сейчас с cppfront?

https://herbsutter.com/2023/09/28/cppfront-autumn-update/

Выступление на CppCon-2023 (сам еще не смотрел): https://www.youtube.com/watch?v=fJvPBHErF2U

Каковы вообще перспективы взлететь?

ХЗ, сам Саттер его вроде как чистым экспериментом называет без каких-либо планов и ориентиров по срокам.

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

А может просто выкинуть из C++ всё лишнее говно и сделать unsafe{} блоки?

А вот нельзя сделать профиль Go для C#?

Чтобы вместо отправления нубов в крысятник с гадюками, они бы использовали нормальный ЯП.

Выбираем (или убираем) в профиле нужные фичи:

  • Наследование (нет в GO)
  • Исключения (нет в GO)
  • Нововведения последних 5-10 лет, перегрузившие C# до уровня напоминающего немного C++ своим обилием и разнообразием.

Чтобы если всё поотключать, то получился бы такой же нубский Go, только с нормальным человеческим синтаксисом.

Btw. современный C# умеет в AOT compilation бинарных сборок для контейнеров и в нём есть каналы для обмена сообщениями (в виде либы).

А то что, в C# async вместо goрутин, IMHO не такая уж и беда. Тем более Microsoft уже присматривается к greenthreads, но пока вроде бы не одобряет из-за трудоёмкости перелопачивания своих либ.

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

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

Потому что могут?

Вот что вам мешает сделать так же, но лучше?

Делаем, в C3. :)
Недавно вот интерфейсы запилили.

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

Да не, нихрена не сложно.

На Reddit-е когда большой срач был. Вроде как там в камментах много аргументов и за, и против было.

Вроде бы вот это вот все:

https://vittorioromeo.info/index/blog/fixing_cpp_with_epochs.html – с чего началось

https://www.reddit.com/r/cpp/comments/clcz08/fixing_c_with_epochs/ – обсуждение на reddit-е

К сожалению, уже не помню где видел комментарии от членов комитета по этому поводу с вердиктом «не бывать этому» :(

eao197 ★★★★★
()

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

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

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

cppfront:

main: () -> int = {
    v: std::vector<int> = (1, 2, 3, 4, 5);
    print_subrange(v, 1, 13);
}

print_subrange: (rng:_, start:int, end:int) = {
    [[assert Bounds: 0 <= start]]
    [[assert Bounds: end <= rng.ssize()]]

    count := 0;
    for  rng
    next count++
    do:  (i:_) =
        if start <= count && count <= end {
            std::cout << i << "\n";
        }
}

#include <vector>
#include <span>
#include <iostream>
dataman ★★★★★
()
Ответ на: комментарий от eao197

На Reddit-е когда большой срач был.

Reddit – это помойка. Ты бы ещё срач на ЛОРе аргументом привёл.

К сожалению, уже не помню где видел комментарии от членов комитета по этому поводу с вердиктом «не бывать этому» :(

Так это ж комитет. Они никогда ничего не могут.

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

А вот нельзя сделать профиль Go для C#?

Чтобы вместо отправления нубов в крысятник с гадюками, они бы использовали нормальный ЯП.

Так Go или нормальный ЯП? Потому что это разные вещи.

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

У меня горит от 100500 вариации синтаксиса вида «мы знаем как лучше». Все такие оригиналы, прям тошно.

Я бы ещё понял, если бы язык был другой идиоматически. Но менять идентификаторы auto на val, объявлять функцию ключевым словом fn и т.д. Выглядит забавой ради забавы. Потом сидишь и вспоминаешь, как в очередной поделке объявлять класс.

cocucka_B_TECTE
() автор топика
Ответ на: комментарий от hateyoufeel

Так Go или нормальный ЯП? Потому что это разные вещи.

IMHO даже если C# урезать до уровня Go, то всё же получится более приятная Bash like палата, хоть и со смирительной рубашкой, но хотя бы без крыс и гадюк. В смысле синтаксис останется нормальным и нубам будет легче потом апгрейдиться до C# с полным ООП и исключениями. Кроме того они уже и с либами .NET познакомятся. Зачем калечить людей общением с оригинальным Golang?

https://tour.ardanlabs.com/tour/eng/static/img/ardan-labs-go-tour-banner.png

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

А зачем его урезать?

А зачем был создан Golang?

Это по сути язык работодателей, который заставляет кодеров кодить строго примитивно в определённом форватере очень низкого порога вхождения для других вкатунов, чтобы кодеры были абсолютно легко взаимозаменямы?

sanyo1234
()
Ответ на: комментарий от dataman
Key Features of V

    Simplicity: the language can be learned over the course of a weekend
    Fast compilation: ≈110k loc/s with a Clang backend, ≈500k loc/s with native and tcc backends (Intel i5-7500, SSD, no optimization) (demo video)
    Easy to develop: V compiles itself in less than a second
    Performance: as fast as C (V's main backend compiles to human-readable C)
    Safety: no null, no globals, no undefined behavior (wip), immutability by default
    C to V translation (Translating DOOM demo video)
    Hot code reloading
    Flexible memory management. GC by default, manual via v -gc none, arena allocation via v -prealloc, autofree via v -autofree (autofree demo video).
    Cross-platform UI library
    Built-in graphics library
    Easy cross-compilation
    REPL
    Built-in ORM
    Built-in web framework
    C and JavaScript backends
    Great for writing low-level software (Vinix OS)
sanyo1234
()
Ответ на: комментарий от sanyo1234

Ёпрст, сейчас свой язык сделать как два пальца об асфальт. Диды годами пыхтели, а сейчас хипсторы за уикенд новый модный язычок на базе LLVM выкатывают. Один другого краше.

cocucka_B_TECTE
() автор топика