第四章:代码质量规则¶
规则概述¶
SonarQube 的规则是代码质量检查的核心,每条规则对应一个特定的代码问题检测逻辑。
规则类型¶
| 类型 | 说明 | 图标 |
|---|---|---|
| Bug | 可能导致程序错误的代码 | 🐛 |
| Vulnerability | 安全漏洞 | 🔓 |
| Code Smell | 代码异味,影响可维护性 | 💩 |
| Security Hotspot | 安全敏感点,需人工审查 | ⚠️ |
严重级别¶
| 级别 | 说明 |
|---|---|
| BLOCKER | 阻断级,必须立即修复 |
| CRITICAL | 严重级,应尽快修复 |
| MAJOR | 主要级,应修复 |
| MINOR | 次要级,建议修复 |
| INFO | 信息级,仅供参考 |
质量配置(Quality Profile)¶
质量配置是一组规则的集合,用于定义项目的代码检查标准。
查看质量配置¶
- 进入 Quality Profiles 页面
- 选择语言(如 Java、Python)
- 查看内置的 "Sonar way" 配置
创建自定义质量配置¶
- 点击 "Create" 创建新配置
- 选择继承的父配置(通常继承 "Sonar way")
- 命名配置(如 "Company Java Profile")
- 自定义规则设置
激活/停用规则¶
内置规则示例¶
Python 规则¶
1. 未使用的变量 (python:S1481)¶
# ❌ 不合规
def calculate(x, y):
unused = 10 # 未使用的变量
return x + y
# ✅ 合规
def calculate(x, y):
return x + y
2. 空异常捕获 (python:S1541)¶
# ❌ 不合规
try:
do_something()
except: # 捕获所有异常
pass
# ✅ 合规
try:
do_something()
except ValueError as e:
logger.error(f"Value error: {e}")
3. SQL 注入风险 (python:S3649)¶
# ❌ 不合规
query = f"SELECT * FROM users WHERE id = {user_input}"
# ✅ 合规
query = "SELECT * FROM users WHERE id = ?"
cursor.execute(query, (user_input,))
JavaScript/TypeScript 规则¶
1. 相等性检查 (javascript:S1764)¶
2. 未使用的依赖 (javascript:S4124)¶
3. 敏感数据暴露 (javascript:S2068)¶
Java 规则¶
1. 空异常捕获 (java:S108)¶
// ❌ 不合规
try {
doSomething();
} catch (Exception e) {
// 空捕获
}
// ✅ 合规
try {
doSomething();
} catch (Exception e) {
logger.error("Error occurred", e);
}
2. 资源未关闭 (java:S2095)¶
// ❌ 不合规
FileInputStream fis = new FileInputStream(file);
// 使用后未关闭
// ✅ 合规
try (FileInputStream fis = new FileInputStream(file)) {
// 使用资源
}
3. 敏感数据硬编码 (java:S2068)¶
自定义规则¶
使用 API 创建规则¶
# 创建自定义规则
curl -X POST "http://localhost:9000/api/rules/create" \
-u admin:admin \
-d "custom_key=my-custom-rule" \
-d "name=My Custom Rule" \
-d "markdown_description=This is a custom rule description" \
-d "severity=MAJOR" \
-d "type=CODE_SMELL" \
-d "status=READY"
规则参数配置¶
许多规则支持参数配置:
# 示例:配置函数复杂度阈值
sonar.function.cognitiveComplexity.threshold=15
# 示例:配置文件大小限制
sonar.file.size.limit=1000
规则排除¶
# 在项目配置中排除特定规则
sonar.issue.ignore.multicriteria=e1,e2
# 排除规则1:在特定文件
sonar.issue.ignore.multicriteria.e1.ruleKey=java:S1068
sonar.issue.ignore.multicriteria.e1.resourceKey=**/generated/**
# 排除规则2:特定模式
sonar.issue.ignore.multicriteria.e2.ruleKey=python:S1481
sonar.issue.ignore.multicriteria.e2.resourceKey=**/tests/**
规则标签¶
规则可以使用标签进行分类:
# 常见标签
- security: 安全相关
- performance: 性能相关
- bug: Bug 检测
- code-smell: 代码异味
- confusing: 代码可读性
- conventional: 编码规范
- unused: 未使用代码
按标签搜索规则¶
在 Quality Profiles 中,可以使用标签过滤规则:
规则继承¶
质量配置支持继承机制:
继承规则修改¶
- 可以修改继承规则的严重级别
- 可以停用继承的规则
- 不能删除继承的规则
规则更新¶
检查规则更新¶
当 SonarQube 升级时,内置规则可能更新:
- 进入 Quality Profiles
- 查看是否有 "Update" 提示
- 点击更新查看变更
- 确认更新
处理废弃规则¶
规则最佳实践¶
1. 从内置配置开始¶
2. 规则分级¶
# 建议的规则分级
BLOCKER:
- 安全漏洞
- 必定导致错误的问题
CRITICAL:
- 高风险代码异味
- 重要的安全问题
MAJOR:
- 常见代码异味
- 可维护性问题
MINOR:
- 编码规范问题
- 轻微的代码异味
3. 团队共识¶
规则统计¶
查看规则统计¶
规则覆盖率分析¶
小结¶
本章介绍了 SonarQube 的代码质量规则:
- 规则类型和严重级别
- 质量配置管理
- 内置规则示例
- 自定义规则创建
- 规则继承和更新
下一章将介绍质量门禁的配置和使用。