V1303. The 'foo' function which throws an exception cannot be used in a parallel section outside of a try..catch block
Анализатор обнаружил ошибку, связанную с выбрасыванием исключения из параллельного блока. Согласно спецификации OpenMP, если вы используете исключения внутри параллельного блока, то все эти исключения должны быть обработаны внутри этого блока. Анализатор предупреждает о вызове функции, которая отмечена, как бросающая исключения в параллельном блоке и при этом не защищенная try..catch блоком. В случае выбрасывания исключения из функции ExceptionFoo приведенный ниже пример приведет к некорректному поведению программы и скорее всего к ее аварийному завершению:
void ExceptionFoo() throw(...) { }
void foo1303(ptrdiff_t n)
{
#pragma omp parallel for
for (ptrdiff_t i = 0; i < n; i++)
{
//...
ExceptionFoo();
//...
}
}
Исправление кода состоит в обработке исключений внутри параллельного блока и передачи информации об ошибке через другие механизмы. Ниже приведены два варианта исправленной функции:
void foo1303_fixed(ptrdiff_t n)
{
#pragma omp parallel for
for (ptrdiff_t i = 0; i < n; i++)
{
try {
//...
ExceptionFoo();
//...
}
catch (...) {
// process exception
}
}
}
Следует учитывать, что функции, не помеченные как throw(...) тоже могут генерировать исключения. Но анализатор VivaMP не считатет их вызов опасным. Это сделано, чтобы генерировать диагностические сообщения в разумных маштабах. Иначе любой код, где присуствует вызов функции будет считаться опасным. Принят следующий принцип:
void foo(); - предполагаем, что не бросает исключение
void foo() throw();- не бросает исключение
void foo() throw(...); - бросает исключение