Skip to main content

SA0103:非アトミックデータへの同時アクセス

非アトミック変数(データ型など)かどうかを判断します STRINGWSTRINGARRAYSTRUCT、FBインスタンス、64ビットデータ型)は、複数のタスクで使用できます。

理由:アクセス中に同期がない場合、あるタスクでの読み取りと別のタスクでの書き込みにより、読み取られる値に一貫性がなくなる可能性があります。

重要性:中

ヒント

一部のデータ型、特に64ビット整数では、アクセスがアトミックであるかどうかはプラットフォームに依存します。静的コード分析は、コントローラーが64ビット整数データ型へのアトミックアクセスをサポートしていない場合にのみ問題を報告します。

このルールは、次の場合には適用されません。

  • ターゲットシステムにFPU(浮動小数点ユニット)がある場合、複数のタスクへのアクセスが制限されます LREAL-変数が決定されていません

  • ターゲットシステムが64ビットプロセッサであるか、ターゲットデバイスに適切なターゲット設定が設定されている場合、ルールは64ビットデータタイプには適用されません。

92.

プロジェクトには2つのプログラムが含まれています 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」に対する同時アクセス