Java静态代码分析工具

Java静态代码分析工具
Java静态代码分析工具

Java静态代码分析工具

一.静态代码分析概念

静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配、有歧义的嵌套语句、错误的递归、非法计算和可能出现的空指针引用等等。在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30%至70%的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。

二.静态代码分析工具的优势

1.帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。

2.帮助代码设计人员更专注于分析和解决代码设计缺陷。

3.显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。

三.Java 静态代码分析理论基础和主要技术

1.缺陷模式匹配:缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待

分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。这种方式的优点是简单方便,但是要求内置足够多缺陷模式,且容易产生误报。

2.类型推断:类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每

条语句都针对正确的类型执行。这种技术首先将预定义一套类型机制,包括类型等价、类型包含等推理规则,而后基于这一规则进行推理计算。类型推断可以检查代码中的类型错误,简单,高效,适合代码缺陷的快速检测。

3.模型检查:模型检验建立于有限状态自动机的概念基础之上,这一理论将被分析代码抽

象为一个自动机系统,并且假设该系统是有限状态的、或者是可以通过抽象归结为有限状态。模型检验过程中,首先将被分析代码中的每条语句产生的影响抽象为一个有限状态自动机的一个状态,而后通过分析有限状态机从而达到代码分析的目的。模型检验主要适合检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。

4.数据流分析:数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变

量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。数据流分析主要适合检验程序中的数据域特性。

四.现有主流Java静态分析工具

1.FindBugs

FindBugs 是由马里兰大学提供的一款开源Java 静态代码分析工具。FindBugs 通过检查类文件或JAR 文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成

静态代码分析。FindBugs 既提供可视化UI 界面,同时也可以作为Eclipse 插件使用。

文本将主要使用将FindBugs 作为Eclipse 插件。在安装成功后会在eclipse 中增加FindBugs perspective,用户可以对指定Java 类或JAR 文件运行FindBugs,此时FindBugs 会遍历指定文件,进行静态代码分析,并将代码分析结果显示在FindBugs perspective 的bugs explorer 中。FindBugs运用Apache BCEL 库分析类文件(class 文件)而不是源代码,将字节码与一组缺陷模式进行对比以发现可能的问题。FindBugs 的检测器已增至300多条,被分为不同的类型,常见的类型如下:

(1)正确性(Correctness):这种归类下的问题在某种情况下会导致bug,比如错误的强制类型转换等。

(2)最佳实践反例(Bad practice):这种类别下的代码违反了公认的最佳实践标准,比如某个类实现了equals方法但未实现hashCode方法等。

(3)多线程正确性(Multithreaded correctness):关注于同步和多线程问题。

(4)性能(Performance):潜在的性能问题。

(5)安全(Security):安全相关。

(6)高危(Dodgy):FindBugs团队认为该类型下的问题代码导致bug的可能性很高。

右键单击你要检测的工程、包或文件,-->Find Bugs-->Find Bugs,check完成后将在Bug Explorer视图中看到问题列表,该列表以问题类型组织。

展开列表,双击列表中具体的问题就可以定位的具体的代码行。

配置FindBugs:选择你的项目,右键=> Properties => FindBugs =>

Detector Configuration选择项:

2.PMD

PMD扫描java代码并寻找潜在的如下问题:

(1)可能的bug - 空try/catch/finally/switch语句

(2)无效代码-未使用的变量,参数和私有方法

(3)非最佳的代码- 较耗费资源的String/StringBuffer用法

(4)过于复杂的表达式- 不必要的if语句,或应该为while的for循环

(5)重复代码- 复制/粘贴代码意味着复制/粘贴bug

PMD的配置:

测试结果:

用CPD 捕捉代码重复:Eclipse 的PMD 插件提供了一项叫做CPD(或复制粘贴探测器)的功能,用于寻找重复的代码。为在Eclipse 中使用这项便利的工具,需要安装具有PMD 的Eclipse 插件,该插件具有CPD 功能。为寻找重复的代码,请用右键单击一个Eclipse 项目并选择PMD | Find Suspect Cut and Paste,如图所示:

靠人工来寻找重复的代码是一项挑战,但使用像CPD 这样的插件却能在编码时轻松地发现重复的代码。

3. CheckStyle

CheckStyle能够帮助Java开发人员准守某些编码规范的工具。它能够自动检查代码。

CheckStyle主要检查的内容有:Java注释、命名约定、标题、Import语句、大小检查、空白、修饰符、块、代码问题、类设计和混合检查。

CheckStyle默认的规范检查文件是Sun Checks,还有另外一个Sun Checks(Eclipse)可选,从配置文件的结构看,结构几乎是一模一样的,只不过Sun Checks(Eclipse)的规范比Sun Checks更严格。

一般Sun Checks的检查项限定得较为严格,我们实际项目中并不要求那么完美的编程规范,那么可以自己定义检查的配置文件,最后将CheckStyle的配置文件设定为我们自定义的文件即可。也可以在现有的配置文件中根据需求增加和删除相应的模块。

4. Eclipse 提供一种叫做Metrics 的插件,使用该插件可以进行许多有用的代码度量,包括圈复杂度度量。安装Metrics 插件并重启Eclipse;然后遵循下列步骤:右键单击您的项目并选择Properties 菜单。在结果窗口中,选择Enable Metrics plugin 复选框并单击OK,如图所示:

从Eclipse 中选择Window 菜单打开Metrics 视图,然后选择Show View | Other...。选择Metrics | Metrics View 打开如图13 中显示的窗口。您需要使用Java 透视图并重新构建项目,从而显示这些度量值。

Eclipse Metrics 插件还提供了许多功能强大的度量值,有助于您在开发软件的过程中改进代码——可见,它是一个渐进编程意义上的插件!

5.JDepend

JDepend是一个开源的工具,并配有Eclipse插件,在实际应用中,JDepend遍历所有的Java 代码目录,自动生成每个Package的依赖性度量。对于可扩展性、可重用性和可管理性,JDepend可自动度量一个设计在以上三个方面的质量。

CC:具体类数量

AC:抽象类(和接口)数量

Ca: 被分析package的类所依赖的其他package的数量,用于衡量package的独立性。即它调用了多少其他包。

Ce: 被分析package的类所依赖的其他package的数量,用于衡量package的独立性。

即它调用了多少其他包。

A: 被分析package中的抽象类和接口与所在package所有类数量的比例,取值范围为0-1。I: I=Ce/(Ce+Ca),用于衡量package的不稳定性,取值范围为0-1。I=0表示最稳定,I=1表示最不稳定。即如果这个类不调用任何其他包,则它是最稳定的。

D: 被分析package和理想曲线A+I=1的垂直距离,用于衡量package在稳定性和抽象性之间的平衡。理想的package要么完全是抽象类和稳定(x=0,y=1),要么完全是具体类和不稳定(x=1,y=0)。取值范围为0-1,D=0表示完全符合理想标准,D=1表示package最大程度地偏离了理想标准。即你的包要么全是接口,不调用任何其他包(完全是抽象类和稳定),要么是具体类,不被任何其他包调用。

6.JS工具:

Aptana:Aptana中的智能提示称为 Code Assist,相当于VS中的Intellisense。

具有浏览器兼容性的提示

不仅仅是javascript,智能提示的范围还包括DOM 1,2 for HTML,CSS。

Doument outline(文档结构)CSS、HTML、JS统一显示:

JSEclipse:可以在eclipse里面调试javascript,但是找不到下载地址了。JCSC

静态分析、测试工具.doc

静态代码分析、测试工具汇总 静态代码扫描,借用一段网上的原文解释一下 ( 这里叫静态检查 ) :“静态测试包括代码检查、 静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势, 也可以借助软件工具自动进行。代码检查代码检查包括代码走查、桌面检查、代码审查等, 主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代 码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊 的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型 审查、程序逻辑审查、程序语法检查和程序结构检查等内容。”。 我看了一系列的静态代码扫描或者叫静态代码分析工具后,总结对工具的看法:静态代码 扫描工具,和编译器的某些功能其实是很相似的,他们也需要词法分析,语法分析,语意 分析 ...但和编译器不一样的是他们可以自定义各种各样的复杂的规则去对代码进行分析。 以下将会列出的静态代码扫描工具,会由于实现方法,算法,分析的层次不同,功能上会 差异很大。有的可以做 SQL注入的检查,有的则不能 ( 当然,由于时间问题还没有对规则进行研究,但要检查复杂的代码安全漏洞,是需要更高深分析算法的,所以有的东西应该不 是设置规则库就可以检查到的,但在安全方面的检查,一定程度上也是可以通过设置规则 进行检查的 )。 主 工具名静态扫描语言开源 / 厂商介绍 页付费网 址 https://www.360docs.net/doc/4a18629800.html,、C、 ounec5.0 C++和 C#,付 Ounce Labs \ 还支持费 Java。 还有其他辅助工具: 1.Coverity Thread Coverity C/C++,C#,JAV Analyzer for Java 付费Coverity 2.Coverity Software Prevent A Readiness Manager for Java 3.Coverity

静态代码分析

静态代码分析 一、什么是静态代码分析 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。 在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。 静态代码分析工具的优势 1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。 2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。 3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。 二、主流Java静态分析工具 Findbugs、checkstyle和PMD都可以作为插件插入eclipse,当然也有单独的工具可以实现他们的功能,比如Findbugs Tool就可以不必插入eclipse就可以使用。 三者的功能如下表: 工具目的检查项 FindBugs 检查.class 基于Bug Patterns概念,查 找javabytecode(.class文件) 中的潜在bug 主要检查bytecode中的bug patterns,如NullPoint空指 针检查、没有合理关闭资源、字符串相同判断错(==, 而不是equals)等 PMD 检查源文件检查Java源文件中的潜在问 题 主要包括: 空try/catch/finally/switch语句块 未使用的局部变量、参数和private方法 空if/while语句 过于复杂的表达式,如不必要的if语句等 复杂类

100道Java基础测试题

Java基础测试题 不定项选择题 1、面向对象的三大特征是() A) 封装B) 继承C) 多态D) 线性 2、变量命名规范说法正确的是() A) 变量由英文字母、下划线、数字、$符号组成 B) 变量不能以数字作为开头 C) A和a在Java中代表同一个变量 D) 不同类型的变量,可以起相同的名字 3、i的值为10,表达式(i++)+(i--)的值为() A) 21B) 20 C) 19 D) 18 4、下面哪些定义变量的语句是正确的?() A) int i = 'A'; B) float f = 1.23; C) byte b = (byte)128; D) int c[5][5] = new int[ ][ ]; 5、以下代码的执行结果是() int a = 1; bool ean m = a%2 = = 1; if(m = false){ System.out.println("false"); }else{ System.out.println("true"); } A) false B) true C) 编译不通过 6、以下程序段中,哪个选项不能插入到第二行?() A)class Demo2 { } B) import java.util.*; C) public static void main(String args[ ]) { } D) package com; E) public class Demo2 { } 7、下面有关Java循环结构的描述正确的是() A) for循环体语句中,可以包含多条语句,但要用大括号括起来 B) for循环和do...while循环都是先执行循环体语句,后进行条件判断 C) continue和break只能用于循环结构中 D) 增强for循环遍历数组时不需要知道数组的长度,但不能实现与下标相关的操作 8、switch选择语句是多分支选择语句,只能处理等值条件判断的情况。在jdk1.7中,switch中的表达式可以是以下哪种类型() A)int B)char C)double D) float E)String F) short

静态代码检查工具Sonar的安装和使用

静态代码检查工具Sonar的安装和使用 目录 静态代码检查工具Sonar的安装和使用 (1) 第一章、Sonar简介 (2) 第二章、Sonar原理 (3) 第三章、Sonarqube安装 (5) 3.1、下载安装包 (5) 3.2、数据库连接方式 (5) 3.3、启动 (7) 3.4、插件引用 (8) 第四章、SonarQube Scanner安装 (10) 4.1、下载安装 (10) 4.2、数据库连接方式 (12) 4.3、启动并执行代码检查 (13) 4.4、查看执行结果 (16) 4.5、启动失败原因 (18)

第一章、Sonar简介 Sonar (SonarQube)是一个开源平台,用于管理源代码的质量。Sonar 不只是一个质量数据报告工具,更是代码质量管理平台。支持的语言包括:Java、PHP、C#、C、Cobol、PL/SQL、Flex 等。 开源中国代码质量管理系统->https://www.360docs.net/doc/4a18629800.html,/ 主要特点: ?代码覆盖:通过单元测试,将会显示哪行代码被选中 ?改善编码规则 ?搜寻编码规则:按照名字,插件,激活级别和类别进行查询 ?项目搜寻:按照项目的名字进行查询 ?对比数据:比较同一张表中的任何测量的趋势

第二章、Sonar原理 SonarQube 并不是简单地将各种质量检测工具的结果(例如FindBugs,PMD 等)直接展现给客户,而是通过不同的插件算法来对这些结果进行再加工,最终以量化的方式来衡量代码质量,从而方便地对不同规模和种类的工程进行相应的代码质量管理。 SonarQube 在进行代码质量管理时,会从图1 所示的七个纬度来分析项目的质量。

构造代码块与静态代码块

构造代码块(了解) 编码是基本不用,面试时考的可能性大。 1什么是构造代码块 构造代码块,又叫实例初始化块(实例块)。 它是被类体直接包含的,它是类的成员之一。 它也是无名块 2实例块的语法 class Demo { { System.out.println(“hello world”); } } 实例块是被类体直接包含的。 实例块中可以放0 ~ n条语句。 3实例块什么时候执行 与显示初始化语句同时执行(创建对象时执行)。它们的执行顺序是按上下顺序执行的!class Person { {System.out.println("hello1");} //a private String name = "zhangSan"; //1 {System.out.println("hello2");} //b private int age = 100; //2 {System.out.println("hello3");} //c private String sex = "male"; //3 {System.out.println("hello4");} //d } 当创建一个Person对象时,执行顺序是a、1、b、2、c、3、d。

4实例块的局限性 一般情况下没有使用实例块的必要,只有在匿名内部类中,需要使用构造器时才会使用实例块来充当构造器的作用。 实例块只能对下面定义的属性做写操作,而不能做读操作。 实例块对上面定义的属性就没有限制了。读写操作都可以。 class Person { { name = "zhangSan";//OK,对下面定义的属性做写操作 System.out.println(name);// 错误,不能对下面定义的属性做读操作 } private String name; { name = "liSi";//OK,对上面定义的属性做什么操作都可以 System.out.println(name);//OK,对上面定义的属性做什么操作都可以 } } 静态块(掌握) 在就业班中会看到它的使用。使用的不是很多! 1什么是静态块 静态块,又叫静态构造代码块、静态初始化块。 它是被类体直接包含的,它是类的成员之一。 使用static修饰的块 2静态块的语法 class Demo { static { System.out.println(“hello world”); } } 静态块是被类体直接包含的。 静态块中可以放0 ~ n条语句。

Java静态检测工具的简单介绍 - Sonar、Findbugs

Java静态检测工具的简单介绍- Sonar、Findbugs 2010-11-04 13:55:54 标签:sonar休闲职场 Java静态检测工具的简单介绍 from: https://www.360docs.net/doc/4a18629800.html,/?p=9015静态检查:静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人 工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。 代码检查代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和 设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代 码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、 不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题, 包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构 检查等内容。”。看了一系列的静态代码扫描或者叫静态代码分析工具后, 总结对工具的看法:静态代码扫描工具,和编译器的某些功能其实是很相似的, 他们也需要词法分析,语法分析,语意分析...但和编译器不一样的是他们可 以自定义各种各样的复杂的规则去对代码进行分析。 静态检测工具: 1.PMD 1)PMD是一个代码检查工具,它用于分析 Java 源代码,找出潜在的问题: 1)潜在的bug:空的try/catch/finally/switch语句 2)未使用的代码:未使用的局部变量、参数、私有方法等 3)可选的代码:String/StringBuffer的滥用

4)复杂的表达式:不必须的if语句、可以使用while循环完成的for循环 5)重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs 2)PMD特点: 1)与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在 不运行Java程序的情况下报告错误。 2)PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许 多问题 3)用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。 3)同时,PMD已经与JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、 CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、 IntelliJ IDEA、TextPad、Maven、Ant、Gel、JCreator以及Emacs 集成在一起。 4)PMD规则是可以定制的: 可用的规则并不仅限于内置规则。您可以添加新规则: 可以通过编写 Java 代码并重新编译 PDM,或者更简单些,编写 XPath 表 达式,它会针对每个 Java 类的抽象语法树进行处理。 5)只使用PDM内置规则,PMD 也可以找到你代码中的一些真正问题。某些问题可能 很小,但有些问题则可能很大。PMD 不可能找到每个 bug,你仍然需要做单元测 试和接受测试,在查找已知 bug 时,即使是 PMD 也无法替代一个好的调试器。

Java选择题

Java 练习题 一、单选题 1.Java 程序的执行过程中用到一套JDK 工具,其中 java.exe 是指( B ) A. Java文档生成器 B. Java解释器 C. Java编译器 D. Java类分解器 2.编译 Java程序的命令文件名是(B) A. java.exe B. javac.exe C. javac D. appletviewer.exe 3.编译 Java程序 file.java后生成的程序是(C) A. file.html B. File.class C. file.class D. file.jar 4.Java 语言与其他主要语言相比较,独有的特点是( C ) A. 面向对象 B. 多线程 C. 平台无关性 D. 可扩展性 5.声明 Java独立应用程序main()方法时,正确表达是( A ) A. public static void main(String[] args){ ?} B. private static void main(String args[]){?} C. public void main(String args[]){?} D. public static void main(){?} 6.下列有关 Java 语言的叙述中,正确的是(B)。 A. Java是不区分大小写的 B.源文件名与 public 类型的类名必须相同 C. 源文件的扩展名为 .jar D.源文件中 public类的数目不限 7.Java 用来定义一个新类时,所使用的关键字为( A)。 A. class B. public C. struct D. class 或 struct 8 .一个可以独立运行的Java 应用程序( D )。 A. 可以有一个或多个main方法 B. 最多只能有两个main 方法 C. 可以有一个或零个main方法 D. 只能有一个main方法 9.下面哪个是 Java 语言中正确的标识符(B ) A. 3D B. $this C. extends D. implements 10.下面哪个不是 Java 的保留字或关键字 ?( B ) A. default B. NULL C. throws D. long 11.对if(? )句型括号中的表达式,下列Java 类型中哪一个是合法的?( C ) A. byte B. short C. boolean D. Object reference 12. Java中整型包括(D)。 A. int , byte , char B. int , short , long , byte , char C. int , short , long , char D. int , short , long , byte

四款优秀的源代码扫描工具简介

一、DMSCA-企业级静态源代码扫描分析服务平台 端玛企业级静态源代码扫描分析服务平台(英文简称:DMSCA)是一个独特的源代码安 全漏洞、质量缺陷和逻辑缺陷扫描分析服务平台。该平台可用于识别、跟踪和修复在源代码 中的技术和逻辑上的缺陷,让软件开发团队及测试团队快速、准确定位源代码中的安全漏洞、质量和业务逻辑缺陷等问题,并依据提供的专业中肯的修复建议,快速修复。提高软件产品 的可靠性、安全性。同时兼容并达到国际、国内相关行业的合规要求。 DMSCA是端玛科技在多年静态分析技术的积累及研发努力的基础上,联合多所国内及国 际知名大学、专家共同分析全球静态分析技术的优缺点后、结合当前开发语言的技术现状、 源代码缺陷的发展势态和市场后,研发出的新一代源代码企业级分析方案旨在从根源上识别、跟踪和修复源代码技术和逻辑上的缺陷。该方案克服了传统静态分析工具误报率(False Positive)高和漏报(False Negative)的缺陷。打断了国外产品在高端静态分析产品方面的垄断,形成中国自主可控的高端源代码安全和质量扫描产品,并支持中国自己的源代码检测方 面的国家标准(GB/T34944-2017 Java、GB/T34943-2017 C/C++、GB/T34946-2017 C#),致 力于为在中国的企业提供更直接,更个性化的平台定制和本地化服务。 DMSCA支持主流编程语言安全漏洞及质量缺陷扫描和分析,支持客户化平台界面、报告、规则自定义,以满足客户特定安全策略、安全标准和研发运营环境集成的需要。产品从面世,就获得了中国国内众多客户的青睐,这些客户包括但不限于银行、在线支付、保险、电力、 能源、电信、汽车、媒体娱乐、软件、服务和军事等行业的财富1000企业。 1、系统架构 2、系统组件

Java中的static变量、方法、代码块

1、static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。 2、static方法 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!! 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。 3、static代码块 static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。 例子: class A{ static{ System.out.println("A static block"); // (3)运行 } { System.out.print("Q"); // (5)运行 } public A (){ System.out.println("x"); // (6)运行 } } class B extends A{ static{ System.out.println("B static block"); // (4)运行 } { System.out.print("W"); // (7)运行 }

4种代码扫描工具分析

简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。 引言 在Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。Java 静态代码分析(static code analysis)工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省软件开发和测试成本。目前市场上的Java 静态代码分析工具种类繁多且各有千秋,因此本文将分别介绍现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),并从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。

静态代码分析工具简介 什么是静态代码分析 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。 在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。 但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。 静态代码分析工具的优势 1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。 2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。 3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。

Java试卷(简单)

《Java试卷(简单)》试卷 得分 单选题(每题2分,共计40分) 1.下面IP地址格式中,错误的是() A、1.1.1.1 B、127.0.0.1 C、192.168.1.360 D、123.125.114.144 2.对于使用多态的应用程序,某个对象的确切类型何时能知道() A、执行时才可以知道 B、应用程序编译时能够判断 C、程序员编写程序时就已知道 D、永远不会知道3.下列关于Socket类的描述中,错误的是() A、Socket类中定义的getInputStream()方法用于返回Socket的输入流对象。 B、Socket类中定义的getOutputStream()方法用于返回Socket的输出流对象。 C、Socket类中定义的getLocalAddress()方法用于获取Socket对象绑定的本地IP地址。 D、Socket类中定义的close()方法用于关闭输入\\输出流对象。 4.下列选项中,属于浮点数常量的是() A、198 B、2e3f C、true D、null 5.下列选项中,不属于Java中关键字的是() A、const B、false C、Final D、try 总分题型单选题判断题填空题简答题题分 得分

6.下列关键字中,用于创建类的实例对象的是() A、class B、new C、private D、void 7.下面关于ArrayList的描述中,错误的是() A、ArrayList是List接口的一个实现类。 B、ArrayList内部的数据存储结构是数组 C、ArrayList不太适合做大量的增删操作 D、使用ArrayList集合遍历和查找元素很高效 8.以下关于foreach的说法中,哪一个是错误的() A、使用foreach遍历集合时,可以对元素进行修改。 B、foreach可以对数组进行遍历。 C、foreach可以对集合进行遍历。 D、foreach循环是一种更加简洁的for循环,也称增强for循环。9.KeyEvent类位于下列哪个包中() A、java.awt B、java.awt.event C、java.awt.dnd D、java.awt.im 10.下面关于静态同步方法说法错误的是() A、静态方法必须使用class对象来同步。 B、对于静态的同步方法而言,该方法的同步监视器不是this,而是该类本身。 C、静态同步方法和以当前类为同步监视器的同步代码块不能同时执行。 D、一个类中的多个同步静态方法可以同时被多个线程执行。 11.下列选项中,正确关闭数据库资源的顺序是() A、resultSet.close() B、atement.close() C、nnection.close() D、statement.close()

Java 中的 static 使用之静态方法

Java 中的static 使用之静态方法 与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。静态方法的使用如: 需要注意: 1、静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如: 如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。如: 、在普通成员方法中,则可以直接访问同类的非静态变量和静态变量,如下所示:

3、静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。如: ava 中的static 使用之静态初始化块 Java 中可以通过初始化块进行数据赋值。如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。 需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。 我们来看一段代码:

运行结果: 通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。 封装 1、概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 2、好处 a:只能通过规定的方法访问数据 b:隐藏类的实例细节,方便修改和实现。 什么是Java 中的内部类 问:什么是内部类呢? 答:内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。 问:那为什么要将一个类定义在另一个类里面呢?清清爽爽的独立的一个类多好啊!! 答:内部类的主要作用如下:

java练习题

public class Multipation { public static void main(String[] args) { 定义一个类Student,属性为学号、姓名和成绩;方法为增加记录SetRecord和得到记录GetRecord。SetRecord给出学号、姓名和成绩的赋值,GetRecord通过学号得到考生的成绩。 public class Student { /** *@param args */ private int ID; private String name; private float score; public void SetRecord(int ID,String name,float score){ =ID; =name; =score; } public float getRecord(int ID){ if(ID== return ; else return -1; } public static void main(String[] args) { 编写程序,测试字符串“你好,欢迎来到Java世界”的长度,将字符串的长度转

换成字符串进行输出,并对其中的“Java”四个字母进行截取,输出截取字母以及它在字符串中的位置。 public class StringTest { /** *@param args */ public static void main(String[] args) { 自己设计一个坐标类,能提供以下方法如求当前坐标和其他坐标之间的距离等方法,要求所有变量为私有变量,并提供两个构造函数。 public class XYdistance { private int x; private int y; XYdistance(){ setX(0); setY(0); } public void setX(int x) { = x; } public int getX() { return x; } public void setY(int y) { = y;

Facebook静态代码分析工具Infer介绍

Facebook静态代码分析工具Infer介绍 作者:暨景书,新炬网络高级技术专家。 随着IT系统的广泛应用,补丁、需求大量变更,版本快速迭代,需要频繁的进行发布,发布管理质量不高,导致故障频繁。如何在上线采取有效措施,将一些潜在的bug扼杀在版本发布之前,优化代码,防止应用的崩溃和性能低下问题,值得我们去探索。 目前行业主要是通过静态代码分析方式,在无需运行被测代码前提下,在构建代码过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省软件开发和测试成本。静态代码分析可以分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等。 Infer是Facebook今年刚开源一款静态分析工具。Infer可以分析Objective-C,Java 或者C代码,重点作用于分析APP(Android/iOS)项目,报告潜在的问题。Infer已经成为 Facebook 开发流程的一个环节,包括Facebook Android和iOS主客户端,Facebook Mes senger,Instagram在内的,以及其他影响亿万用户的手机应用,每次代码变更,都要经过Infer的检测。 先介绍infer相比其它静态分析工具有什么优点: 1、是一款开源静态的代码分析工具; 2、效率高,规模大,几分钟可以扫描数千行代码; 3、支持增量及非增量分析; 4、分解分析,整合输出结果。Infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度。 Infer捕捉的bug类型: 1.Java中捕捉的bug类型 Resource leak Null dereference 2.C/OC中捕捉的bug类型 Resource leak Memory leak Null dereference Premature nil termination argument

面向对象程序设计(Java)-题库

面向对象程序设计(java)题库 抽题规范: (1)此题库共75道题,抽8道作为期末考试题。其中,易8道,较易33道,较难18道,难16道. (2)按题型,第一大题抽4道,每道10分;第二大题抽2道,每道10分;第三大题抽1道,每道20分;第四大题抽1道,每道20分。 (3)按难易程度:易(1道)、较易(4道)、较难(2道)、难(1道)。 一、解答题(共40道,抽4道,每道10分,共40分) 1.面向对象有哪三大特征? 封装,继承,多态. 2.什么是类?(易) 类是定义同一类所有对象的变量和方法的蓝图或原型。 3.什么是对象? 对象是类的实例;对象是通过new className产生的,用来调用类的方法;类的构造方法 .。 4.类和对象的区别是什么? java中的类是模板,而对象是依据模版产生的实体 5.简述Java的封装性,如何在Java中实现封装 封装性是指的把代码封装到大括号中,只能访问自己内部的数据,外边的东西访问不了。 实现为加访问权限。 6.构造方法有哪些特点 方法名与类名相同,没有返回值,可以有多个重载。 7.构造方法的作用是什么?(较易) 初始化对象,就是你new一个类的时候可以很方便的给你的对象里的属性赋值。 8.this在程序中所代表的意思(易) 指当前对象 9继承的作用是什么?(易) 实现代码复用。 10.Java支持多继承吗?(易) 不能。 11.子类可以继承父类的哪些成员?(较难) 变量和构造方法。 12.简述构造子类对象时子类和父类构造方法执行顺序(较易) 先执行父类再执行子类。 13.什么是方法的重载,如何选择被重载的方法?(较易)

同一个类中如果同时存在两个以上的方法有同一个名字,在这种情况下,我们说方法被重载了,这个过程被称为重载。 14什么是方法的重写,如何选择被重写的方法?(较难) 当同名方法同时存在于子类和父类中时,对于子类来说就是将继承父亲的方法重载写过了,实现功能完全和父类无关。 15.简述重载和覆盖的区别(较易) 重载是让同一方法名的方法可以处理和返回不同类型的数据 而覆盖是在子类中改写父类的方法 16.什么是成员的隐藏?如何访问被隐藏了的父类成员?(较易) 在子类对父类的继承中,如果子类的成员变量和父类的成员变量同名,此时称为子类隐藏了父类的成员变量。 Super语句。 17.简述this和super的区别(较难) this 即可以拿到自己的也可以拿到父类的,super 只能拿到父类的 18.简述面向对象的多态性(较易) 一个接口,多个方法 19.简述实例变量和类变量的区别(较易) 1.简述静态方法和实例方法的区别(较易) 2.简述按值传递和按址传递的区别(较难) 3.什么是抽象类?抽象类中一定有抽象方法吗?(较难) 4.什么是接口?接口中的成员有什么特点?(较易) 5.简述抽象类和接口的区别(较易) 6.extends和implements的区别是什么?(较易) 7.final可以用在哪些地方,分别代表什么意思?(较易) 8.static可以用在哪些地方,分别代表什么意思?(较易) 9.静态代码块的作用是什么?它被执行几次?(较易) 10.Java中包的作用是什么(易) 11.在Java中,import和package的区别?(易) 12.public,protected,default,private的区别(较易) 13.内部类的作用是什么?内部类常用在哪里?(较难) 14.简述异常处理机制(较难) 15.简述throw和throws的区别(较易) 16.简述final和finally的区别(较易) 17.列出三个常见的异常并说明其作用(较易) 18.简述String和StringBuffer的区别(较易) 19.集合Collection包含哪两大子接口?它们的区别是什么?(较易) 20.如何把一个字节流转换成字符流?(较易) 21.让一个类成为线程有哪两种方式?(较易) 二、单项编程(共25题,抽2题,每题10分,共20分)

三款静态源代码安全检测工具比较

源代码安全要靠谁? 段晨晖2010-03-04 三款静态源代码安全检测工具比较 1. 概述 随着网络的飞速发展,各种网络应用不断成熟,各种开发技术层出不穷,上网已经成为人们日常生活中的一个重要组成部分。在享受互联网带来的各种方便之处的同时,安全问题也变得越来越重要。黑客、病毒、木马等不断攻击着各种网站,如何保证网站的安全成为一个非常热门的话题。 根据IT研究与顾问咨询公司Gartner统计数据显示,75%的黑客攻击发生在应用层。而由NIST的统计显示92%的漏洞属于应用层而非网络层。因此,应用软件的自身的安全问题是我们信息安全领域最为关心的问题,也是我们面临的一个新的领域,需要我们所有的在应用软件开发和管理的各个层面的成员共同的努力来完成。越来越多的安全产品厂商也已经在考虑关注软件开发的整个流程,将安全检测与监测融入需求分析、概要设计、详细设计、编码、测试等各个阶段以全面的保证应用安全。 对于应用安全性的检测目前大多数是通过测试的方式来实现。测试大体上分为黑盒测试和白盒测试两种。黑盒测试一般使用的是渗透的方法,这种方法仍然带有明显的黑盒测试本身的不足,需要大量的测试用例来进行覆盖,且测试完成后仍无法保证软件是否仍然存在风险。现在白盒测试中源代码扫描越来越成为一种流行的技术,使用源代码扫描产品对软件进行代码扫描,一方面可以找出潜在的风险,从内对软件进行检测,提高代码的安全性,另一方面也可以进一步提高代码的质量。黑盒的渗透测试和白盒的源代码扫描内外结合,可以使得软件的安全性得到很大程度的提高。 源代码分析技术由来已久,Colorado 大学的 Lloyd D. Fosdick 和 Leon J. Osterweil 1976 年的 9 月曾在 ACM Computing Surveys 上发表了著名的 Data Flow Analysis in Software Reliability,其中就提到了数据流分析、状态机系统、边界检测、数据类型验证、控制流分析等技术。随着计算机语言的不断演进,源代码分析的技术也在日趋完善,在不同的细分领域,出现了很多不错的源代码分析产品,如 Klocwork Insight、Rational Software Analyzer 和 Coverity、Parasoft 等公司的产品。而在静态源代码安全分析方面,Fortify 公司和 Ounce Labs 公司的静态代码分析器都是非常不错的产品。对于源代码安全检测领域目前的供应商有很多,这里我们选择其中的三款具有代表性的进行对比,分别是Fortify公司的Fortify SCA,Security Innovation公司的Checkmarx Suite和Armorize 公司的CodeSecure。 2. 工具介绍

java代码静态检查工具介绍

静态检查:静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。 代码检查代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和 设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代 码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构 检查等内容。”。看了一系列的静态代码扫描或者叫静态代码分析工具后, 总结对工具的看法:静态代码扫描工具,和编译器的某些功能其实是很相似的,他们也需要词法分析,语法分析,语意分析...但和编译器不一样的是他们可 以自定义各种各样的复杂的规则去对代码进行分析。 静态检测工具: 1. PMD 1)PMD是一个代码检查工具,它用于分析 Java 源代码,找出潜在的问题: 1)潜在的bug:空的try/catch/finally/switch语句 2)未使用的代码:未使用的局部变量、参数、私有方法等 3)可选的代码:String/StringBuffer的滥用 4)复杂的表达式:不必须的if语句、可以使用while循环完成的for循环 5)重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs 2)PMD特点: 1)与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在 不运行Java程序的情况下报告错误。 2)PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许 多问题 3)用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。 3)同时,PMD已经与JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、 CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、 IntelliJ IDEA、TextPad、Maven、Ant、Gel、JCreator以及Emacs 集成在一起。 4)PMD规则是可以定制的: 可用的规则并不仅限于内置规则。您可以添加新规则: 可以通过编写 Java 代码并重新编译 PDM,或者更简单些,编写 XPath 表 达式,它会针对每个 Java 类的抽象语法树进行处理。 5)只使用PDM内置规则,PMD 也可以找到你代码中的一些真正问题。某些问题可能 很小,但有些问题则可能很大。PMD 不可能找到每个 bug,你仍然需要做单元测试和接受测试,在查找已知 bug 时,即使是 PMD 也无法替代一个好的调试器。 但是,PMD 确实可以帮助你发现未知的问题。 1. FindBugs 1)FindBugs是一个开源的静态代码分析工具,基于LGPL开源协议,无需 运行就能对代码进行分析的工具。不注重style及format,注重检测真正

Java选择题

Java练习题 一、单选题 1. Java程序的执行过程中用到一套JDK工具,其中java.exe是指(B ) A. Java文档生成器 B. Java解释器 C. Java编译器 D. Java类分解器 2. 编译Java程序的命令文件名是(B ) A. java.exe B. javac.exe C. javac D. appletviewer.exe 3. 编译Java程序file.java后生成的程序是(C ) A. file.html B. File.class C. file.class D. file.jar 4. Java语言与其他主要语言相比较,独有的特点是(C ) A. 面向对象 B. 多线程 C. 平台无关性 D. 可扩展性 5. 声明Java独立应用程序main()方法时,正确表达是(A ) A. public static void main(String[] args){…} B. private static void main(String args[]){…} C. public void main(String args[]){…} D. public static void main(){…} 6. 下列有关Java语言的叙述中,正确的是(B )。 A. Java是不区分大小写的 B. 源文件名与public类型的类名必须相同 C. 源文件的扩展名为.jar D. 源文件中public类的数目不限 7. Java用来定义一个新类时,所使用的关键字为(A )。 A. class B. public C. struct D. class 或struct 8.一个可以独立运行的Java应用程序(D )。 A. 可以有一个或多个main方法 B. 最多只能有两个main方法 C. 可以有一个或零个main方法 D. 只能有一个main方法 9. 下面哪个是Java语言中正确的标识符(B ) A. 3D B. $this C. extends D. implements 10. 下面哪个不是Java的保留字或关键字?(B) A. default B. NULL C. throws D. long 11. 对if(…)句型括号中的表达式,下列Java类型中哪一个是合法的?(C ) A. byte B. short C. boolean D. Object reference 12. Java中整型包括( D )。 A. int,byte,char B. int,short,long,byte,char C. int,short,long,char D. int,short,long,byte

相关文档
最新文档