SA0038:出力変数への読み取りアクセス 出力変数を検出します ( VAR_OUTPUT ) POU 内の読み取り権限でアクセスされます。 理由:61131-3によると、ブロック内の出力を読み取ることは禁止されています。これは、出力が出力としてだけでなく、中間結果の一時変数としても使用されることを示します。このような二重使用は避けてください。 重要度:低 例 47 . 例 VAR_GLOBAL
SA0040:ゼロによる除算の可能性 ゼロ除算が発生する可能性のあるコードを判別します。 正当化: による除算 0 エラーが発生します。除算する変数は常に最初に 0 であるかどうかをチェックする必要があります。 重要性:高い 例 48 . 例 VAR_GLOBAL g_iVar AT %QW1 : INT; END_VAR PROGRAM PLC_PRG VAR iCounter : INT; i
SA0081:上限は定数値ではありません を検出します FOR 上限が定数値で定義されていないステートメント 理由:ループの上限が可変値である場合、ループが実行される頻度を確認することはできなくなります。これにより、実行時に深刻な問題が発生する可能性があり、最悪の場合、無限ループが発生する可能性があります。 重要性:高い 例 85 . 例 PROGRAM PLC_PRG VAR i:INT; iB
SA0103:非アトミックデータへの同時アクセス 非アトミック変数(データ型など)かどうかを判断します STRING 、 WSTRING 、 ARRAY 、 STRUCT 、FBインスタンス、64ビットデータ型)は、複数のタスクで使用できます。 理由:アクセス中に同期がない場合、あるタスクでの読み取りと別のタスクでの書き込みにより、読み取られる値に一貫性がなくなる可能性があります。 重要性:中 ヒ
SA0057:小数点以下の桁数が失われる可能性 小数点以下の桁数が失われる可能性のある命令を決定します。 理由:次の種類のコードの一部: diTemp2 := 1 rTemp1 := TO_REAL(diTemp2 / DINT#2) 誤解を招く可能性があります。このコード行の作成者または読者は、分割が次のようになると想定する場合があります。 REAL -実行された操作と結果はこの場合になります
SA0076:列挙定数がありません 各列挙定数が条件として使用されるかどうかを決定します。 CASE ステートメントとクエリ CASE 支店。 理論的根拠:防御プログラミングでは、列挙型のすべての可能な値を処理する必要があります。特定の列挙値にアクションが必要ない場合は、コメントで明示的にマークする必要があります。そうすれば、コードの読者には、値が単に忘れられたのではないことが明らかになります。
SA0077:CASE式のデータ型の不一致 条件のデータ型がdesのデータ型と一致しないコード位置を検索します CASE -ブランチの一致。 理由:データ型が CASE -変数と CASE -一致しない場合は、エラーを示している可能性があります。 重要度:低 例 83 . 例 TYPE My_Enum : ( eins := 1, zwei := 2, drei := 3, vier := 4 )
属性'naming' 属性は、によって使用されるコード行を識別します 命名規則の分析 除外されます。コード分析が中断されるコードの最初の行の前に、プラグマ属性がオンになっています off 、最後の行の後 on 割り当てられました。いつ omit 割り当てられると、コードの次の行のみが無視されます。 挿入位置 :非アクティブ化:関連する行の上のPOUおよびDUTの宣言部分。アクティベーション:関連す
SA0024: 型なしリテラル/定数 操作の一部である型なしリテラルを識別します 理由: 型指定されていないリテラルは、その使用法に従って自動的に型指定されます。場合によっては、次のような dw := ROL(DWORD#1, i); 、これにより、独自の説明を提供するために型付きリテラルを使用した方がよいという予期せぬ状況が発生する可能性があります。 重要度:低 例 35 . 例 PROGRAM
SA0042:異なるアクセスパスの使用 同じ変数に対する異なるアクセスパスの使用を検出します。 理由:同じ要素へのアクセスが異なると、プログラムの可読性と保守性が低下します。一貫して使用することをお勧めします {attribute 'qualified-only'} ライブラリ、グローバル変数リスト、および列挙型の場合。これにより、完全に修飾されたアクセスが強制されます。 重要度:低 例 50 .