Skip to main content

SA0066:中間結果の使用

レジスタ サイズより小さいデータ型を持つステートメントでの一時結果の使用を検出します。この場合、暗黙的なキャストによって望ましくない結果が生じる可能性があります。

正当な理由: パフォーマンス上の理由から、 CODESYS Static Analysis プロセッサのレジスタ幅に対して演算を実行します。中間結果は切り捨てられません。これは、次のような誤解を招く可能性があります。

78.
usintTest := 0; xError := usintTest - 1 <> 255;

CODESYSxErrorTRUE この場合、操作が usintTest - 1 通常、32 ビット操作として実行され、結果はバイト サイズにキャストされません。次に、値 16#ffffffff (255 に等しくない) がレジスタ内にあります。

これを回避するには、中間結果を明示的にキャストする必要があります。

xError := TO_USINT(usintTest - 1) <> 255;


重要

この通知がアクティブ化されると、コード内のかなり問題のない場所が多数報告されます。問題が発生するのは、操作によってデータ型にオーバーフローまたはアンダーフローが発生した場合のみですが、静的分析では個々の位置を区別できません。

報告されたすべての場所に明示的な型キャストをインストールすると、コードが大幅に遅くなり、読みにくくなります。

重要度:低

79.
PROGRAM PLC_PRG
VAR
    byTest:BYTE;
    liTest:LINT;
    xError:BOOL;
END_VAR
//type size smaller than register size;
byTest := 0;
IF (byTest - 1) <> 255 THEN //use of temporary result + implicit casting ->  SA0066
    xError := TRUE;
ELSE
    xError := FALSE;
END_IF

//type size equal to or bigger than register size;
liTest := 0;
IF (liTest - 1)  <> -1 THEN // use of temporary result and no implicit casting -> OK
    xError := TRUE;
ELSE
    xError := FALSE;
END_IF

での出力 メッセージ ビュー:

  • sa_icon_message.png SA0066: 一時結果の使用 (byTest - USINT #1)