检测非原子变量(例如,数据类型为STRING
,WSTRING
,ARRAY
,STRUCT
, FB 实例、64 位数据类型)是否在多个任务中使用
理由如果在访问过程中没有同步,在一个任务中读取数据,同时在另一个任务中写入数据时,可能会读取到不一致的值。
重要性:中型
对于某些数据类型,尤其是 64 位整数,访问是否为原子访问取决于平台。只有当控制器不支持对 64 位整数数据类型的原子访问时,静态分析才会报告问题。
本规则不适用于以下情况:
-
如果目标系统有浮点运算单元 (FPU),则不会检测到多个任务对
LREAL
变量的访问 -
如果目标系统是 64 位处理器或为目标设备设置了相应的目标设置,则该规则不适用于 64 位数据类型
示例
该项目包含PRG1
和PRG2
这两个程序:程序PRG1
由任务MainTask_1
调用。程序PRG2
由任务MainTask_2
调用。
GVL 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; --> SA0103: Concurrent access on not atomic data 'sTest' --> SA0103: Concurrent access on not atomic data 'wsTest'