Пример с использованием __attribute__((cleanup (...) )) неправильный. Запуск такого кода завершится падением программы. Будет даже warning: attempt to free a non-heap object
> Думаю, это состояние знакомо многим и не зависит от языка.
На самом деле очень даже зависит. Я, например, пишу в основном на Си, и не могу себе представить ситуацию вида
Кто я такой? Я программист на плюсах. Я пишу код на плюсах две трети жизни. Это действительно стало огромной частью моей самоидентификации. Почему я претендую на синиора? Потому что я успел отстрелить себе миллион ног и натаскать свою нейросеть в черепушке определять, какая нога отстрелена на этот раз, по отсвету дульной вспышки.
В Си нет ничего такого, чтоб там тратить две трети жизни на изучение, а потом еще рефлексировать в духе «ах как много времени ушло на изучения, и как все хреново». Нет, там конечно есть всякие приколы с UB, стрикт-алиасингом и прочим, но это всё меркнет на фоне того, что нагородили стандартизаторы крестов, особенно в последнем стандарте.
А что насчет Return-oriented Programming without Returns cseweb.ucsd.edu/~hovav/dist/noret.pdf? И как насчет setjmp/longjmp, будет ли это вообще работать при таком подходе? Придется вручную по-честному раскручивать стек вызовов вместо того, чтобы мгновенно перепрыгнуть?
Вот правильный пример:
Почему так — это описано в документации GCC: gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html см. cleanup (cleanup_function)
На самом деле очень даже зависит. Я, например, пишу в основном на Си, и не могу себе представить ситуацию вида
В Си нет ничего такого, чтоб там тратить две трети жизни на изучение, а потом еще рефлексировать в духе «ах как много времени ушло на изучения, и как все хреново». Нет, там конечно есть всякие приколы с UB, стрикт-алиасингом и прочим, но это всё меркнет на фоне того, что нагородили стандартизаторы крестов, особенно в последнем стандарте.