LINUX.ORG.RU

История изменений

Исправление ckotinko, (текущая версия) :

скажем так. компилятор получает на вход translation unit. и выдает некий черный ящик, характеризуемый внутренним состоянием(часть его лежит в bss, часть в data, чопустимым, по видимому, считать неопределённое значение объединимым с определённым. отсюда и оптимизация в виде инлайнинга - он же невозможен при неконстантности адреса перехода.асть в rodata), и взаимодействиями. в частности это экспортируемые функции (у нас main и nevercalled). но даже переменные можно представить как функции-accessorы. то есть мы можем утверждать, что результатом работы компилятора является finite state machine.

в нашем случае, в Do хранится нечто, что будет перезаписано при вызове nevercalled. по сути, компилятор может сказать лишь то, что

если nevercalled было вызвано раньше main, то do = eraseall, иначе do не определено.

Но! «не определено» не дает права считать что do определено как eraseall. компилятор не живет в вакууме, он генерит код для вполне реальных систем, и переменные, которые он генерит, располагаются в очень даже определённых локациях. В Си как раз определено, что неинициализованный static лежит в bss и будет инициализован нулями.

То есть Си не живет в вакууме, он говорит прямо что код будет скомпилирован в объектники, и будет обладать вполне конкретными свойствами. Т.е. наша finite state machine имеет определённое начальное состояние. К слову, даже неинициализованная переменная в data имеет начальное состояние, просто оно random. На входе всё равно что-то будет.

Компилятор С++ считает допустимым, по видимому, считать неопределённое значение объединимым с определённым. отсюда и оптимизация в виде инлайнинга - он же невозможен при неконстантности адреса перехода. Я считаю такое толкование расширяющим понятие UB, т.к. «неопределённое» значение производной может определяться внешними условиями и в Си оно так и считается.

Исходная версия ckotinko, :

скажем так. компилятор получает на вход translation unit. и выдает некий черный ящик, характеризуемый внутренним состоянием(часть его лежит в bss, часть в data, часть в rodata), и взаимодействиями. в частности это экспортируемые функции (у нас main и nevercalled). но даже переменные можно представить как функции-accessorы. то есть мы можем утверждать, что результатом работы компилятора является finite state machine.

в нашем случае, в Do хранится нечто, что будет перезаписано при вызове nevercalled. по сути, компилятор может сказать лишь то, что

если nevercalled было вызвано раньше main, то do = eraseall, иначе do не определено.

Но! «не определено» не дает права считать что do определено как eraseall. компилятор не живет в вакууме, он генерит код для вполне реальных систем, и переменные, которые он генерит, располагаются в очень даже определённых локациях. В Си как раз определено, что неинициализованный static лежит в bss и будет инициализован нулями.

То есть Си не живет в вакууме, он говорит прямо что код будет скомпилирован в объектники, и будет обладать вполне конкретными свойствами. Т.е. наша finite state machine имеет определённое начальное состояние. К слову, даже неинициализованная переменная в data имеет начальное состояние, просто оно random. На входе всё равно что-то будет.

Компилятор С++ считает допустимым, по видимому, считать неопределённое значение объединимым с определённым. отсюда и оптимизация в виде инлайнинга - он же невозможен при неконстантности адреса перехода. Я считаю такое толкование расширяющим понятие UB, т.к. «неопределённое» значение производной может определяться внешними условиями и в Си оно так и считается.

на каком основании