Анализатор обнаружил ошибку, связанную с выбрасыванием исключения из параллельного блока. Согласно спецификации OpenMP, если вы используете исключения внутри параллельного блока, то все эти исключения должны быть обработаны внутри этого блока. Если вы используете внутри параллельного кода оператор new, то вы должны позаботиться о перехвате исключения, которое согласно стандарту языка Си++ будет сгенерировано при ошибке выделения памяти. Приведенный ниже пример приведет к некорректному поведению программы и скорее всего к ее аварийному завершению, если произойдет ошибка выделения памяти:
void foo1302(ptrdiff_t n)
{
#pragma omp parallel for
for (ptrdiff_t i = 0; i < n; i++)
{
float *array = new float[10000];
//...
delete [] array;
}
}
Исправление кода состоит в обработке исключений внутри параллельного блока и передачи информации об ошибке через иные механизмы или в отказе от использования оператора ‘new’. Исправленный вариант функции:
void foo1302_fixed(ptrdiff_t n)
{
#pragma omp parallel for
for (ptrdiff_t i = 0; i < n; i++)
{
try {
float *array = new float[10000];
//...
delete [] array;
}
catch (std::bad_alloc &) {
// process exception
}
}
}