Skip to main content

SA0103: Acceso concurrente a datos no atómicos

Detecta si las variables no atómicas (por ejemplo, con tipo de datos) STRING, WSTRING, ARRAY, STRUCT, instancias de FB, tipos de datos de 64 bits) se utilizan en más de una tarea

Justificación: Cuando no hay sincronización durante el acceso, se pueden leer valores inconsistentes al leer en una tarea y escribir en otra tarea al mismo tiempo.

Importancia: Media

Sugerencia

Para algunos tipos de datos, especialmente los enteros de 64 bits, depende de la plataforma si el acceso es atómico o no. El análisis estático informa de un problema solo cuando el controlador no admite el acceso atómico a tipos de datos enteros de 64 bits.

Esta regla no se aplica en los siguientes casos:

  • Si el sistema de destino tiene una unidad de punto flotante (FPU), entonces el acceso de múltiples tareas a LREAL no se detectan las variables

  • Si el sistema de destino es un procesador de 64 bits o se establece la configuración de destino correspondiente para el dispositivo de destino, la regla no se aplica a los tipos de datos de 64 bits.

ejemplo 92. Ejemplo

El proyecto contiene ambos programas, PRG1 y PRG2.

El programa PRG1 es llamado por la tarea MainTask_1. El programa PRG2 es llamado por la tarea MainTask_2.

VAR_GLOBAL
    lrTest : LREAL;    // Since the target system has an FPU, SA0103 does apply.
    lint1 : LINT;
    sTest : STRING;    // SA0103
    wsTest : WSTRING;    // SA0103
END_VAR
PROGRAM PRG1
GVL.lrTest := 5.0;
GVL.sTest := 'welt';
GVL.wsTest := "welt";
GVL.lint1 := 99;
PROGRAM PRG2
GVL.lrTest := 5.0;
GVL.sTest := 'hallo';
GVL.wsTest := "hallo";
GVL.lint1 := 88;

Salida en el Mensajes vista:

  • sa_icon_message.png SA0103: Acceso simultáneo a datos no atómicos 'sTest'

  • sa_icon_message.png SA0103: Acceso simultáneo a datos no atómicos 'wsTest'