Несколько задач выполняют незащищенные вызовы функции стандартной библиотеки, небезопасной для потоков
Этот дефект возникает в следующих случаях:
Несколько задач вызывают одну и ту же стандартную библиотечную функцию.
Например, несколько задач вызывают strerror функция.
Вызовы не резервируются с помощью общей защиты.
Например, вызовы не защищены одним и тем же критическим участком.
Функции, отмеченные этим дефектом, не гарантированы для повторного входа. Функция повторно вводится, если ее можно прервать и безопасно вызвать еще раз до того, как ее предыдущий вызов завершит выполнение. Если функция не входит повторно, несколько задач, вызывающих функцию без защиты, могут вызвать проблемы параллелизма. Список отмеченных функций см. в разделе CON33-C: Избегайте расцветки при использовании библиотечных функций.
Чтобы найти этот дефект, перед анализом необходимо указать параметры многозадачности. Чтобы задать эти параметры, на панели Конфигурация выберите Многозадачность. Дополнительные сведения см. в разделе Настройка многозадачного анализа в многозадачном пространстве вручную.
Функции, отмеченные этим дефектом, не входят в систему, поскольку в их реализациях могут использоваться глобальные или статические переменные. Когда несколько задач вызывают функцию без резервирования, вызов функции из одной задачи может помешать вызову из другой задачи. Два вызова функции могут одновременно обращаться к глобальным или статическим переменным и вызывать непредсказуемые результаты.
Вызовы также могут вызывать более серьезные уязвимости безопасности, такие как ненормальное завершение, атака типа «отказ в обслуживании» и нарушения целостности данных.
Чтобы устранить этот дефект, выполните одно из следующих действий.
Используйте исходную версию стандартной библиотечной функции, если она существует.
Например, вместо strerror(), использовать strerror_r() или strerror_s(). Альтернативы функциям, отмеченным этим дефектом, см. в документации для CON33-C.
Защита вызовов функций с помощью общих критических разделов или временного исключения.
Посмотрите Critical section details (-critical-section-begin -critical-section-end) и Temporally exclusive tasks (-temporal-exclusions-file).
Чтобы определить существующие защиты, которые можно использовать повторно, см. таблицу и графики, связанные с результатом. В таблице показаны все пары конфликтующих вызовов. В столбце Access Protections отображаются существующие защиты для вызовов. Для просмотра последовательности вызовов функции, приводящей к конфликтам, щелкните
по пиктограмме. Пример см. ниже.
| Группа: Параллелизм |
| Язык: C | C++ |
| По умолчанию: Вкл. |
Синтаксис командной строки: DATA_RACE_STD_LIB |
| Воздействие: Высокое |
| CWE ID: 366, 413 |
Configure multitasking manually | Critical section details (-critical-section-begin -critical-section-end) | Data race | Data race including atomic operations | Destruction of locked mutex | Double lock | Double unlock | Find defects (-checkers) | Missing lock | Missing unlock | Tasks (-entry-points) | Temporally exclusive tasks (-temporal-exclusions-file)