Skip to main content

SA0103:对非原子数据的并发访问

检测是否非原子变量(例如,具有数据类型 STRING, WSTRING, ARRAY, STRUCT、FB 实例、64 位数据类型)用于多个任务

理由:在访问过程中没有同步的情况下,在一个任务中读,同时在另一个任务中写入时,可能会读到不一致的值。

重要性:中等

提示

对于某些数据类型,尤其是 64 位整数,访问是否是原子的取决于平台。仅当控制器不支持对 64 位整数数据类型的原子访问时,静态分析才会报告问题。

此规则不适用于以下情况:

  • 如果目标系统有一个浮点单元(FPU),那么多个任务的访问 LREAL 未检测到变量

  • 如果目标系统是 64 位处理器或为目标设备设置了相应的目标设置,则该规则不适用于 64 位数据类型

92. 例子

该项目包含两个程序, PRG1PRG2.

该程序 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;

输出在 留言 看法:

  • sa_icon_message.png SA0103:对非原子数据“sTest”的并发访问

  • sa_icon_message.png SA0103:对非原子数据“wsTest”的并发访问