Java 静态分析
Java 栈的 L1 静态分析由三件套协同,从源码规范到字节码语义 Bug 全覆盖。
| Skill | 维度 | 一句话描述 |
|---|---|---|
| checkstyle | 风格 | 代码风格 + 命名规范(Google Java Style / Sun Coding Convention) |
| pmd | 规则 | 可疑代码模式检测(死代码 / 过度复杂 / 异常处理反模式) |
| spotbugs | 字节码 Bug | Java 字节码级 Bug 检测 + FindSecBugs 安全扫描 |
checkstyle
用途:Java 代码风格与规范检查。
| 检测项 | 示例 |
|---|---|
| 命名 | 类名 PascalCase,方法 camelCase,常量 UPPER_SNAKE |
| 缩进 | 缩进 / 空格 / 大括号位置 |
| Import | 顺序、分组、避免通配符 |
| Javadoc | 公共 API 是否有文档 |
| 行长 / 方法长度 | 行 ≤ 120、方法 ≤ 50 等 |
常用规则集:Google Java Style、Sun Coding Convention、企业定制(可通过 standards-converter 生成)。
触发:"Java 代码风格"、"checkstyle 检查"、"Google Java Style"
pmd
用途:检测可疑代码模式(不是语法错误,但通常是 Bug 温床)。
| 类别 | 示例 |
|---|---|
| 死代码 | 不可达分支、未使用变量 |
| 过度复杂 | 圈复杂度过高、if/else 深嵌套 |
| 异常处理反模式 | catch (Exception) {} 吞异常 |
| 并发陷阱 | Vector/Hashtable 的误用 |
| 安全 | SecurityManager 缺失、反射滥用 |
规则集:basic、codesize、design、naming、optimizations、strictexception 等。
触发:"Java 代码异味"、"PMD 检查"、"圈复杂度"
spotbugs
用途:字节码级 Bug 检测(比源码分析更准,因为能看到编译器的实际产物)。
| 检测项 | 示例 |
|---|---|
| 空指针 | NPE 可达路径 |
| 资源泄漏 | InputStream / Connection 未关闭 |
| 并发 Bug | 未同步的 static 变量写 |
| 序列化风险 | 非 Serializable 字段 |
| OWASP | FindSecBugs 插件:SQL 注入 / XSS / SSRF |
与 pmd 的区别:
| 维度 | pmd | spotbugs |
|---|---|---|
| 分析对象 | 源码 AST | 字节码(.class) |
| 精度 | 语法级 | 语义级(更准) |
| 覆盖 | 代码异味 | 真实 Bug + 安全 |
触发:"Java Bug 检测"、"spotbugs 扫描"、"FindSecBugs 安全扫描"
组合使用建议
三者不冲突、互补。输出统一 CodeEvidence → 交给 code-review 做 L2 语义评审。
企业定制规则
通过 standards-converter 可以把"企业编码规范.md"自动转换为 checkstyle.xml / pmd-ruleset.xml / spotbugs.xml。