Potentially unprotected variable

Глобальные переменные, общие между несколькими задачами, но не защищенные от параллельного доступа задачами

Описание

Общая незащищенная глобальная переменная имеет следующие свойства:

  • Переменная используется более чем в одной задаче.

  • Polyspace® определяет, что по крайней мере одна операция переменной не защищена от прерывания операциями в других задачах.

В коде, который не предназначен для многозадачности, все глобальные переменные являются совместными.

В результатах вашей верификации эти переменные окрашены в оранжевый цвет на Source, Results List и Variable Access панелях. На панели Source раскраска применяется к переменной только во время объявления.

Примеры

расширить все

#include <limits.h>
int shared_var;

void inc() {
    shared_var+=2;
}

void reset() {
    shared_var = 0;
}

void task() {
    volatile int randomValue = 0;
    while(randomValue) {
        reset();
        inc();
        inc();
    }
}

void interrupt() {
    shared_var = INT_MAX;
}

void interrupt_handler() {
    volatile int randomValue = 0;
    while(randomValue) {
        interrupt();
    }
}

void main() {
}

В этом примере shared_var является незащищенной общей переменной, если заданы следующие опции многозадачности:

Механизмы защиты, такие как критические сечения, не заданы.

Область операции shared_var = INT_MAX может прервать другие операции по shared_var и вызвать непредсказуемое поведение.

При нажатии значка (graph) на панели Result Details отображаются две параллельные задачи (потоки).

Первый график показывает, как задачи получают доступ к переменной. Например, interrupt_handler задачи вызывает функцию interrupt которая записывает в общую переменную shared_var.

Второй график показывает, как создаются задачи. В этом примере обе задачи создаются после main завершает. В других случаях задачи могут создаваться в функциях, вызываемых из main.

Проверяйте информацию

Язык: C | C++