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 variablesSi 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.
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:
SA0103: Acceso simultáneo a datos no atómicos 'sTest'
SA0103: Acceso simultáneo a datos no atómicos 'wsTest'