Несколько потоков выполняют незащищенные операции на смежных битовых полях структуры разделяемых данных
Этот дефект происходит когда:
Несколько задач выполняют незащищенные операции на битовых полях, которые являются частью той же структуры.
Например, задача работает с полем errorFlag1
и другая задача на поле errorFlag2
в переменной этого типа:
struct errorFlags { unsigned int errorFlag1 : 1; unsigned int errorFlag2 : 1; ... }
По крайней мере одна из незащищенных операций является операцией записи.
Чтобы найти этот дефект, перед анализом, необходимо задать многозадачные опции. Чтобы задать эти опции, на панели Configuration, выбирают Multitasking. Для получения дополнительной информации смотрите Анализ Многозадачности Polyspace Конфигурирования Вручную.
Смежные битовые поля, которые являются частью той же структуры, могут храниться в одном байте в той же ячейке памяти. Операции чтения или операции записи на всех переменных включая битовые поля происходят один байт или слово за один раз. Чтобы изменить только определенные биты в байте, шаги, похожие на эти шаги, происходят в последовательности:
Байт загружается в RAM.
Маска создается так, чтобы только определенные биты были изменены к намеченному значению, и остающиеся биты остаются неизменными.
Операция битового "ИЛИ" выполняется между копией байта в RAM и маской.
Байт с определенными измененными битами копируется назад с RAM.
Когда вы получаете доступ к двум различным битовым полям, эти четыре шага должны быть выполнены для каждого битового поля. Если доступы не защищены, все четыре шага для одного битового поля не могут быть завершены, прежде чем четыре шага для другого битового поля начинаются. В результате модификация одного битового поля может отменить модификацию смежного битового поля. Например, в предыдущем примере, модификации errorFlag1
и errorFlag2
может произойти в следующей последовательности. Шаги 1,2 и 5 относятся к модификации errorFlag1
и в то время как шаги 3,4 и 6 относятся к шагам 3,4 и 6 errorFlag2
.
Байт с обоими errorFlag1
и errorFlag2
немодифицированный копируется в RAM, в целях изменить errorFlag1
.
Маска, которая изменяет только errorFlag1
редактор битового "ИЛИ" с этой копией.
Байт, содержащий оба errorFlag1
и errorFlag2
немодифицированный копируется в RAM во второй раз, в целях изменить errorFlag2
.
Маска, которая изменяет только errorFlag2
редактор битового "ИЛИ" с этой второй копией.
Версия с errorFlag1
измененный копируется назад. Эта версия имеет errorFlag2
немодифицированный.
Версия с errorFlag2
измененный копируется назад. Эта версия имеет errorFlag1
немодифицированный и перезаписи предыдущая модификация.
Чтобы зафиксировать этот дефект, защитите операции на битовых полях, которые являются частью той же структуры при помощи критических разделов, временного исключения, или другой означает. Смотрите Меры защиты для Совместно используемых переменных в Многозадачном Коде.
Чтобы идентифицировать существующие меры защиты, которые можно снова использовать, см. таблицу и графики, сопоставленные результатом. Таблица показывает каждую пару конфликтных вызовов. Столбец Access Protections показывает существующие меры защиты на вызовах. Чтобы видеть, что последовательность вызова функции ведет к конфликтам, кликните по значку.
Группа: параллелизм |
Язык: C | C++ |
Значение по умолчанию: On |
Синтаксис командной строки:
DATA_RACE_BIT_FIELDS |
Удар: высоко |
Configure multitasking manually
| Critical section details (-critical-section-begin -critical-section-end)
| Data race
| Data race including atomic operations
| Data race through standard library function call
| Disabling all interrupts (-routine-disable-interrupts -routine-enable-interrupts)
| Find defects (-checkers)
| Target processor type (-target)
| Tasks (-entry-points)
| Temporally exclusive tasks (-temporal-exclusions-file)