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(...); - бросает исключение