真能闹,怕喇喇蛄,还不种稻子了?
喇喇蛄,是东北的一种害虫,经常在种水稻的季节,在池埂子上盗洞,导致稻田里的水悄悄的流没了,影响稻苗发育。
后来发现原来写代码,也能碰见“蝲蝲蛄”,无论你写的是什么功能、哪种技术、作何目的,蝲蝲蛄总能给盗几个洞出来。“你这已经有其他的某某了你怎么还造轮子”、“你这方案不行程序员不要浪费时间”、“也没看出来你这有啥优势和价值呀怎么给业务赋能”,这种话听上去“贼”有道理,吹的叮当的,但让他去做又能搞的稀的囊的。
所以,远离蝲蝲蛄,做你想做的、搞你想搞的、学你想学的,知识是不断沉淀的积累、方案是积累后的创造。
怎么办,都有标准的研发规范,但还是没法控制住到具体的每个研发下,给写出什么代码了。
有时候标准只是文档,看和执行的这个过程中就会一定的转行失效性,你可能会想加手段;评审、扣钱、罚绩效、检讨等等,但这样可能还只是增加过程成本,最终效果也不会太好。不太可能一个写代码还得配一个保姆,所以就像 p3c、pmd-idea,这样的插件出来了,帮助程序员把代码写好,治理掉一些不合标准的问题代码。
那么,你好奇这个事是怎么干的吗,怎么你就在 IDEA 写代码,它就能给你检测出来,告诉你有问题,并提醒你修改以及有些还可以一键帮助你修改呢?那如果你想再增加点你们公司个性的要求的时候,怎么扩展呢?本章节我们就使用 IDEA 插件开发能力,把这个事办喽
guide-idea-plugin-pmd
├── .gradle
└── src
├── main
│ └── java
│ └── cn.bugstack.guide.idea.plugin
│ ├── rule
│ │ ├── FastJsonAutoType.java
│ │ ├── HardcodedIp.java
│ │ └── ReplacePseudorandomGenerator.java
│ └── utils
│ └── InspectionBundle.java
├── resources
│ ├── inspectionDescriptions
│ │ ├── FastJsonAutoType.html
│ │ ├── HardcodedIp.html
│ │ └── ReplacePseudorandomGenerator.html
│ └── META-INF
│ └── plugin.xml
├── build.gradle
└── gradle.properties
源码获取:#公众号:bugstack虫洞栈
回复:idea
即可下载全部 IDEA 插件开发源码
在此 IDEA 插件工程中,主要分为3块区域:
目的:把代码中的 new Random
不安全伪随机数警告并提供修复,处理为 new SecureRandom
RandomRule
PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
typeElement.replace(factory.createTypeElementFromText("SecureRandom", null));
PsiNewExpression secureNewExp = (PsiNewExpression) factory.createExpressionFromText("new SecureRandom()", null);
newExp.replace(secureNewExp);
AbstractBaseJavaLocalInspectionTool
Override buildVisitor
方法,扩展检测代码。当你写了这段方法后,IDEA 会把一行行的代码都通过这个方法传进来visitNewExpression
方法中扩展自身的检测处理,遇到了哪种代码片段,要提供什么样的提醒以及提醒的级别,最后是提供一个 Fix 修复能力,这个修复能力就在替换这段代码片段,通过还可以操作引入新包的动作 import xxx
目的:com.alibaba:fastjson
在开启 AutoTypeSupport 时,存在反序列化风险。如果程序中有 ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
代码直接提醒删除处理。
public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
return new JavaElementVisitor() {
@Override
public void visitMethodCallExpression(PsiMethodCallExpression expression) {
if (hasFullQualifiedName(expression, "com.alibaba.fastjson.parser.ParserConfig", "setAutoTypeSupport")) {
PsiExpression[] args = expression.getArgumentList().getExpressions();
if (args.length == 1 &&
args[0] instanceof PsiLiteralExpression &&
Boolean.TRUE.equals(((PsiLiteralExpression) args[0]).getValue())
) {
holder.registerProblem(
expression,
"FastJson unserialization risk",
ProblemHighlightType.GENERIC_ERROR_OR_WARNING,
new DeleteElementQuickFix(expression, "!Fix: remove setAutoTypeSupport")
);
}
}
}
};
}
DeleteElementQuickFix
<html>
<body>
<b>小傅哥-提醒:</b> 不安全的伪随机数生成器 <br>
<br>
<p>java.util.Random 依赖一个可被预测的伪随机数生成器。</p>
<br>
<p style="font-size: 10px;color: #629460;">最佳实践:</p>
<p style="font-size: 10px;">使用java.security.SecureRandom</p>
</body>
</html>
<extensions defaultExtensionNs="com.intellij">
<localInspection
language="JAVA" groupPath="Java"
groupName="X-PMD" enabledByDefault="true" level="ERROR"
bundle="InspectionBundle" key="replace.pseudorandom.generator.name"
implementationClass="cn.bugstack.guide.idea.plugin.rule.RandomRule"
/>
<localInspection
language="JAVA" groupPath="Java"
groupName="X-PMD" enabledByDefault="true" level="ERROR"
bundle="InspectionBundle" key="fastjson.auto.type.name"
implementationClass="cn.bugstack.guide.idea.plugin.rule.FastJsonRule"
/>
<localInspection
language="JAVA" groupPath="Java"
groupName="X-PMD" enabledByDefault="true" level="WARNING"
bundle="InspectionBundle" key="hardcoded.ip.name"
implementationClass="cn.bugstack.guide.idea.plugin.rule.IPRule"
/>
</extensions>
启动插件
:runIde
错误提醒
错误详情
Random random = new Random()
替换为 SecureRandom random = new SecureRandom();
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
的错误提醒。- END -