Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 08:23
Оценка: :))
Пишу программу для микроконтроллера, нужно написать код, который просто будет крутиться в вечном цикле. Т.е. компилироваться в инструкцию b .

В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.

Можно написать for (volatile unsigned unused; ; unused++) {} этот код не выкидывает, но мне не нравится, что он постоянно гоняет трафик между процессором и оперативной памятью, например это может мешать DMA-передачам.

Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?
Отредактировано 16.09.2023 8:25 vsb . Предыдущая версия . Еще …
Отредактировано 16.09.2023 8:24 vsb . Предыдущая версия .
Отредактировано 16.09.2023 8:24 vsb . Предыдущая версия .
Re: Как сделать вечный цикл?
От: Нomunculus Россия  
Дата: 16.09.23 08:28
Оценка: +1
Здравствуйте, vsb, Вы писали:

while (true)
Re: Как сделать вечный цикл?
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.09.23 08:31
Оценка: 16 (1) +3
Здравствуйте, vsb, Вы писали:

vsb>В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.


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

vsb>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?


Нет.

Я бы вставил в цикл пустую ассемблерную вставку. Даже не из nop, а из пустой строки.

Компилятор не понимает этих вставок, но знает, что не понимает, и поэтому не выкидывает.
Re[2]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 08:31
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>while (true)


https://godbolt.org/z/5Gnsxh5cj

armv7-a clang, -Os

int main(void)
{
    while (true);
}


main:


Выкинул цикл.
Re[3]: Как сделать вечный цикл?
От: Нomunculus Россия  
Дата: 16.09.23 08:32
Оценка:
Здравствуйте, vsb, Вы писали:

Может потому что тело цикла пустое?
Виндовый цикл обработки сообщений именно так выглядит
Re[2]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 08:33
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Я бы вставил в цикл пустую ассемблерную вставку. Даже не из nop, а из пустой строки.


Спасибо, так работает, конечно есть опасения, что "завтра" он может стать умней и выкинуть и такой цикл. Я так понимаю, asm это по определению implementation-defined. Ладно, будем надеяться, что хоть такой специальный случай оставят.
Re[4]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 08:34
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Может потому что тело цикла пустое?


Ну да, в этом вопрос и состоит — как написать пустой цикл, чтобы компилятор его не выкидывал при компиляции.
Re[5]: Как сделать вечный цикл?
От: Нomunculus Россия  
Дата: 16.09.23 08:37
Оценка:
Здравствуйте, vsb, Вы писали:

Попробуй два ссылающихся друг на друга goto
Re[3]: Как сделать вечный цикл?
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.09.23 08:37
Оценка:
Здравствуйте, vsb, Вы писали:

Pzz>>Я бы вставил в цикл пустую ассемблерную вставку. Даже не из nop, а из пустой строки.


vsb>Спасибо, так работает, конечно есть опасения, что "завтра" он может стать умней и выкинуть и такой цикл.


Нет, вряд ли. Ему для этого придется научиться понимать ассемблер, а зачем ему это надо?
Re[6]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 08:38
Оценка: 3 (1)
Здравствуйте, Нomunculus, Вы писали:

Н>Попробуй два ссылающихся друг на друга goto


Такое

int main(void)
{
    a: goto b;
    b: goto a;
}


не работает, "оптимизирует".
Re[4]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 08:39
Оценка:
Здравствуйте, Pzz, Вы писали:

vsb>>Спасибо, так работает, конечно есть опасения, что "завтра" он может стать умней и выкинуть и такой цикл.


Pzz>Нет, вряд ли. Ему для этого придется научиться понимать ассемблер, а зачем ему это надо?


РаздражатьУдивлять программистов, конечно, для чего же ещё может понадобиться "оптимизировать" пустые циклы (:
Re: Как сделать вечный цикл?
От: andyp  
Дата: 16.09.23 09:06
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.


Ну так сделай это внутри отдельной функции, скажем forever() в отдельном файле. Для файла оптимизацию выключи. Не лучший варик, но хоть по всей программе не будет расползаться.
Re: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 16.09.23 09:12
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.

Просто выкиньте clang и используйте нормальный компилятор.

Пишется на ассемблере загрузчик, который после инициализации стека и другой фигни
вызывает setup() и потом loop() в бесконечном цикле. Посмотрите на arduino
void setup() {
  //
}
void loop() {
  
}


vsb>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?

да, но для этого отключите е$@нутые оптимизации clang для файла boot.c
void _start() {
  SET_STACK();
  setup();
  for(;;) loop();
}
Re[5]: Как сделать вечный цикл?
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.09.23 09:40
Оценка:
Здравствуйте, vsb, Вы писали:

Pzz>>Нет, вряд ли. Ему для этого придется научиться понимать ассемблер, а зачем ему это надо?


vsb>РаздражатьУдивлять программистов, конечно, для чего же ещё может понадобиться "оптимизировать" пустые циклы (:


Они по дефолту оптимизируются. Чтобы они не оптимизировались, надо специально усилия предпринимать.

P.S. В инструкции к gcc, когда я ее читал последний раз, было написано, что gcc понимает пустой цикл, как такой специальный случай, и сознательно его не оптимизирует.

Похоже, это еще одно знание, утраченное цивилизацией — то ли в clang, то ли вообще...
Re[6]: Как сделать вечный цикл?
От: Нomunculus Россия  
Дата: 16.09.23 09:48
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Похоже, это еще одно знание, утраченное цивилизацией — то ли в clang, то ли вообще...


Как и любое такое знание — из разряда умения постройки пирамид. Утратилось, потому что не нать
Re[7]: Как сделать вечный цикл?
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.09.23 09:56
Оценка: +1
Здравствуйте, Нomunculus, Вы писали:

Pzz>>Похоже, это еще одно знание, утраченное цивилизацией — то ли в clang, то ли вообще...


Н>Как и любое такое знание — из разряда умения постройки пирамид. Утратилось, потому что не нать


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

А если теперь в нем это постепенно отмирает, нафиг он вообще нужен?

Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.
Re: Как сделать вечный цикл?
От: Pavel Dvorkin Россия  
Дата: 16.09.23 10:33
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?


Попробуй

loop : goto loop;
With best regards
Pavel Dvorkin
Re: Как сделать вечный цикл?
От: Alekzander  
Дата: 16.09.23 11:46
Оценка: 1 (1) +3 :)
Здравствуйте, vsb, Вы писали:

vsb>В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.


А на каком, пардон, основании? Бесконечный цикл — это же не if (false). Совсем охренели эти оптимизаторы.
Re[8]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 16.09.23 11:59
Оценка: +2
Здравствуйте, Pzz, Вы писали:

Pzz>Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.

Точно: — У семи нянек детё без глаза.
Re[2]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 12:01
Оценка: :)
Здравствуйте, Pavel Dvorkin, Вы писали:

vsb>>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?


PD>Попробуй


PD>loop : goto loop;


Выкидывает.
Re: Как сделать вечный цикл?
От: reversecode google
Дата: 16.09.23 12:13
Оценка: 3 (1)
https://stackoverflow.com/questions/59925618/how-do-i-make-an-infinite-empty-loop-that-won-t-be-optimized-away
Re[9]: Как сделать вечный цикл?
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.09.23 12:15
Оценка:
Здравствуйте, kov_serg, Вы писали:

Pzz>>Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.

_>Точно: — У семи нянек детё без глаза.

У семи нянек 14 сисек.
Re[2]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 12:18
Оценка:
Здравствуйте, reversecode, Вы писали:

R>https://stackoverflow.com/questions/59925618/how-do-i-make-an-infinite-empty-loop-that-won-t-be-optimized-away


Спасибо, видел, но там толкового решения не нашёл, всё в итоге сводится к asm или нерабочие решения, была надежда, что что-то упустили на SO.
Re[3]: Как сделать вечный цикл?
От: reversecode google
Дата: 16.09.23 12:20
Оценка:
упустили самое важное
отсылки к стандарту
которые там по несколько раз приводили разнцыми цитатами
Re: Как сделать вечный цикл?
От: Muxa  
Дата: 16.09.23 13:24
Оценка:
vsb>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?

https://godbolt.org/z/qnWzvM6eo
Re[8]: Как сделать вечный цикл?
От: Sm0ke Россия ksi
Дата: 16.09.23 13:39
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Нomunculus, Вы писали:


Pzz>>>Похоже, это еще одно знание, утраченное цивилизацией — то ли в clang, то ли вообще...


Н>>Как и любое такое знание — из разряда умения постройки пирамид. Утратилось, потому что не нать


Pzz>Не, пустые циклу не опримизировать таки нать. Вообще, Си всегда был ценен именно тем, что позволял помимо всего прочего делать всякие низкоуровневые вещи. Причем хорошо вписанные в более высокоуровневую канву сишной программы.


Pzz>А если теперь в нем это постепенно отмирает, нафиг он вообще нужен?


Pzz>Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.


Может просто пофиксить компилятор? Разве стандарт языка позволяет выкидывать пустые циклы?
Re[2]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 16.09.23 13:41
Оценка:
Здравствуйте, Muxa, Вы писали:

vsb>>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?


M>https://godbolt.org/z/qnWzvM6eo


Я так понял, разница в том, что у меня был C++, а в этом примере C. Это обусловлено разницей в стандартах или в clang для C прописано исключение?
Re[9]: Как сделать вечный цикл?
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.09.23 13:50
Оценка:
Здравствуйте, Sm0ke, Вы писали:

Pzz>>Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.


S>Может просто пофиксить компилятор? Разве стандарт языка позволяет выкидывать пустые циклы?


Ну если они без побочных эффектов, окромя того, что процессор делом занимают, почему нет?

Я вообще не удивлюсь, если в нонешнем стандарте нескончаемый цикл без побочных эффектов — это UB. Лень смотреть...
Re[3]: Как сделать вечный цикл?
От: Muxa  
Дата: 16.09.23 13:52
Оценка: 14 (1)
vsb>>>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?
M>>https://godbolt.org/z/qnWzvM6eo
vsb>Я так понял, разница в том, что у меня был C++, а в этом примере C. Это обусловлено разницей в стандартах или в clang для C прописано исключение?

Так ты вроде и просил на С изначально.
Чем обусловлено
Я сам удивлен, но из всех компиляторов что я проверил только clang++ выкидывает такой цикл. Причем это только на транке, стабильные релизы не выкидывают.
ПС: хотя если еще проверить неармовые версии clang++, то начиная с 13-ой версии выкидывает цикл.
Отредактировано 16.09.2023 14:08 Muxa . Предыдущая версия . Еще …
Отредактировано 16.09.2023 13:56 Muxa . Предыдущая версия .
Re: .
От: Sm0ke Россия ksi
Дата: 16.09.23 15:35
Оценка: -1 :))
Почему компиляторы не следуют стандарту?

consteval функцию нельзя вызывать в run time
но это компилируется и работает ... link

#include <iostream>

consteval bool fn()
{
  return true;
}

int main()
{
  //static constinit
    bool b = fn();
  std::cout << b << '\n';
  return 0;
}
Re: Как сделать вечный цикл?
От: CRT  
Дата: 16.09.23 16:05
Оценка:
https://stackoverflow.com/questions/59925618/how-do-i-make-an-infinite-empty-loop-that-won-t-be-optimized-away
Re[2]: Как сделать вечный цикл?
От: reversecode google
Дата: 16.09.23 16:07
Оценка:
https://rsdn.org/forum/cpp/8600551.1
Автор: reversecode
Дата: 16.09.23

ох уж этот ктыв, все писаки ни одного читаки
Re[3]: Как сделать вечный цикл?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.09.23 19:27
Оценка:
Здравствуйте, vsb, Вы писали:

R>>https://stackoverflow.com/questions/59925618/how-do-i-make-an-infinite-empty-loop-that-won-t-be-optimized-away


vsb>Спасибо, видел, но там толкового решения не нашёл, всё в итоге сводится к asm или нерабочие решения, была надежда, что что-то упустили на SO.


А чем asm не нравится, если это asm с пустым телом?
Ну вставь atomic_signal_fence(memory_order_seq_cst), это по сути то же самое, но без слова asm.
The God is real, unless declared integer.
Re[10]: Как сделать вечный цикл?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.09.23 19:28
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Я вообще не удивлюсь, если в нонешнем стандарте нескончаемый цикл без побочных эффектов — это UB.


Да.
The God is real, unless declared integer.
Re[2]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 16.09.23 19:35
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>А на каком, пардон, основании? Бесконечный цикл — это же не if (false). Совсем охренели эти оптимизаторы.

До многих это доходит медленно. Современный C++ полон таких подстав. И что самое интересно многие с пеной у рта яростно защищают такое положение дел тыкая носом в стандарт. Похоже там есть яркие представители нетрадиционной ориентации логики и именно они имеют решающий голос в таких вопросах.
Re: Как сделать вечный цикл?
От: Кодт Россия  
Дата: 16.09.23 21:53
Оценка: +1
Здравствуйте, vsb, Вы писали:

vsb>В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.

vsb>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?

Согласно стандарту, вечный цикл без побочных эффектов — это неопределённое поведение.
Поэтому компилятор его и выкидывает: имеет полное право

А какой смысл микроконтроллеру полностью нагрузить ядро?
Там нет какой-нибудь инструкции типа halt, которая повесила бы процессор в ожидание прерываний?
Перекуём баги на фичи!
Re[2]: Как сделать вечный цикл?
От: andyp  
Дата: 16.09.23 22:39
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Согласно стандарту, вечный цикл без побочных эффектов — это неопределённое поведение.


Вопрос про С был — там имхо это не так.
Re[2]: Как сделать вечный цикл?
От: cppguard  
Дата: 17.09.23 00:08
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К>А какой смысл микроконтроллеру полностью нагрузить ядро?

Удваиваю вопрос. Сам уже полгода въезжая в тему микроконтроллеров, и пока не было нужды добавлять вечный безусловный цикл. Тихая оптимизация это, конечно, зло, стоило бы добавить предупреждение и для особо упоротых упорных добавить флаг -Wno-empty-loop.
Re[3]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 17.09.23 00:41
Оценка:
Здравствуйте, cppguard, Вы писали:

К>>А какой смысл микроконтроллеру полностью нагрузить ядро?

C>Удваиваю вопрос. Сам уже полгода въезжая в тему микроконтроллеров, и пока не было нужды добавлять вечный безусловный цикл. Тихая оптимизация это, конечно, зло, стоило бы добавить предупреждение и для особо упоротых упорных добавить флаг -Wno-empty-loop.

Очевидно же для отладки или для ожидании watchdog-а.
Re[2]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 17.09.23 00:48
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Согласно стандарту, вечный цикл без побочных эффектов — это неопределённое поведение.

Именно поэтому этот стандарт хочется выкинуть к чертовой матери.

К>Поэтому компилятор его и выкидывает: имеет полное право

Вскоре ему стандарт разрешит убивать людей и вот тогда он оторвётся по полной

К>А какой смысл микроконтроллеру полностью нагрузить ядро?

Точка ожидания отладчика, watchdog-а или ядра прогревают для проверки теплоотвода, выход по переключению контекста в прерывании.

К>Там нет какой-нибудь инструкции типа halt, которая повесила бы процессор в ожидание прерываний?

di
hlt

В некоторых DSP-никах после выполнения операции еще надо пару нопов добавлять иначе не работает. Или еще несколько команд после ret могут исполнят
А компилятор понимаешь всё малину с ног наголову переворачивает, зато по стандарту. Вместо того что бы помогать, он гадит.
Re[3]: Как сделать вечный цикл?
От: flаt  
Дата: 17.09.23 02:56
Оценка: :)
Здравствуйте, kov_serg, Вы писали:

_>

_>В некоторых DSP-никах после выполнения операции еще надо пару нопов добавлять иначе не работает. Или еще несколько команд после ret могут исполнят

То есть, старая шутка про ассемблер

jmp X
jmp X  ; если вдруг первый jmp не сработает


для некоторых — совсем не шутка?
Re[3]: Как сделать вечный цикл?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.09.23 05:14
Оценка:
Здравствуйте, kov_serg, Вы писали:

К>>Там нет какой-нибудь инструкции типа halt, которая повесила бы процессор в ожидание прерываний?

_>
_>di
_>hlt
_>


Хм, просили _в ожидание_ прерываний...

_>В некоторых DSP-никах после выполнения операции еще надо пару нопов добавлять иначе не работает. Или еще несколько команд после ret могут исполнят


Delay slots?
The God is real, unless declared integer.
Re[4]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 17.09.23 09:16
Оценка:
Здравствуйте, flаt, Вы писали:

F>
F>jmp X
F>jmp X  ; если вдруг первый jmp не сработает 
F>


F>для некоторых — совсем не шутка?

Да особенно если микроконтроллер работает в сильных радиационных полях. Сбои довольно частое явление.
Re[2]: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 17.09.23 09:39
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А какой смысл микроконтроллеру полностью нагрузить ядро?


Это проще всего. Подключен он к компьютеру, потребляет доли ватта, не нагревается ни на сколько.

К>Там нет какой-нибудь инструкции типа halt, которая повесила бы процессор в ожидание прерываний?


Есть, но на моём китайском клоне STM32 эта инструкция "кирпичит" процессор, делая его недоступным для отладчика. Поэтому такую инструкцию в релизный билд ещё в теории можно засунуть, для феншуя, но в процессе разработки неудобно.
Re[5]: Как сделать вечный цикл?
От: graniar  
Дата: 17.09.23 11:01
Оценка:
Здравствуйте, kov_serg, Вы писали:

F>>jmp X ; если вдруг первый jmp не сработает

F>>для некоторых — совсем не шутка?
_>Да особенно если микроконтроллер работает в сильных радиационных полях. Сбои довольно частое явление.

Ну так там тогда много где переглючить может, sub вместо add и тп. Такое только избыточностью процессорной архитектуры можно пытаться решать, а никак не задваиванием инструкций.
Re[6]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 17.09.23 13:01
Оценка:
Здравствуйте, graniar, Вы писали:

G>Ну так там тогда много где переглючить может, sub вместо add и тп. Такое только избыточностью процессорной архитектуры можно пытаться решать, а никак не задваиванием инструкций.

Вообще дублированием подсистем решают.
Re[3]: Как сделать вечный цикл?
От: σ  
Дата: 17.09.23 15:42
Оценка:
A>Вопрос про С был — там имхо это не так.

http://port70.net/~nsz/c/c11/n1570.html#6.8.5p6 почти так
Re[4]: Как сделать вечный цикл?
От: andyp  
Дата: 17.09.23 17:59
Оценка:
Здравствуйте, σ, Вы писали:

σ>http://port70.net/~nsz/c/c11/n1570.html#6.8.5p6 почти так


Почти так, но не совсем.

while(true) и for(,,) имхо являются циклами, управляющее выражение которых является константой и они не должны съедаться оптимизатором.

Является ли такое ub в С я честно говоря хз, но микроконтроллерный народец точно на такое прищурится.
Re[6]: Как сделать вечный цикл?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.09.23 06:13
Оценка:
Здравствуйте, graniar, Вы писали:

G>Ну так там тогда много где переглючить может, sub вместо add и тп. Такое только избыточностью процессорной архитектуры можно пытаться решать, а никак не задваиванием инструкций.


SystemZ ещё со времён IBM 370 решает проблемы именно задваиванием инструкций (аппаратно — в коде один экземпляр, а выполняется два раза подряд), тотальным сквозным контролем целостности данных — чётность плюс коды Хоффманна, и RAIM (как RAID, но на оперативной памяти) на памяти. Я думаю, их авторитету тут можно доверять.
The God is real, unless declared integer.
Re[5]: Как сделать вечный цикл?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.09.23 06:30
Оценка:
Здравствуйте, kov_serg, Вы писали:

F>>
F>>jmp X
F>>jmp X  ; если вдруг первый jmp не сработает 
F>>


F>>для некоторых — совсем не шутка?

_>Да особенно если микроконтроллер работает в сильных радиационных полях. Сбои довольно частое явление.

Там или несколько параллельно работающих блоков, или аппаратное выполнение дважды одной и той же одиночной инструкции (как ни странно, вполне себе не "космическая" SystemZ).

А вот где такое я реально видел — в драйвере HPET (сейчас что-то не нашёл). Один регистр ставится дважды подряд. Но это специфика данного устройства, которое сделали внутри максимально асинхронным с одновременно двумя тактовыми частотами.
The God is real, unless declared integer.
Re[4]: Как сделать вечный цикл?
От: andyp  
Дата: 18.09.23 11:08
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Очевидно же для отладки или для ожидании watchdog-а.


... или если вся работа выполняется в обработчиках прерываний.
Re[5]: Как сделать вечный цикл?
От: cppguard  
Дата: 18.09.23 11:59
Оценка:
Здравствуйте, andyp, Вы писали:

A>... или если вся работа выполняется в обработчиках прерываний.


Для этого существуют разные уровни засыпаний.
Re[6]: Как сделать вечный цикл?
От: andyp  
Дата: 18.09.23 12:30
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Для этого существуют разные уровни засыпаний.


... которые не имеет смысла использовать в куче сценариев.
Re[3]: Как сделать вечный цикл?
От: Alekzander  
Дата: 18.09.23 12:53
Оценка:
Здравствуйте, kov_serg, Вы писали:

A>>А на каком, пардон, основании? Бесконечный цикл — это же не if (false). Совсем охренели эти оптимизаторы.

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

Я читал статью под названием C must die (или как-то так). Несмотря на провокационное название, статья была исключительно по делу и как раз про оптимизаторов, которые отобрали контроль у низкоуровневых разработчиков.

Ссылку сейчас не найду, но может, кто-то помнит.
Re[4]: Как сделать вечный цикл?
От: B0FEE664  
Дата: 18.09.23 15:46
Оценка:
Здравствуйте, reversecode, Вы писали:

R>упустили самое важное

R>отсылки к стандарту
R>которые там по несколько раз приводили разнцыми цитатами

Да там не понятно, то ли это С++, то ли это C...
И каждый день — без права на ошибку...
Re[2]: Как сделать вечный цикл?
От: B0FEE664  
Дата: 18.09.23 15:54
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Согласно стандарту, вечный цикл без побочных эффектов — это неопределённое поведение.

Почему именно неопределённое поведение, а не ошибка компиляции?
И каждый день — без права на ошибку...
Re[4]: Как сделать вечный цикл?
От: sergii.p  
Дата: 19.09.23 09:40
Оценка: 3 (1) -1
Здравствуйте, Alekzander, Вы писали:

A>Я читал статью под названием C must die (или как-то так). Несмотря на провокационное название, статья была исключительно по делу и как раз про оптимизаторов, которые отобрали контроль у низкоуровневых разработчиков.

A>Ссылку сейчас не найду, но может, кто-то помнит.

оно?
https://veresov.pro/cmustdie/

Ну идея явно провокационная. Особенно сейчас. Лет 15 назад я бы встал на сторону "людей", но сейчас только на стороне "машин". Человек не в состоянии уследить за всеми граблями. Если человек не может правильно проверить переполнение так нефиг писать на С, пиши на Rust.
Re[5]: Как сделать вечный цикл?
От: kov_serg Россия  
Дата: 19.09.23 10:43
Оценка: +1
Здравствуйте, sergii.p, Вы писали:

SP>https://veresov.pro/cmustdie/


SP>Если человек не может правильно проверить переполнение так нефиг писать на С

Дело в что помимо синтаксиса языка, человеку надо держать в уме как правильно по этикету стандарту объяснить компилятору тривиальные вещи.
Вообще люди похоже стали забывать для чего изначально компилятор был нужен и мы наблюдаем развитие карго-культа оптимизаций ради оптимизаций.
Re: Как сделать вечный цикл?
От: vsb Казахстан  
Дата: 19.09.23 13:02
Оценка: 72 (1)
Резюмируя:

Пустой цикл в языке C не должен оптимизироваться. Пустой цикл в языке С++ может оптимизироваться.

Моё предположение было основано на том, что я в godbolt использовал C++, не подумав о том, что в этом моменте семантика у C и C++ отличается. Если в godbolt выбрать С, то пустой цикл не убирается.

Цитаты из стандартов:

C17 6.8.5: An iteration statement may be assumed by the implementation to terminate if its controlling
expression is not a constant expression

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

C++20 6.9.2.2: The implementation may assume that any thread will eventually do one of the following: terminate.

This is intended to allow compiler transformations such as removal of empty loops, even when
termination cannot be proven

Т.е. тут всё явно написано, пустые циклы надо убирать.
Re[3]: Как сделать вечный цикл?
От: Кодт Россия  
Дата: 19.09.23 14:51
Оценка:
Здравствуйте, B0FEE664, Вы писали:

К>>Согласно стандарту, вечный цикл без побочных эффектов — это неопределённое поведение.

BFE>Почему именно неопределённое поведение, а не ошибка компиляции?

Синтаксически-то программа корректная.
Другое дело, что компилятор может распознавать и выдавать варнинг, который следует эскалировать до ошибки.
Перекуём баги на фичи!
Re[5]: Как сделать вечный цикл?
От: Alekzander  
Дата: 21.09.23 19:20
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>оно?

SP>https://veresov.pro/cmustdie/

Да.
Re: Как сделать вечный цикл?
От: reversecode google
Дата: 16.10.23 05:15
Оценка:

Я — Озимандия, я — мощный царь царей! Взгляните на мои великие деянья, Владыки всех времён, всех стран и всех морей!

P2809R2
Trivial infinite loops are not Undefined Behavior
Published Proposal, 2023-10-14
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2809r2.html

Re[5]: Как сделать вечный цикл?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.10.23 05:33
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>Ну идея явно провокационная. Особенно сейчас. Лет 15 назад я бы встал на сторону "людей", но сейчас только на стороне "машин". Человек не в состоянии уследить за всеми граблями.


Именно поэтому надо ему помогать.

SP> Если человек не может правильно проверить переполнение так нефиг писать на С, пиши на Rust.


Вы бредите.
Перевести на Rust в сотню раз дороже, чем ввести в стандарт и все компиляторы выключение диверсионных фич там, где они не нужны, по явному запросу.
(Хотя лучше, наоборот, включение по явному запросу. Но это уже дело умолчаний компиляторов.)
А не нужны они в 95% кода практически любой программы.

Сейчас с этим кое-как справляются настройки уровня оптимизации, но это слишком грубо и непереносимо.
The God is real, unless declared integer.
Re[6]: Как сделать вечный цикл?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 16.10.23 05:37
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Вообще люди похоже стали забывать для чего изначально компилятор был нужен и мы наблюдаем развитие карго-культа оптимизаций ради оптимизаций.


Почти так, но это скорее не карго-культ, а перетягивание каната, кто больше привлечёт денег за счёт того, что на пару процентов выходной код скорее, чем у конкурента, и в ком будут первым испытаны новые идеи.
Между GCC и Clang/LLVM происходит именно это, а всякие Phoronixʼы этому активно помогают.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.