Page 1 of 1

Все предоставляемые плагинам функции помечены как noexcept

Posted: Tue 18 Nov, 2014 23:32
by Shmuel

Code: Select all

drkns 11.09.2014 00:07:10 +0200 - build 4097

1. Все предоставляемые плагинам функции помечены как noexcept и обернуты в try/catch,
   т. к. выбрасывание наружу исключений всё равно ни к чему хорошему привести не может.
Нельзя ли пояснить это подробнее?
По моим наблюдениям, одни исключения перестали выбрасываться наружу, другие - не перестали.

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

Все предоставляемые плагинам функции помечены как noexcept

Posted: Wed 19 Nov, 2014 00:16
by DrKnS
Нельзя ли пояснить это подробнее?
Можно. Исключение - объект языка C++, обрабатывать его в другом модуле можно только если он написан на том же языке, собран тем же компилятором, той же версии и с теми же настройками, иначе это UB.
другие - не перестали
В студию.
теперь мы как бы заметаем сор в угол, прячем под одеяло, и т.п.
В каждом catch блоке можно обнаружить комментарий "// TODO: log". Когда придёт время, он будет заменён соответствующей диагностикой.

Все предоставляемые плагинам функции помечены как noexcept

Posted: Wed 19 Nov, 2014 08:22
by Shmuel
DrKnS wrote: В студию.
char *p=NULL; *p=5;

Теперь пример, когда баг перестал ловиться:
void *h=SaveScreen(0,0,-1,-1); RestoreScreen(h); RestoreScreen(h);
DrKnS wrote: В каждом catch блоке можно обнаружить комментарий "// TODO: log". Когда придёт время, он будет заменён соответствующей диагностикой.
Я бы предпочёл, чтобы падало сразу и с шумом.

Все предоставляемые плагинам функции помечены как noexcept

Posted: Wed 19 Nov, 2014 08:41
by DrKnS
Shmuel wrote: char *p=NULL; *p=5;
Это где такое? В функции Far, предоставленной плагину, да?
Shmuel wrote: Теперь пример, когда баг перестал ловиться:

Code: Select all

void *h=SaveScreen(0,0,-1,-1); RestoreScreen(h); RestoreScreen(h);
RestoreScreen(h) - это delete(SaveScreen *)h;
Повторное удаление - это UB. Исключение оно выбрасывать не обязано. Если повезёт, можно получить SEH, а можно и не получить.
Пользуйтесь RAII и подобных багов не будет в принципе.
Shmuel wrote: Я бы предпочёл, чтобы падало сразу и с шумом.
Выше написано - это UB. Может падать сразу и с шумом, может тихо портить память и данные где-то совсем в другом месте.

Все предоставляемые плагинам функции помечены как noexcept

Posted: Wed 19 Nov, 2014 08:58
by Shmuel
DrKnS wrote: Это где такое? В функции Far, предоставленной плагину, да?
В OpenW, например. Не в функции Far.
DrKnS wrote: Пользуйтесь RAII и подобных багов не будет в принципе.
Обсуждается не то, как избежать определённых багов, а то, как их обрабатывать, если они всё же есть. А они были, есть, и будут.

Все предоставляемые плагинам функции помечены как noexcept

Posted: Wed 19 Nov, 2014 11:50
by zg
Shmuel wrote:В OpenW, например. Не в функции Far.
а какое это имеет отношение к обсуждаемому изменению?

Все предоставляемые плагинам функции помечены как noexcept

Posted: Wed 19 Nov, 2014 12:38
by HaRT

Все предоставляемые плагинам функции помечены как noexcept

Posted: Wed 19 Nov, 2014 12:58
by zg
HaRT wrote:
Shmuel wrote:
DrKnS wrote: В студию.
char *p=NULL; *p=5;
Этот код не имеет прямого отношения к бросанию исключений C++. То есть C++ exception получим лишь в том случае, если в процессе Фара установлен специальный преобразователь из SEH-исключений в Си++-исключения.
ещё раз. какое отношение это имеет к обсуждаемой теме? в указанном патче в try/catch оборачиваются функции, предоставляемые фаром плагину. код самого плагина обёрнут давно.

Все предоставляемые плагинам функции помечены как noexcept

Posted: Wed 19 Nov, 2014 13:04
by HaRT
zg wrote: оборачиваются функции, предоставляемые фаром плагину. код самого плагина обёрнут давно
Теперь до меня дошло. Спасибо за разъяснение. Прошу прощения за офтопик.