Несколько задач выполняют незащищенные вызовы к небезопасной потоком стандартной библиотечной функции
Гонка данных через стандартный вызов библиотечной функции происходит когда:
Несколько задач вызывают ту же стандартную библиотечную функцию.
Например, несколько задач вызывают strerror
функция.
Вызовы не защищены с помощью общей защиты.
Например, вызовы не защищены тем же критическим разделом.
Функции, отмеченные этим дефектом, как гарантируют, не будут повторно используемы. Функция повторно используема, если она может быть прервана и безопасно названа снова, прежде чем его предыдущий вызов завершает выполнение. Если функция не повторно используема, несколько задач, вызывающих функцию без защиты, могут вызвать проблемы параллелизма. Для списка функций, которые отмечаются, см. CON33-C: Избегайте условий состязания при использовании библиотечных функций.
Чтобы найти этот дефект, необходимо задать многозадачные опции перед анализом. Чтобы задать эти опции, на панели Configuration, выбирают Multitasking. Для получения дополнительной информации смотрите Анализ Многозадачности Polyspace Конфигурирования Вручную.
Функции, отмеченные этим дефектом, неповторно используемы, потому что их реализации могут использовать глобальные или статические переменные. Когда несколько задач вызывают функцию без защиты, вызов функции от одной задачи может вмешаться в вызов от другой задачи. Два вызова функции могут одновременно получить доступ к глобальным или статическим переменным и вызвать непредсказуемые результаты.
Вызовы могут также вызвать более серьезные уязвимости системы обеспечения безопасности, такие как аварийное завершение, атака "отказ в обслуживании" и нарушения целостности данных.
Чтобы зафиксировать этот дефект, выполнить одно из следующих действий:
Используйте повторно используемую версию стандартной библиотечной функции, если она существует.
Например, вместо 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 |
Удар: высоко |
ID CWE: 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)