exponenta event banner

Потенциально незащищенная переменная

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

Описание

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

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

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

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

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

Примеры

развернуть все

#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 и вызывают непредсказуемое поведение.

Если щелкнуть значок (графика) на панели Сведения о результатах (Result Details), появятся две параллельные задачи (потоки).

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

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

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

Язык: C | C++