各位老铁们好,相信很多人对扫描网站源码分享关键字都不是特别的了解,因此呢,今天就来为大家分享下关于扫描网站源码分享关键字以及网站链接扫描的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
一、前言
你会对你用到都技术,好奇吗?
虽然我们都被称为码农,也都是写着代码,但因为所处场景需求的不同,所以各类码农也都做着不一样都事情。
有些人统一规范、有些人开发组件、有些人编写业务、有些人倒腾验证,但越是工作内容简单如CRUD一样的码农,用到别人提供好的东西却是越多。一会安装个插件、一会引入个Jar包、一会调别人个接口,而自己的工作就像是装配工,东拼拼西凑凑,就把产品需求写完了。
坏了,这么干可能几年下来,也不会有什么技术上都突破。因为你对那些使用都技术不好奇,不想知道它们是怎么实现的。就像阿里的P3C插件,是怎么检查代码分析出来我写的拉胯的呢?
二、P3C插件是什么
P3C是阿里开源代码库的插件工程名称,它以阿里巴巴Java开发手册为标准,用于监测代码质量的IDEA/Eclipse插件。
源码:https://github.com/alibaba/p3c
插件安装完成后,就可以按照编程规约,静态分析代码中出现的代码:命名风格、常量定义、集合处理、并发处理、OOP、控制语句、注释、异常等各项潜在风险,同时会给出一些优化操作和实例。
在遵守开发手册标准并按照插件检查都情况下,还是可以非常好的统一编码标准和风格都,也能剔除掉一些潜在都风险。如果你是新手编程用户或者想写出标准都代码,那么非常建议你按照这样都插件来辅助自己做代码开发。当然如果你所在的公司也有相应都标准手册和插件,也可以按照后遵守它都约定的。
三、P3C插件源码
在最开始使用这类代码检查都插件的时候,就非常好奇它是怎么发现我的屎山代码的,用了什么样都技术原理呢,如果我能分析下是不是也可以把这样都技术手段用到其他地方。
在分析这样一个代码检查插件前,先思考要从IDEA插件都源码查起,看看它是什么个逻辑,之后分析具体是如何使用都。其实这与一些其他的框架性源码学习都是类似的,拿到官网都文档、GitHub对应的源码,按照步骤进行构建、部署、测试、调试、分析,进而找到核心原理。
P3C以IDEA插件开发为例,主要涉及到插件部分和规约部分,因为是把规约检查的能力与插件技术结合,所以会涉及到一些IDEA开发的技术。另外P3C插件涉及到都技术语言不只是Java还有一部分kotlin它是一种在Java虚拟机上运行的静态类型编程语言。
插件源码:https://github.com/alibaba/p3c/blob/master/idea-plugin规约源码:https://github.com/alibaba/p3c/tree/master/p3c-pmd
1.插件配置p3c.xml
<actionclass=&34;id=&34;\npopup=&34;text=&34;icon=&34;>\n<keyboard-shortcutkeymap=&34;\nfirst-keystroke=&34;/>\n<add-to-groupgroup-id=&34;anchor=&34;/>\n<add-to-groupgroup-id=&34;anchor=&34;/>\n<add-to-groupgroup-id=&34;anchor=&34;/>\n<add-to-groupgroup-id=&34;anchor=&34;/>\n</action>
翻看源码最重要是要找到入口,这个入口通常也是你在使用插件、程序、接口等时候,最直接进入都那部分。那么我们在使用P3C插件的时候,最明显的就是编码规约扫描通过源码中找到这个关键字,看它都涉及了哪个类都配置。action是IDEA插件中用于配置窗体事件入口都地方,以及把这个操作配置到哪个按钮下和对应都快捷键。
2.编码规约扫描(AliInspectionAction)
classAliInspectionAction:AnAction(){\n\noverridefunactionPerformed(e:AnActionEvent){\nvalproject=e.project?:return\nvalanalysisUIOptions=ServiceManager.getService(project,AnalysisUIOptions::class.java)!!\nanalysisUIOptions.GROUP_BY_SEVERITY=true\n\nvalmanagerEx=InspectionManager.getInstance(project)asInspectionManagerEx\nvaltoolWrappers=Inspections.aliInspections(project){\nit.toolisAliBaseInspection\n}\nvalpsiElement=e.getData<PsiElement>(CommonDataKeys.PSI_ELEMENT)\nvalpsiFile=e.getData<PsiFile>(CommonDataKeys.PSI_FILE)\nvalvirtualFile=e.getData<VirtualFile>(CommonDataKeys.VIRTUAL_FILE)\n\n…\n\ncreateContext(\ntoolWrappers,managerEx,element,\nprojectDir,analysisScope\n).doInspections(analysisScope)\n}
这是一个基于kotlin语言开发的插件代码逻辑,它通过actionPerformed方法获取到工程信息、类信息等,接下来就可以执行代码检查了doInspections
3.规约p3c-pmd
当我们再往下翻看阅读的时候,就看到了一个关于pmd的东西。PMD是一款采用BSD协议发布的Java程序静态代码检查工具,当使用PMD规则分析Java源码时,PMD首先利用JavaCC和EBNF文法产生了一个语法分析器,用来分析普通文本形式的Java代码,产生符合特定语法结构的语法,同时又在JavaCC的基础上添加了语义的概念即JJTree,通过JJTree的一次转换,这样就将Java代码转换成了一个AST,AST是Java符号流之上的语义层,PMD把AST处理成一个符号表。然后编写PMD规则,一个PMD规则可以看成是一个Visitor,通过遍历AST找出多个对象之间的一种特定模式,即代码所存在的问题。该软件功能强大,扫描效率高,是Java程序员debug的好帮手。
那么p3c-pmd是什么呢?
ViolationUtils.addViolationWithPrecisePosition(this,node,data,\nI18nResources.getMessage(&34;,\nnode.getImage()));
p3c-pmd插件是基于PMD实现的,更具体的来说是基于pmd-java的,因为PMD不仅支持Java代码分析,还支持其他多种语言。具体自定义规则的方式,通过自定义Java类和XPATH规则实现。
四、规约监测案例
讲道理,说一千道一万,还得是拿出代码跑一下,才知道PMD具体是什么个样子。
1.测试工程
guide-pmd\n└──src\n├──main\n│├──java\n││└──cn.itedus.guide.pmd.rule\n││├──naming\n│││├──ClassNamingShouldBeCamelRule.java\n│││├──ConstantFieldShouldBeUpperCaseRule.java\n│││└──LowerCamelCaseVariableNamingRule.java\n││├──utils\n│││├──StringAndCharConstants.java\n│││└──ViolationUtils.java\n││└──I18nResources\n│└──resources\n│├──rule\n││└──ali-naming.xml\n│├──messages.xml\n│└──namelist.properties\n└──test\n└──java\n└──cn.itedus.demo.test\n├──ApiTest.java\n└──TErrDto.java
源码:https://github.com/fuzhengwei/guide-pmd
这是一个类似p3c-pmd的测试工程,通过自行扩展重写代码监测规约的方式,来处理自己关于代码的审核标准处理。
naming下的类是用于处理一些和名称相关的规则,类名、属性名、方法名等resources下ali-naming.xml是规约的配置文件
2.驼峰命名规约
publicclassClassNamingShouldBeCamelRuleextendsAbstractJavaRule{\n\nprivatestaticfinalPatternPATTERN\n=Pattern.compile(&34;);\n\n@Override\npublicObjectvisit(ASTClassOrInterfaceDeclarationnode,Objectdata){\nif(PATTERN.matcher(node.getImage()).matches()){\nreturnsuper.visit(node,data);\n}\n\nViolationUtils.addViolationWithPrecisePosition(this,node,data,\nI18nResources.getMessage(&34;,\nnode.getImage()));\n\nreturnsuper.visit(node,data);\n}\n}
通过继承PMD提供的AbstractJavaRule抽象类,重写visit方法,使用正则的方式进行验证。visit方法都入参类型非常多,分别用于处理类、接口、方法、代码等各项内容的监测处理,只要重写需要的方法,在里面进行自己都处理就可以。ClassNamingShouldBeCamelRule、ConstantFieldShouldBeUpperCaseRule、LowerCamelCaseVariableNamingRule三个类都功能类似,这里就不一一展示了,可以直接参考源码。
3.ali-naming.xml配置
<rulename=&34;\nlanguage=&34;\nsince=&34;\nmessage=&34;\nclass=&34;>\n<priority>3</priority>\n</rule>
在ali-naming.xml用于配置规约处理类、priority级别、message提醒文字。同时还可以配置代码示例,使用<example>标签,在里面写好标准代码即可。
4.测试验证规约
问题类示例
publicclassTErrDto{\n\npublicstaticfinalLongmax=50000L;\n\npublicvoidQueryUserInfo(){\nbooleanbaz=true;\nwhile(baz)\nbaz=false;\n}\n\n}
单元测试
@Test\npublicvoidtest_naming(){\nString[]str={\n&34;,\n&34;,\n&34;,\n&34;,\n&34;,\n&34;\n//&34;\n};\nPMD.main(str);\n}
规约的测试验证可以直接使用PMD.main方法,在方法中提供字符串数组入参,这里的代码监测地址和规约配置需要是绝对路径。
测试结果
TErrDto.java:3:【TErrDto】不符合UpperCamelCase命名风格\nTErrDto.java:5:常量【max】命名应全部大写并以下划线分隔\nTErrDto.java:7:方法名【QueryUserInfo】不符合lowerCamelCase命名风格\n\nProcessfinishedwithexitcode4
从测试结果可以看到,我们写的三个代码规约分别监测出了代码的命名风格、常量大写、方法名不符合驼峰标识。同时你还可以测试category/java/codestyle.xml这个是PMD自身提供好的规约监测。
五、扩展了解Sonar
其实有了PMD静态代码检查规约,能做都事情就很多,不是只对正在写的代码进行检查,还可以对不同阶段的代码进行分析和风险提醒,比如:准备提测阶段、已经上线完成,都可以做相应的监测处理。
而Sonar就是一个这样都工具,它是一个Web系统,可以展现静态代码扫描的结果,结果是可以自定义的,支持多种语言的原理是它的扩展性。https://www.sonarqube.org/
不遵循代码标准:sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。潜在的缺陷:sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的缺陷。糟糕的复杂度分布:文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。重复:显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示源码中重复严重的地方。注释不足或者过多:没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。缺乏单元测试:sonar可以很方便地统计并展示单元测试覆盖率。糟糕的设计:通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况,检测耦合。提高代码质量:了解自己在编码过程中犯过的错误,让自己的代码更具有可读性和维护性。
六、总结
PMD是一款采用BSD协议的代码检查工具,你可以扩展实现为自己的标准和规范以及完善个性的提醒和修复操作。另外基于IDEA插件实现的代码检查或者有审计要求的处理,也可以基于IDEA插件做更多的扩展,比如提醒修复、提供修复操作、自身业务逻辑的检查。例如momo开源库下的一款IDEA静态代码安全审计及漏洞一键修复插件https://github.com/momosecurity/momo-code-sec-inspector-java这里补充一点,kotlin语言可以在IDEA中转换为Java语言,这样你在阅读类似这样的代码时候,如果不好看懂也可以转换一下在阅读。此外IDEA插件开发需要基于Gradle或者本身提供都模版进行创建,如果感兴趣也可以阅读我写的IDEA插件开发文章。
作者:小傅哥原文:https://mp.weixin.qq.com/s/RwzprbY2AhdgslY8tbVL-A
关于本次扫描网站源码分享关键字和网站链接扫描的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。
