SA0103:非アトミックデータへの同時アクセス
非アトミック変数(データ型など)かどうかを判断します STRING
、 WSTRING
、 ARRAY
、 STRUCT
、FBインスタンス、64ビットデータ型)は、複数のタスクで使用できます。
理由:アクセス中に同期がない場合、あるタスクでの読み取りと別のタスクでの書き込みにより、読み取られる値に一貫性がなくなる可能性があります。
重要性:中
ヒント
一部のデータ型、特に64ビット整数では、アクセスがアトミックであるかどうかはプラットフォームに依存します。静的コード分析は、コントローラーが64ビット整数データ型へのアトミックアクセスをサポートしていない場合にのみ問題を報告します。
このルールは、次の場合には適用されません。
ターゲットシステムにFPU(浮動小数点ユニット)がある場合、複数のタスクへのアクセスが制限されます
LREAL
-変数が決定されていませんターゲットシステムが64ビットプロセッサであるか、ターゲットデバイスに適切なターゲット設定が設定されている場合、ルールは64ビットデータタイプには適用されません。
例 92. 例
プロジェクトには2つのプログラムが含まれています 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」に対する同時アクセス