LINUX.ORG.RU

В C++ становится меньше UB

 , ,


2

5

Привет, чят!

В общем, сабж. Начиная с C++26 тривиальные бесконечные циклы больше не будут неопределённым поведением.

Пример такого цикла:

int main() {
  while(true) ;
}

При этом, если в теле цикла содержится выражение или условие цикла не является константным выражением, приводимым к true, то такой цикл всё ещё будет вызывать неопределённое поведение программы:

int main() {
  // UB
  while(true) {
    (void) "Hello LOR!";
  }
}
int main() {
  // UB
  bool done = false;
  while(!done) {}
}
int main() {
  // Тоже UB
  while (true) if constexpr (false) break;
}

И так далее. Как всегда, в C++ что-то починили, по сути ничего не починив. Так и живём, чят.

Ссылка с подробностями: https://www.sandordargo.com/blog/2026/09/16/cpp26-trivial-infinite-loops



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

По-моему, вот тут я читал https://blog.llvm.org/2011/05/what-every-c-programmer-should-know_21.html

Обратите внимание, 2011 год, весь наш тред уже был обсосан 15 лет назад, за это время появился раст, а тут всё ещё не верят, что Си такой, какой он есть.

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

По-моему, вот тут я читал https://blog.llvm.org/2011/05/what-every-c-programmer-should-know_21.html

Я это тоже читал и не раз. Там нет чисел. Там просто показаны три с половиной вырожденных случая, вынутых из какой-то клоаки. Общей статистики там нет, потому что, как я прозреваю, её тупо никто не собирал. Сишноплюсовики просто засунули головы в жопы и изредка верещат оттуда что-то про «оптимизации-оптимизации-оптимизации». На их фоне тот древний видос с Балмером, прыгающим с мокрой от пота рубашке и орущим «DEVELOPERS DEVELOPERS DEVELOPERS», выглядит прилично и адекватно.

за это время появился раст

Вот именно. За это время появился Rust, показавший, что для 98% объёма кода эти оптимизации вокруг UB нахрен не всрались для достижения такой же производительности. Причём, что забавно, он использует тот же бек и во многом тот же движок оптимизаций что и один из ведущих компиляторов плюсов, на который тут жалуются что он мол код портит.

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

Тот же бэк, но с другой семантикой, передаваемой бэку. Чо дизайнеры самого компилятора языка наворотили в семантике, то и компилирует. Бэк неуиноватый.

Однако впрочем бесконечный loop тоже какое-то время был сломан в Расте, если я не путаю.

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

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

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

Тот же бэк, но с другой семантикой, передаваемой бэку. Чо дизайнеры самого компилятора языка наворотили в семантике, то и компилирует. Бэк неуиноватый.

Не совсем. Бэк изначально пилился под C++ и очень многие костыл^Wинварианты относительно плюсов туда были заложены. Например, …

Однако впрочем бесконечный loop тоже какое-то время был сломан в Расте, если я не путаю.

… вот это вот самое. Причём не единожды. Вот в этом треде как раз указаны несколько разных случаев, когда в Rust бесконечный цикл был сломан.

yorshka
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария