Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Баг в GCC связанный с RAII. Вот если взять сишку, вручную свои деструкторы и конструкторы пилить без всей этой дрисни с trow catch и прочей хуйни, такого бы не было.
Если серьезно, язык C++ настолько запутан и погряз во всякой хуйне, что вряд ли сегодня существует хотя бы один незабагованный C++ компилятор, полностью соответствующий стандарту (пусть даже и не самому свежему, C++98, С++03 или C++11 там)
Ну да, кресты — адово перегруженное говно, сложность создания компилятора для которого сравнима со сложностью постройки космического корабля. Именно поэтому…
Они обещают, что компилятор будет гарантированно выдавать код, соответствующий исходнику. Правда, им пришлось что-то удалить из языка (кажется, поддержку устройства Даффа).
За компилятор же крестов с математической гарантией даже в «INRIA» не взялись.
CompCert C supports all of ISO C 99, with the following exceptions:
• switch statements must be structured as in MISRA-C; unstructured "switch", as in Duff's device, is not supported.
• longjmp and setjmp are not guaranteed to work.
• Variable-length array types are not supported.
Consequently, CompCert supports all of the MISRA-C 2004 subset of C, plus many features excluded by MISRA (such as recursive functions and dynamic heap memory allocation).
Ну вот, ещё setjmp/longjmp не гарантируют и VLA не осилили.
> The NICTA team also proved correctness of the translation from C to executable machine code, taking the compiler out of the trusted computing base of seL4. This implies that the high-level security proofs hold for the kernel executable
А Ви таки-уверены, что конпелятор не заинлайнил самым анальным образом результат t() в нечто, что уже не int, или не сыграл под std::terminate, посчитав, что и так знает, что произойдет? Потому что может быть вот так:
C++11 15.5.1 The std::terminate() function [except.terminate]
2 … In the situation where no matching handler is found, it is implementation-defined whether or not the stack is unwound before std::terminate() is called.
Это уже никого не волнующие детали реализации. Конпелятор создал временный объект, вызвал его коньструктор — а десруктор не вызвал. Это крайне серьёзный баг, нарушающий Стандарт и способный привести к утечкам ресурсов.
Так
>implementation-defined whether or not the stack is unwound
Стеки не крутятся, деструкторы не мутятся же, явно сказано, что пусть там std::terminate (предполагаемый) ебётся.
Впрочем, причём здесь RAII я так и не понял. Баг-то не в RAII, баг в «GCC».
Вот если взять сишку, вручную свои деструкторы и конструкторы пилить без всей этой дрисни с trow catch и прочей хуйни, такого бы не было.
Если серьезно, язык C++ настолько запутан и погряз во всякой хуйне, что вряд ли сегодня существует хотя бы один незабагованный C++ компилятор, полностью соответствующий стандарту (пусть даже и не самому свежему, C++98, С++03 или C++11 там)
https://bugs.llvm.org/show_bug.cgi?id=7469
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=29027
тот же самый баг в Clang и GCC
Притом в GCC он висит аж с 2006 года
Если для него 600 страниц стандарта — это слишком сложно, чтобы построить компилятор с прогнозируемым поведением, то что же для него крестостандарт?
Доводится ли он Адочке?
https://en.wikipedia.org/wiki/CompCert
https://ru.wikipedia.org/wiki/CompCert
Они обещают, что компилятор будет гарантированно выдавать код, соответствующий исходнику. Правда, им пришлось что-то удалить из языка (кажется, поддержку устройства Даффа).
За компилятор же крестов с математической гарантией даже в «INRIA» не взялись.
CompCert C supports all of ISO C 99, with the following exceptions:
• switch statements must be structured as in MISRA-C; unstructured "switch", as in Duff's device, is not supported.
• longjmp and setjmp are not guaranteed to work.
• Variable-length array types are not supported.
Consequently, CompCert supports all of the MISRA-C 2004 subset of C, plus many features excluded by MISRA (such as recursive functions and dynamic heap memory allocation).
Ну вот, ещё setjmp/longjmp не гарантируют и VLA не осилили.
Можно вместо этого проверять бинарник, который выдал компилятор. Т.е. доказывать, что он по смыслу соответствует исходнику:
https://en.wikipedia.org/wiki/L4_microkernel_family#High_assurance:_se L4
> The NICTA team also proved correctness of the translation from C to executable machine code, taking the compiler out of the trusted computing base of seL4. This implies that the high-level security proofs hold for the kernel executable
>implementation-defined whether or not the stack is unwound
Стеки не крутятся, деструкторы не мутятся же, явно сказано, что пусть там std::terminate (предполагаемый) ебётся.
https://wandbox.org/permlink/KMo3T8EeLfSAwkYE
Это баг в «GCC».
Канструктор вызвался, диструктор не вызвался