SA0103:对非原子数据的并发访问
检测是否非原子变量(例如,具有数据类型 STRING
, WSTRING
, ARRAY
, STRUCT
、FB 实例、64 位数据类型)用于多个任务
理由:在访问过程中没有同步的情况下,在一个任务中读,同时在另一个任务中写入时,可能会读到不一致的值。
重要性:中等
提示
对于某些数据类型,尤其是 64 位整数,访问是否是原子的取决于平台。仅当控制器不支持对 64 位整数数据类型的原子访问时,静态分析才会报告问题。
此规则不适用于以下情况:
如果目标系统有一个浮点单元(FPU),那么多个任务的访问
LREAL
未检测到变量如果目标系统是 64 位处理器或为目标设备设置了相应的目标设置,则该规则不适用于 64 位数据类型
例 92. 例子
该项目包含两个程序, PRG1
和 PRG2
.
该程序 PRG1
由任务调用 MainTask_1
.该程序 PRG2
由任务调用 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;
输出在 留言 看法:
SA0103:对非原子数据“sTest”的并发访问
SA0103:对非原子数据“wsTest”的并发访问