手游网 手游攻略 新游动态 代码检查法有哪些方法,代码检查英文

代码检查法有哪些方法,代码检查英文

时间:2024-07-12 15:24:00 来源:今日头条 浏览:0

本文由华为云社区分享《CodeNavi 中代码表达式的节点和节点属性-云社区-华为云》,作者:Uncle_Tom。

基于代码检查中的一些问题,我想找到一种合适的语言来编写静态分析规则。

可以满足用户日益增长的代码检查需求。用户可以通过增加或减少对测试约束的控制来快速调整测试中的误报和误报。这个阈值可以让用户集中精力检查自己的业务。而不关注该工具是如何实现的。这种检查规则语言称为CodeNavi。本文介绍CodeNavi 检查规则语言如何在代码中编写表达式。这些节点主要包括:

3.1. 对象创建表达式(objectCreationExpression) 3.5. 二进制表达式(binaryOperation) 3.8. Lambda 表达式(lambdaExpression)

2. CodeNavi 中的节点和节点属性

是用空格分隔的字符串。在程序分析中,每个字符串称为“令牌”。它是源代码中最小的语法单元,是编程语言语法的基本构建块。

代币可以分为多种类型。常见的包括关键字(if、while等)、标识符(变量名、函数名)、文字(数字、字符串等)、运算符(+、-、/等)。 分隔符(逗号、分号等)。

定义检查规则非常简单,只需定义代码中的各个节点并在条件语句中编写要求以使这些节点符合缺陷检查模式。

2.1. 规则节点和节点属性图例

2.1.1. 节点

图例

afe0f5d9624a4bf8ae5878d9cf3eb45c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=NMIqIFcHlWRUk%2BYkAd5w34TJ%2BLM%3D 节点和子节点使用图例

规则语言中使用节点的“英文名称”,以方便规则创建。

2.2. 节点集

图例

7cf0000a58654429b361d8327baa7e77~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=XbkmbISgFQukY039se5Bn2z%2F%2Bzk%3D

节点的集合。

2.3. 属性

图例

d917c24e7f9d467c9f0b3c6681c8d79c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=46K%2FkKiNf90SjhC62AHWK6DDugA%3D 规则语言中使用了属性的“英文名称”,使编写规则更加容易。

3. 表达式

表达式是程序中生成值或执行操作的一段代码。表达式可以像单个文字或变量一样简单,也可以像多个运算符或子表达式一样复杂。

表达式在程序中发挥着非常广泛的作用,是程序逻辑和数据处理的基础。表达式是程序的基本构建块之一,用于表示对数据的计算和操作,并帮助开发人员构建程序逻辑和功能。

以下是表达式主要用途的一些示例。

产生值表达式的主要功能是产生值。例如,5 + 3 生成值8。算术运算,表达式可以执行基本算术运算,例如加法(+)、减法(-)、乘法(*)、除法(/) 和余数(%)。关系运算允许您比较表达式并生成布尔值(true 或false)。例如,5 3 返回true。逻辑运算,表达式可以执行逻辑运算,例如逻辑AND ()、逻辑OR (||) 和逻辑NOT (!)。条件操作,三元条件运算符(?)允许您根据条件表达式的结果在两个值之间进行选择。例如,max=(a b) a : b;要创建数组,请使用表达式来声明并初始化数组。例如,new int[10];要创建对象,可以使用表达式来创建对象实例。例如,新整数(10)。类型转换:您可以键入表达式将一种类型的值转换为另一种类型。例如,(int)3.14。创建和使用Lambda 表达式Lambda 表达式允许您以简洁的语法表达匿名函数。例如,() - System.out.println(“Hello”);控制流语句,表达式的结果可用于控制流语句,例如if、while 和for。异常处理,表达式可以与异常处理结合使用,例如在try-catch 块中。

3.1. 对象创建表达式(objectCreationExpression)

表达式用于创建对象实例。

代码示例

新的ArrayList() 图例

dbf36c5f7dcc4020ab1c6eb23527e5a1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=cD%2BSYa4jTKPbnD8SAdNCa01Xuww%3D姓名

解释

值类型

例子

DSL 规则

姓名

方法名称

细绳

新的MethodRefTypeTest();

objectCreationExpression obc 其中

obc.name=="MethodRefTypeTest";

类型

返回类型

对象类型节点

新的MethodRefTypeTest();

objectCreationExpression obc 其中

obc.type.name=="com.huawei.secbrella.kirin.test.sourcefile.methodRefType.MethodRefTypeTest";

功能

构造方法调用

函数声明节点

公共类MethodRefTypeTest {

MethodRefTypeTest() {}

公共静态无效主(字符串[] args){

新的MethodRefTypeTest();

}

objectCreationExpression obc 其中

obc.function.name=="MethodRefTypeTest";

争论

输入参数集

valueAccess类节点、functionCall节点等的集合。

新字符串(“你好”);

objectCreationExpression obc 其中

obc.arguments.size()==1;

论据[n]

第n 个输入参数

valueAccess类节点、functionCall节点等的集合。

新字符串(“你好”);

objectCreationExpression obc 其中

obc.arguments[0].value==“你好”;

3.2. 强制类型转换(castExpression)

类型转换是指将一种类型的对象转换为另一种类型的对象。

代码示例

double d=10.5;//对于强制转换,必须显式指定目标类型int i=(int) d;Object obj=new String('Hello');//安全向下转换String str=(String) obj legend ;

d7d973859ae341b9b7911daa167ac45b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=HgI7wwcb6Y8ZwXHGf8vZq9lQyVg%3D

姓名

解释

值类型

例子

DSL 规则

铸造类型

目标类型

节点

ArrayList 2nd=(ArrayList) 列表;

CastExpression 在这里

ce.castType.name=="java.util.ArrayList";

操作数

经营目标

节点

ArrayList 2nd=(ArrayList) 列表;

CastExpression 在这里

ce.操作数.name=="列表";

3.3. 类型判断表达式(instanceofExpression)

instanceof 关键字用于检查对象是否是特定类或其子类的实例。

代码示例

if (animalinstanceofdog) { ((dog) Animal).makeSound();}object[] object=new object[10];if (objectinstanceofobject[]) { System.out.println('对象是一个数组对象'); } } 传奇

143320f5d6a841928bfa76565bd45e39~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=xlf%2FqvELS0udx3PbwIr11M0UbWI%3D

姓名

解释

值类型

例子

DSL 规则

左边

左值

任意节点

父亲实例

表达式的实例,即其中

ie.lhs.name=="父亲";

右肩

右值,类型值

完整的类名常量

列表的实例列表

表达式的实例,即其中

ie.rhs.name=="java.util.List";

3.4. 一元表达式(unaryOperation)

单项式包含一个操作数。

代码示例

//一元算术表达式//自增:++x(将x 的值增加1) //自减:--x(将x 的值减少1) //自增/自减前缀:int a=5 ;int b=++a; //a 和b 都是6int c=a--; //a 是6,c 是5 //后递增/递减:int a=5; //a 是6,b 是5int c=a--; //a 为5,c 为6 //一元逻辑表达式//逻辑NOT:x(如果x 为true,则结果为false,反之亦然) Boolean flag=true;flag; //notFlag 为false //一元按位表达式//按位求反: ~x (反转x 的每一位) int num=5; //二进制表示为101int bitNotNum=~num;但整数溢出了图例,因此它变成二进制的110.(1 的32)。

b9cb5d44fe46463ba82a0bf20acd542c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=qwPbbLANXTHdkbTDFqwp7m0STCU%3D

姓名

解释

值类型

例子

DSL 规则

是前缀

是否前置运算符

布尔值

一个++;

unaryOperation uo 其中uo.isPrefix==false;

操作数

经营目标

任意节点

我++;

unaryOperation uo 其中uo.operand.name==“i”;

操作员

操作员

细绳

我++;

unaryOperation uo 其中uo.operator==“++”;

3.5. 二元表达式(binaryOperation)

二进制表达式包含两个操作数并返回单个值。

代码示例

//四个算术二项式//加法:x + y //减法:x - y //乘法:x * y //除法:x/y //模(余数):x % yint a=10 ;int b=3;int sum=a + b; //13int Difference=a - b; //30int quotient=a //1//比较二进制表达式。 //等于:x==y //不等于:x !=y //大于:x y //小于:x y //大于等于:x=y //小于等于: x=yint x=5;int y=10;boolean isEqual=(x==y) //falseboolean isNotEqual=(x !=y); //trueboolean isLessThan=(x y); //falseboolean isLessThanOrEqual=(x=y); //trueboolean isGreaterThanOrEqual=(x=y); //逻辑与: x y //逻辑或: x y //异或: x ^ y //条件与(): x y (x is true ) //条件OR (|): x y (如果x 为true,则忽略y 的结果) ) boolean Condition 1=true;boolean Condition 2=false;boolean andResult=Condition 1 Condition 2; //falseboolean orResult=条件1 || trueboolean xorResult=条件1 ^ 条件2; //trueint num1=5;int num2=3;boolean=num1 num2; //5 3 的二进制表示都是101 所以true //位二进制表达式//位与:x y //位或:x y //位异或:x ^ y //位左移:x n(将x 的二进制表示形式向左移动n 位) //位右移(算术):x n (逻辑的移位二进制表示): x n (移位二进制表示001int resultBitwiseOr=number | 3; //101 | 011=111int resultBitwiseXor=number ^ 3,所以result 为2 //101,所以结果为10。 left 变成1010int resultRightShift=number 1; //101 向右移动一位,所以结果是2。 resultRightShiftLogical=number 1; //结果为2,逻辑右移,忽略符号位。二项式//简单赋值:x=y//加法相等:x +=y//减法相等:x -=y//乘法相等:x *=y//除法相等:x/=y//模等于:右移等于:x=n //位右移逻辑等于:x=nint num=5;num +=3; //num is 8num *=2; 16号。=4; //num 变为4num %=3; //num 变为1

018faaa5aaf04629b89b8987adc90afd~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=zyvEtYe6ae9auWxeZBVsr0%2FNVSM%3D 姓名

解释

值类型

例子

DSL 规则

左边

二进制表达式的左值

文字类节点、valueAccess 类节点、functionCall 类节点

整数i=1;

binaryOperation bo 其中bo.lhs.name==“i”;

操作员

二元表达式运算符

细绳

而(我==1)

binaryOperation bo 其中bo.operator==“==”;

右肩

二进制表达式的右值

文字类节点、valueAccess 类节点、functionCall 类节点

一个b;

binaryOperation bo 其中bo.rhs.name==“b”;

歌剧的

ds 二元表达的操作对象(左值和右值) 节点集合 a > b; binaryOperation bo where bo.operands contain op where op.name == “a”;

3.6. 条件表达式/三目运算(ternaryOperation)

条件表达式,也称为三目运算符(Ternary Operator),是一种简洁的条件语句,格式如下: result = condition ? value_if_true : value_if_false;这里的 condition 是一个布尔表达式,value_if_true 是当条件为 true 时的结果,而 value_if_false 是当条件为 false 时的结果。这个表达式的结果 result 将是两个值中的一个,取决于条件的真假。 样例代码 // 基本使用int a = 10;int b = 20;// max 将被赋值为 20,因为 20 大于 10int max = (a > b) ? a : b; // 嵌套使用int x = 5;// result 将是 "x 大于 5"String result = (x > 10) ? "x 大于 10" : ((x > 5) ? "x 大于 5" : "x 小于等于 5");// 与赋值结合int score = 85;// grade 将被赋值为 "B"String grade = (score >= 90) ? "A" : ((score >= 80) ? "B" : "C");// 用于方法调用// outcome 将随机是 "Heads" 或 "Tails"String outcome = (Math.random() > 0.5) ? "Heads" : "Tails";// 与循环结合for (int i = 0; i < 10; i++) { // 将打印出 0, -1, 4, -3, 等等 int value = (i % 2 == 0) ? i * i : -i; System.out.println(value);}图例 d913872788284f52917881e0039d5ef8~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=%2FkpXgCIm%2B3ZAQT9Z9hHkKiq2aKQ%3D名称 描述 值类型 示例 DSL 规则 condition 判断条件 binaryOperation boolean res = num > 1 ? true : false; ternaryOperation tp where tp.condition.lhs.name == “num”; thenExpression 真的操作 任意节点 boolean res = num > 1 ? true : false; ternaryOperation tp where tp.thenExpression contain literal ll where ll.value == true; elseExpression 假的操作 任意节点 String str = num > 1 ? “true” : “false”; ternaryOperation tp where tp.elseExpression contain literal ll where ll.value == “false”;

3.7. 方法引用表达式(methodReferenceExpression)

方法引用(Method References),它是一种快捷的Lambda表达式,允许你直接引用已有方法或构造函数。方法引用通常用于实现简单的函数式接口。 样例代码 // 静态方法引用List<String> list = Arrays.asList("a", "b", "c");// System.out::println 是一个方法引用,它引用了 System.out 对象的 println 静态方法。list.forEach(System.out::println);// 实例方法引用// 当Lambda体需要调用一个实例方法时,第一个参数将成为方法的调用者:List<String> list = Arrays.asList("hello", "world");// String::toLowerCase 是一个方法引用,它引用了 String 类的 toLowerCase 实例方法。String result = list.stream() .map(String::toLowerCase) .collect(Collectors.joining(" "));// result 将是 "hello world"// 构造函数引用// StringBuilder::new 是一个构造函数引用,它引用了 StringBuilder 类的构造函数。Function<String, StringBuilder> constructor = StringBuilder::new;StringBuilder sb = constructor.apply("Hello World");// 特定类的任意对象的实例方法引用// 当Lambda的第一个参数是某个类的对象时,可以使用类名加 :: 加方法名的方式引用该类的实例方法:List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// upperCaseNames 包含了 "ALICE", "BOB", "CHARLIE"List<String> upperCaseNames = names.stream() .map(String::toUpperCase) .collect(Collectors.toList());// 数组的实例方法引用// 对于数组,可以使用数组类型加 ::new 来引用数组的构造方法:// String[]::new 是一个方法引用,它引用了 String[] 类型的构造方法。Function<Integer, String[]> creator = String[]::new;// 创建了一个长度为3的String数组String[] strings = creator.apply(3);图例 4d0489d7b6cf4c7c8ee7dbaf4b015a0c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=5OTD2xfkEnDlnuv39zEzDkXOgbM%3D名称 描述 值类型 示例 DSL 规则 name 方法名 字符串 Supplier<Integer> size = list::size; methodReferenceExpression mf where mf.name == “size”; function 调用的方法 functionDeclaration节点 Supplier<Integer> size = list::size; methodReferenceExpression mf where mf.function.name == “size”; type 方法返回值类型 objectType节点 Supplier<Integer> size = list::size; methodReferenceExpression mf where mf.type.name == “int”;

3.8. lambda表达式(lambdaExpression)

Lambda 表达式是一种简洁的匿名函数表达式,允许你将行为作为参数传递给方法或存储在变量中。Lambda 表达式提供了一种非常灵活和强大的方式来处理函数式编程,使得代码更加简洁和表达性强。 样例代码 // 基本 Lambda 表达式// 这个 Lambda 表达式没有参数,执行的操作是打印 "Hello, World!"。() -> System.out.println("Hello, World!");// 带参数的 Lambda 表达式// 这个 Lambda 表达式接受两个参数 x 和 y,执行的操作是将它们相加。(x, y) -> x + y// 使用 Lambda 表达式实现 Runnable// 这里创建了一个 Runnable 实例,它将在调用 run 方法时执行 Lambda 表达式。Runnable runnable = () -> System.out.println("I'm running on a thread!");runnable.run();// 使用 Lambda 表达式排序集合// 在这个例子中,Lambda 表达式实现了 Comparator 接口,用于按字典顺序排序字符串。List<String> names = Arrays.asList("Alice", "Bob", "Charlie");Collections.sort(names, (name1, name2) -> name1.compareTo(name2));// 使用 Lambda 表达式过滤集合// 这里使用 Lambda 表达式创建了一个流,过滤出长度小于 5 的名字。List<String> shortNames = names.stream() .filter(name -> name.length() < 5) .collect(Collectors.toList());// 输出集合中的单数list.forEach(integer -> { if (integer % 2 == 1) { System.out.println("单数"); }});// 使用 Lambda 表达式转换集合// 在这个例子中,Lambda 表达式用于将每个名字转换为其长度。List<Integer> lengths = names.stream() .map(name -> name.length()) .collect(Collectors.toList());// 使用 Lambda 表达式实现简单的函数// Lambda 表达式 name -> name.length() 实现了 Function 接口,用于返回字符串的长度。Function<String, Integer> lengthFunction = name -> name.length();int length = lengthFunction.apply("Hello");// 使用 Lambda 表达式实现消费者// Lambda 表达式 name -> System.out.println(name.toUpperCase()) 实现了 Consumer 接口,用于打印字符串的大写形式。Consumer<String> consumer = name -> System.out.println(name.toUpperCase());consumer.accept("Alice");// 使用 Lambda 表达式实现供应商// Lambda 表达式 () -> "Hello, Lambda!" 实现了 Supplier 接口,用于提供字符串。Supplier<String> supplier = () -> "Hello, Lambda!";String message = supplier.get();图例 e64a92a15a3148bcb7a8da52def24b1c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=2bT6Hh5FoAXLMUnLZBu%2BuTuzsi0%3D名称 描述 值类型 示例 DSL 规则 parameters 参数 paramDeclaration节点 list.forEach(integer -> { if (integer == 1) { System.out.println(“单数”); } }); lambdaExpression le where le.parameters contain p where p.name == “integer”; body 方法体 block语句块 list.forEach(integer -> { if (integer == 1) { System.out.println(“单数”); } }); lambdaExpression le where le.body contain variableAccess va where va.name == “integer”; body.statementNum 语句数量 数值 list.forEach(integer -> { if (integer == 1) { System.out.println(“单数”); } }); lambdaExpression le where le.body.statementNum == 1; firstStatement 第一条语句 任意节点 list.forEach(integer -> { if (integer == 2) { System.out.println(“单数”); } }); lambdaExpression le where le.firstStatement contain ifBlock; lastStatement 最后一条语句 任意节点 list.forEach(integer -> { if (integer == 3) { System.out.println(“单数”); } System.out.print(“双数”); }); lambdaExpression le where le.lastStatement contain functionCall fc where fc.name == “print”;

3.9. 匿名内部类表达式(anonymousInnerClassExpression)

匿名内部类是当需要创建一个仅用于一次使用的类时使用的一种特殊类。它没有名称,并且通常是在声明的同时实例化。 匿名内部类提供了一种快速实现接口或继承类的方法,而无需定义一个具体的类名。这在创建一次性使用的类时非常有用,可以减少代码的冗余。 样例代码 // 作为方法参数// 调用方法时使用匿名内部类// 假设有一个方法需要一个 List 作为参数,我们可以直接在调用时创建一个匿名内部类:// 这里,我们创建了一个实现了 ArrayList 的匿名内部类,并在构造器中添加了元素。process(new ArrayList<String>() { { add("Item 1"); add("Item 2"); }});// 实现接口// 在这个例子中,我们创建了一个实现了 Runnable 接口的匿名内部类,并重写了 run 方法。new Thread(new Runnable() { @Override public void run() { System.out.println("Hello from a thread!"); }}).start();// 重写接口的多个方法// 使用 Comparator 进行排序// 在这个例子中,我们创建了一个实现了 Comparator 接口的匿名内部类,用于按字典顺序比较字符串。List<String> names = Arrays.asList("Bob", "Alice", "Eve");Collections.sort(names, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); }});// 如果需要实现一个接口并重写多个方法,也可以使用匿名内部类:new SomeInterface() { @Override public void method1() { // 实现细节 } @Override public void method2() { // 实现细节 }};// 继承一个类// 匿名内部类也可以继承一个类,并重写其方法:// 在这个例子中,我们创建了一个继承自 SomeClass 的匿名内部类,并重写了 someMethod 方法。new SomeClass() { @Override public void someMethod() { // 重写方法 }};new MemberClass() { // 告警行 @Override public void f() { int i = 0; System.out.println("aaaaa"); }}.f();图例 01aa2b54017d4cd8a48a7a25c3a424c7~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=mwq%2BQSZs5DVIeMQNQuOU%2FjyUgdg%3D名称 描述 值类型 示例 DSL 规则 name 名字 字符串 public static void main(String[] args) { new MemberClass() { @Override public void f() { } }.f(); } anonymousInnerClassExpression ac where and( ac.name == “MemberClass”, ac.enclosingFunctionName == “main” ); anonymousClassBody 类代码块 任意节点集合 public static void main(String[] args) { new MemberClass() { @Override public void f() { } }.f(); } anonymousInnerClassExpression ac where ac.anonymousClassBody ab contain functionDeclaration;

4. CodeNavi插件

在Vscode 的插件中,查询:codenavi,并安装。 be73f1b3d7194169bd6f7f9982791179~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1721373887&x-signature=z8%2BhA8ijftHw3xsSLC3baXq%2FOik%3D使用插件的链接安装: https://marketplace.visualstudio.com/items?itemName=HuaweiCloud.codenavi 关注#华为云开发者联盟# 点击下方,第一时间了解华为云新鲜技术~ 华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云 版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除
标题:代码检查法有哪些方法,代码检查英文
链接:www.ggaan.com/news/xydt/9753.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
阴阳师4月22日更新内容:帝释天上线技能调整,红莲华冕活动来袭

阴阳师4月22日更新内容:帝释天上线技能调整,红莲华冕活动来袭[多图],阴阳师4月22日更新的内容有哪些?版本更新

2024-07-12
四川电视台经济频道如何培养孩子的学习习惯与方法直播在哪看?直播视频回放地址

四川电视台经济频道如何培养孩子的学习习惯与方法直播在哪看?直播视频回放地址[多图],2021四川电视台经济频

2024-07-12
湖北电视台生活频道如何培养孩子的学习兴趣直播回放在哪看?直播视频回放地址入口

湖北电视台生活频道如何培养孩子的学习兴趣直播回放在哪看?直播视频回放地址入口[多图],湖北电视台生活频道

2024-07-12
小森生活金币不够用怎么办?金币没了不够用解决方法

小森生活金币不够用怎么办?金币没了不够用解决方法[多图],小森生活金币突然就不够用的情况很多人都有,金币没

2024-07-12