On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 18.07.19 15:48. Заголовок: Баг компилятора C++ gcc HEAD 10.0.0 20190 при обработке исключений.


Компилятор C++ gcc HEAD 10.0.0 20190 имеет серьезный баг при обработке исключений.

Расммотрим следующую демонстрационную программу.

 
#include <iostream>

struct A
{
static size_t n;

A() : id( ++n )
{
std::cout << "A( " << id << " )\n";
}

A( const A & ) : id( ++n )
{
std::cout << "A( " << id << " )\n";
}

~A()
{
std::cout << "~A( " << id << " )\n";
}

size_t id;
};

size_t A::n;

struct B
{
B()
{
std::cout << "B()\n";
}

~B() noexcept( false )
{
std::cout << "~B()\n";
throw( 0 );
}
};

A f()
{
try
{
A a1;
B b;
A a2;

return {}; // #1
}
catch( ... )
{
}

return {}; // #2
}

int main()
{
f();
}

В этой программе деструктор структуры B выбрасывает исключение. В связи с этим должен удаляться объект структуры A, созданный в строке, помеченной как #1, так как происходит очищение стека от локальных объектов прежде, чем управление передасться на предложение с catch.

однако этого не происходит. Вывод программы следующий:
 
A( 1 )
B()
A( 2 )
A( 3 )
~A( 2 )
~B()
~A( 1 )
A( 4 )
~A( 4 )

Хотя на самом деле в соответствии со стандартом C++ вывод на консоль должен выглядеть как
 
A( 1 )
B()
A( 2 )
A( 3 )
~A( 2 )
~B()
~A( 3 )
~A( 1 )
A( 4 )
~A( 4 )

То есть между строками
 
~B()
~A( 1 )

должна появиться строка
 
~A( 3 )

То есть объект, созданный в предложении, помеченном как #1, остался не удаленным, что ведет к неопределенному поведению программы.

Похоже. этот баг уже давно присутствует в этом компиляторе, возможно, и в других компиляторах.

Так что будьте осторожны, когда используете исключения. Не допускайте подобного кода.

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 38
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет