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
() автор топика
Ответ на: комментарий от anonymous

Ну, с другой стороны , в эмбеде в основном - Си, а вСи вышеописанное - не UB.

А что, уже asm(««) для компилятора Си++ не преграда для агрессивной оптимизации? Ну суньте в свой бесокнечный while(1) внутрь еще какой-нибудь volatile asm(»») да и дело с концом: если оптимизатор такой цикл выкинет - смело пишите новый issue/ticket им в багтрекер.

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

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

Вохмлжно это уже писали, но мне лень читать 6 страниц постов, извините, если баян:

Фундаментальное отличие стандарта Си от стандарта Си++ : в Си++ гарантируется прогресс. Зачем и как было продавлено данное решение - это уже другой вопрос. Гарантия прогресса не подразумевает бесконечных циклов. Вот и весь сказ.

Да, бесконечный цикл ИМЕЕТ сайд-эффекты.

Убрали UB в новом стандарте, в частности , из-за идиомы:

...
...
terminate_program();
/* This code is unreached, but just in case .... */
while (1) {
}
..
..

Такие затычки встречаются часто. Особенно - в embedded.

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

Мне было бы интересно посмотреть, какие именно оптимизации срабатывают при изнасиловании кода с while(true);

В основном - loop elimination, второе по частоте - instruction reordering: компилятор, исходя из предположения, что цикл когда-то да закончится, может переместить какой-то код из - «после цикла» в «до цикла»

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

пометился в важном треде, хорошо когда в c++ становиться меньше ub, это должно способствовать сохранению серых котят на серых дорогах на американских континентах

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

В основном - loop elimination, второе по частоте - instruction reordering: компилятор, исходя из предположения, что цикл когда-то да закончится, может переместить какой-то код из - «после цикла» в «до цикла»

Так вопрос в том, а какой реальный это эффект даёт в коде, бенчмарки, а не на бумаге.

Есть языки без таких приколов и ничего - живут.

в Си++ гарантируется прогресс. <…> Гарантия прогресса не подразумевает бесконечных циклов.

Не совсем так. Гарантия прогресса не подразумевает бесконечных циклов без сайд-эффектов.

Но вообще-то расходящееся вычисление (которое никогда не возвращает управление) - вполне себе заслуживает явной спецификации.

Если бы компилятор проводил свои хитрые оптимизации только для циклов, для которых он может доказать завершимость – никто бы не помер и так. Тормоза в коде не из-за этого возникают.

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