项目设置 - Static Analysis Light

概述

EcoStruxure Machine Expert 中的静态分析意味着,在可以将项目下载到目标系统而不发生编译错误之前,将搜索源代码是否与特定编码标准存在偏差。为此,可以在项目设置中配置要遵循的一组规则。在每次生成代码时均将根据这些定义规则执行自动验证。

注: 您可以通过将代码标记为 {analysis ...} pragma{attribute 'analysis' := '...'} pragma,从静态代码分析中排除该代码行。

分析结果作为错误显示在消息视图中,并添加有前缀 SA

注: 仅对项目中的应用程序代码执行分析。不考虑库。对于 GVL(全局变量列表)变量,如果项目中有多个应用程序,则仅分析活动应用程序下面的对象。如果只有一个应用程序,则分析 POU 公用池中的对象。

Unused variables (SA0033):

检测已编译的程序中已声明但未使用的变量。

Overlapping memory areas (SA0028):

检测两个或更多变量向相同内存位置的分配。

比如,如果存在以下声明,则会出现这种情况:var1 AT %QB21: INTvar2 AT %QD5: DWORD。在此情况下,两个变量都使用 21,这是变量重叠的内存区域。

并发访问 (SA0006):

检测由一个以上任务写入的变量。

示例 (SA0006):

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  //controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

Multiple write access on output (SA0004):

检测在一个以上位置被写入的输出。

示例 (SA0004):

VAR_GLOBAL
    g_xVar AT %QX0.0 : BOOL ; 
    g_iTest AT %QW0 : INT ;
END_VAR
PROGRAM PLC_PRG
IF iCondition < INT#0 THEN
    g_xVar := TRUE;
    g_iTest := INT#12;
END_IF
CASE iCondition OF
    INT#1:
        g_xVar := FALSE;
    INT#2:
        g_iTest := INT#11;
    ELSE
        g_xVar := TRUE;
        g_iTest := INT#9;
END_CASE

名称的多次使用 (SA0027):

检测变量或对象 (POU) 的名称/标识符在项目范围内的多次使用。

可能检测到以下情况:

  • 枚举常量的名称与应用程序或所包含的库中的其他枚举中所用的名称相同。

  • 变量的名称与应用程序或所包含的库中的对象的名称相同。

  • 变量的名称与应用程序或所包含的库中的枚举常量的名称相同。

  • 对象的名称与应用程序中的对象的名称相同。

  • 变量的名称与方法的名称相同。

  • 对象的名称与上级对象(父对象)的名称相同。

示例 (SA0027):

PROGRAM PLC_PRG
VAR
ton : INT;     // error SA0027
END_VAR

Standard.library 包含在项目中,并提供功能块 TON,从而导致名称多次使用。

Report temporary Function Block instances (SA0167):

测试检测到被声明为临时变量的功能块实例。这适用于在方法或函数中声明或者作为 VAR_TEMP 的实例,这些实例因此在每个处理循环中都要针对每个 POU 调用重新初始化。

示例 (SA0167):

PROGRAM PLC_PRG
VAR
END_VAR
VAR_TEMP
    yafb: AFB;
END_VAR
FUNCTION Fun : INT
VAR_INPUT
END_VAR
VAR
    funafb: AFB;
END_VAR
METHOD METH : INT
VAR_INPUT
END_VAR
VAR
    methafb: AFB;
END_VAR
注: AFB 是功能块。

对字符串的可疑操作 (SA0175):

缺省情况下,测试为非活动状态。

执行此命令可扫描可能会导致UTF-8 编码问题的以下构造的代码:

  • 对单字节字符串的索引访问

    示例:str[2]

    消息:对字符串的可疑操作:索引访问“<表达式>”

  • 对单字节字符串的地址访问

    示例:ADR(str)

    消息:对字符串的可疑操作:可能的索引访问“<表达式>”

  • 调用 Standard 库除 CONCATLEN 之外的字符串函数

    消息:对字符串的可疑操作:可能的索引访问“<表达式>”

  • 包含非 ASCII 字符的单字节文字量

    示例:

    str := '99€';
    str := 'Ä';

    消息:对字符串的可疑操作:文字量“<literal>”包含非 ASCII 字符

评估结果并仔细考虑是否启用项目范围 UTF-8 编码(使用项目设置 > 编译选项对话框中的参数STRING 的 UTF8 编码)。