@comate/zulu 1.4.0-beta.2 → 1.4.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/comate-engine/assets/skills/auto-commit/SKILL.md +241 -0
- package/comate-engine/assets/skills/auto-commit/references/data_structures.md +183 -0
- package/comate-engine/assets/skills/auto-commit/references/interaction_instruction.md +220 -0
- package/comate-engine/assets/skills/auto-commit/references/issue_type_mapping.json +19 -0
- package/comate-engine/assets/skills/auto-commit/references/query_reference.md +176 -0
- package/comate-engine/assets/skills/auto-commit/scripts/build_git_commit_payload.py +195 -0
- package/comate-engine/assets/skills/auto-commit/scripts/build_icafe_cards_payload.py +80 -0
- package/comate-engine/assets/skills/auto-commit/scripts/cache_manager.py +69 -0
- package/comate-engine/assets/skills/auto-commit/scripts/create_card_cli.py +67 -0
- package/comate-engine/assets/skills/auto-commit/scripts/git_diff_cli.py +201 -0
- package/comate-engine/assets/skills/auto-commit/scripts/git_utils.py +230 -0
- package/comate-engine/assets/skills/auto-commit/scripts/icafe/__init__.py +66 -0
- package/comate-engine/assets/skills/auto-commit/scripts/icafe/client.py +473 -0
- package/comate-engine/assets/skills/auto-commit/scripts/icafe/farseer.py +52 -0
- package/comate-engine/assets/skills/auto-commit/scripts/icafe/matching.py +784 -0
- package/comate-engine/assets/skills/auto-commit/scripts/logger.py +32 -0
- package/comate-engine/assets/skills/auto-commit/scripts/match_card_cli.py +41 -0
- package/comate-engine/assets/skills/auto-commit/scripts/payload_validators.py +309 -0
- package/comate-engine/assets/skills/auto-commit/scripts/recognize_card_cli.py +63 -0
- package/comate-engine/assets/skills/{automation-browser-comate → automation-browser}/SKILL.md +1 -0
- package/comate-engine/assets/skills/{cnap-comate → cnap}/SKILL.md +1 -0
- package/comate-engine/assets/skills/code-review/SKILL.md +202 -0
- package/comate-engine/assets/skills/code-review/agents/correctness-reviewer.md +62 -0
- package/comate-engine/assets/skills/code-review/agents/custom-reviewer.md +53 -0
- package/comate-engine/assets/skills/code-review/agents/meta-reviewer.md +84 -0
- package/comate-engine/assets/skills/code-review/agents/reliability-reviewer.md +72 -0
- package/comate-engine/assets/skills/code-review/agents/reuse-reviewer.md +101 -0
- package/comate-engine/assets/skills/code-review/agents/style-reviewer.md +65 -0
- package/comate-engine/assets/skills/code-review/evals/SKILL.md +334 -0
- package/comate-engine/assets/skills/code-review/evals/agents/gt-generator.md +76 -0
- package/comate-engine/assets/skills/code-review/evals/agents/miner.md +87 -0
- package/comate-engine/assets/skills/code-review/evals/agents/score-judge.md +168 -0
- package/comate-engine/assets/skills/code-review/evals/references/cli-query-template.md +114 -0
- package/comate-engine/assets/skills/code-review/evals/references/gt-schema.md +77 -0
- package/comate-engine/assets/skills/code-review/references/custom-rules/RULE_TEMPLATE.md +141 -0
- package/comate-engine/assets/skills/code-review/references/dispatch-template.md +142 -0
- package/comate-engine/assets/skills/code-review/references/output-schema.md +197 -0
- package/comate-engine/assets/skills/code-review/references/report-format.md +41 -0
- package/comate-engine/assets/skills/code-review/references/rules/Go/GO_AUTH_RULES.md +29 -0
- package/comate-engine/assets/skills/code-review/references/rules/Go/GO_CORRECTNESS_RULES.md +111 -0
- package/comate-engine/assets/skills/code-review/references/rules/Go/GO_RESOURCE_CONCURRENCY_RULES.md +190 -0
- package/comate-engine/assets/skills/code-review/references/rules/Go/GO_STYLE_RULES.md +354 -0
- package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_AUTH_RULES.md +34 -0
- package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_CORRECTNESS_RULES.md +207 -0
- package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_RESOURCE_CONCURRENCY_RULES.md +220 -0
- package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_STYLE_RULES.md +306 -0
- package/comate-engine/assets/skills/code-review/references/rules/Js/JS_AUTH_RULES.md +48 -0
- package/comate-engine/assets/skills/code-review/references/rules/Js/JS_CORRECTNESS_RULES.md +364 -0
- package/comate-engine/assets/skills/code-review/references/rules/Js/JS_RESOURCE_CONCURRENCY_RULES.md +180 -0
- package/comate-engine/assets/skills/code-review/references/rules/Js/JS_STYLE_RULES.md +350 -0
- package/comate-engine/assets/skills/code-review/references/rules/Python/PYTHON_AUTH_RULES.md +38 -0
- package/comate-engine/assets/skills/code-review/references/rules/Python/PYTHON_CORRECTNESS_RULES.md +255 -0
- package/comate-engine/assets/skills/code-review/references/rules/Python/PYTHON_RESOURCE_CONCURRENCY_RULES.md +180 -0
- package/comate-engine/assets/skills/code-review/references/rules/Python/PYTHON_STYLE_RULES.md +195 -0
- package/comate-engine/assets/skills/code-review/references/telemetry.md +27 -0
- package/comate-engine/assets/skills/{code-security-comate → code-security}/SKILL.md +1 -0
- package/comate-engine/assets/skills/{comate-docs-comate → comate-docs}/SKILL.md +1 -1
- package/comate-engine/assets/skills/create-automation-tasks-comate/SKILL.md +300 -0
- package/comate-engine/assets/skills/create-automation-tasks-comate/references/backend_dev.md +109 -0
- package/comate-engine/assets/skills/create-automation-tasks-comate/references/env_setup.md +130 -0
- package/comate-engine/assets/skills/create-automation-tasks-comate/references/frontend_dev.md +74 -0
- package/comate-engine/assets/skills/create-automation-tasks-comate/references/git_operations.md +88 -0
- package/comate-engine/assets/skills/create-automation-tasks-comate/references/long_running_task.md +96 -0
- package/comate-engine/assets/skills/create-automation-tasks-comate/references/testing_strategy.md +94 -0
- package/comate-engine/assets/skills/create-automation-tasks-comate/scripts/check_config.py +397 -0
- package/comate-engine/assets/skills/{create-rule-comate → create-rule}/SKILL.md +1 -0
- package/comate-engine/assets/skills/{create-skill-comate → create-skill}/SKILL.md +1 -1
- package/comate-engine/assets/skills/{figma2code-comate → figma2code}/SKILL.md +1 -0
- package/comate-engine/assets/skills/{icafe-comate → icafe}/SKILL.md +1 -13
- package/comate-engine/assets/skills/{icode-comate → icode}/SKILL.md +1 -0
- package/comate-engine/node_modules/@comate/plugin-shared-internals/dist/index.js +3 -3
- package/comate-engine/server.js +136 -82
- package/dist/bundle/index.js +20 -9
- package/package.json +1 -1
- /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/cases.md +0 -0
- /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/deploy-troubleshoot.md +0 -0
- /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/install.md +0 -0
- /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/kubectl.md +0 -0
- /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/login.md +0 -0
- /package/comate-engine/assets/skills/{cnap-comate → cnap}/references/oncall.md +0 -0
- /package/comate-engine/assets/skills/{cnap-comate → cnap}/scripts/install_cnap_cli.sh +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/credential_hosting.md +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair-go_sql_injection.md +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair-java_sql_injection.md +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair-php_sql_injection.md +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair-python_sql_injection.md +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/references/vul_repair_sensitive.md +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/credential_hosting.py +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/credential_poll.py +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/http_client.py +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/parse_scan_result.py +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/repair_vulnerability.py +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/report_chat.py +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/scan_vulnerability.py +0 -0
- /package/comate-engine/assets/skills/{code-security-comate → code-security}/scripts/utils.py +0 -0
- /package/comate-engine/assets/skills/{comate-docs-comate → comate-docs}/references/doc-map-extended.md +0 -0
- /package/comate-engine/assets/skills/{comate-docs-comate → comate-docs}/references/models-and-billing.md +0 -0
- /package/comate-engine/assets/skills/{comate-docs-comate → comate-docs}/references/product-overview.md +0 -0
- /package/comate-engine/assets/skills/{create-image-comate → create-image}/SKILL.md +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/LICENSE.txt +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/agents/analyzer.md +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/agents/comparator.md +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/agents/grader.md +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/assets/eval_review.html +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/eval-viewer/generate_review.py +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/eval-viewer/viewer.html +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/references/schemas.md +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/__init__.py +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/__pycache__/aggregate_benchmark.cpython-311.pyc +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/aggregate_benchmark.py +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/generate_report.py +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/package_skill.py +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/quick_validate.py +0 -0
- /package/comate-engine/assets/skills/{create-skill-comate → create-skill}/scripts/utils.py +0 -0
- /package/comate-engine/assets/skills/{create-subagent-comate → create-subagent}/SKILL.md +0 -0
- /package/comate-engine/assets/skills/{figma2code-comate → figma2code}/references/codeConnect.md +0 -0
- /package/comate-engine/assets/skills/{figma2code-comate → figma2code}/references/designToken.md +0 -0
- /package/comate-engine/assets/skills/{figma2code-comate → figma2code}/references/image2design.md +0 -0
- /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/SKILL.md +0 -0
- /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/scripts/fetch_skills.py +0 -0
- /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/scripts/get_download_url.py +0 -0
- /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/scripts/install_skill.py +0 -0
- /package/comate-engine/assets/skills/{find-skills-comate → find-skills}/scripts/preview_skill.py +0 -0
- /package/comate-engine/assets/skills/{get-ugate-token-comate → get-ugate-token}/SKILL.md +0 -0
- /package/comate-engine/assets/skills/{get-ugate-token-comate → get-ugate-token}/getUgateToken.py +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/ai-workflows.md +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/commands.md +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/error-handling.md +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/git-auto-bindcard-workflow.md +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/git-bindcard-workflow.md +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/iql-syntax.md +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/platform-concepts.md +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/smart-create-workflow.md +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/smart-find-workflow.md +0 -0
- /package/comate-engine/assets/skills/{icafe-comate → icafe}/references/smart-update-workflow.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/add_reviewers.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/build_fetch_command.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/check_repo_permission.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/create_branch.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/create_draft_comment.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_ai_cr_result.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_ai_review.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_diff_content.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_diff_file.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_machine_check.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_my_reviews.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_person_commit.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_person_repo.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_repo_branch.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_repo_config.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_repo_members.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_repo_reviews.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_review_comments.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_review_info.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/get_submit_settings.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/icode-api.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/publish_comments.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/set_review_score.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/start_ai_review.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/submit_review.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/api/trigger_ai_cr.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/add-reviewer.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/fix-machine-check.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/merge-cr.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/ssh-setup.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/submit-acr.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/feature/submit-cr.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/git/clone.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/git/icode-git.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/git/push.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/git/push_cr.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/install.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/references/login.md +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/add-reviewer.sh +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/common.sh +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/fix-machine-check.sh +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/merge-cr.sh +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/ssh-setup.sh +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/submit-acr.sh +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/submit-cr.sh +0 -0
- /package/comate-engine/assets/skills/{icode-comate → icode}/scripts/test-preflight.sh +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/SKILL.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/examples.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/add_member.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/change_scope.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/copy_doc.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/create_doc.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/delete_doc.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/edit_content.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/move_doc.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_comment.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_content.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_flowchart.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_permission.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_recent_view.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_repo.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/query_user_info.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/update_member.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/references/upload_attachment.md +0 -0
- /package/comate-engine/assets/skills/{ku-operator-comate → ku-operator}/scripts/ku_operator.py +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
# Go 代码风格扫描规则(共17条)
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## 一、命名规则(4项)
|
|
6
|
+
|
|
7
|
+
### 1. GoRule001 NamingCamelCase - 变量、常量、函数名使用驼峰命名,缩写词应全大写 [Critical]
|
|
8
|
+
|
|
9
|
+
**缺陷描述**:变量、常量、函数名统一使用驼峰命名法(camelCase / PascalCase)。常用缩写词(如 HTTP、ID、URL 等)应保持全大写;当作为非导出标识符的首部时则全小写(如 `httpServer`)。
|
|
10
|
+
|
|
11
|
+
**常用缩写名单(应全大写)**:
|
|
12
|
+
`ACL`, `API`, `ASCII`, `CPU`, `CSS`, `DNS`, `EOF`, `GUID`, `HTML`, `HTTP`, `HTTPS`, `ID`, `IP`, `JSON`, `QPS`, `RAM`, `RPC`, `SLA`, `SMTP`, `SQL`, `SSH`, `TCP`, `TLS`, `TTL`, `UDP`, `UI`, `GID`, `UID`, `UUID`, `URI`, `URL`, `UTF8`, `VM`, `XML`, `XMPP`, `XSRF`, `XSS`, `SIP`, `RTP`, `AMQP`, `DB`, `TS`
|
|
13
|
+
|
|
14
|
+
**经典案例**:
|
|
15
|
+
```go
|
|
16
|
+
// 错误写法
|
|
17
|
+
var userId int64
|
|
18
|
+
func GetUserId() int64 { return 0 }
|
|
19
|
+
func ParseXmlData() {}
|
|
20
|
+
|
|
21
|
+
// 正确写法
|
|
22
|
+
var userID int64
|
|
23
|
+
func GetUserID() int64 { return 0 }
|
|
24
|
+
func ParseXMLData() {}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**不应报告的场景**:非导出标识符中缩写词作首部时全小写是正确的(如 `httpServer`、`urlPath`)。
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
### 2. GoRule002 ErrVarPrefix - error 类型的顶级变量必须添加 err 或 Err 前缀 [Critical]
|
|
32
|
+
|
|
33
|
+
**缺陷描述**:包级别(顶级)的 `error` 类型变量,导出变量使用 `Err` 前缀,包内私有变量使用 `err` 前缀。
|
|
34
|
+
|
|
35
|
+
**经典案例**:
|
|
36
|
+
```go
|
|
37
|
+
// 错误写法
|
|
38
|
+
var NotFound = errors.New("not found")
|
|
39
|
+
var invalidInput = errors.New("invalid input")
|
|
40
|
+
|
|
41
|
+
// 正确写法
|
|
42
|
+
var ErrNotFound = errors.New("not found")
|
|
43
|
+
var errInvalidInput = errors.New("invalid input")
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**不应报告的场景**:函数内部的局部 error 变量不受此规则约束。
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### 3. GoRule004 ReceiverName - receiver 的名称应该简短且保持一致 [Critical]
|
|
51
|
+
|
|
52
|
+
**缺陷描述**:方法的接收者名称应简短(通常取类型名首字母),且同一类型的所有方法中接收者名称必须保持一致。不得使用 `this`、`self` 等。
|
|
53
|
+
|
|
54
|
+
**经典案例**:
|
|
55
|
+
```go
|
|
56
|
+
// 错误写法
|
|
57
|
+
func (client *Client) GetName() string { return client.name } // 名称过长
|
|
58
|
+
func (c *Client) GetName() string { return c.name }
|
|
59
|
+
func (cli *Client) SetName(name string) { cli.name = name } // 不一致
|
|
60
|
+
func (this *Server) Start() error { return nil } // 禁用 this/self
|
|
61
|
+
|
|
62
|
+
// 正确写法
|
|
63
|
+
func (c *Client) GetName() string { return c.name }
|
|
64
|
+
func (c *Client) SetName(name string) { c.name = name }
|
|
65
|
+
func (s *Server) Start() error { return nil }
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### 4. GoRule006 NoPkgNamePrefix - 包内类型不应以包名为前缀 [Critical]
|
|
71
|
+
|
|
72
|
+
**缺陷描述**:包内的 struct、函数等,不应再以包名作为前缀,否则调用方会出现冗余(如 `net.NetDial`)。
|
|
73
|
+
|
|
74
|
+
**经典案例**:
|
|
75
|
+
```go
|
|
76
|
+
// 错误写法(package: net)
|
|
77
|
+
type NetAddr struct{} // 调用方:net.NetAddr(冗余)
|
|
78
|
+
func UserCreate() {} // 调用方:user.UserCreate(冗余)
|
|
79
|
+
|
|
80
|
+
// 正确写法
|
|
81
|
+
type Addr struct{} // 调用方:net.Addr
|
|
82
|
+
func Create() {} // 调用方:user.Create
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 二、格式规则(3项)
|
|
88
|
+
|
|
89
|
+
### 5. GoRule102 UTF8Encoding - 所有源文件编码必须是 UTF-8 [Critical]
|
|
90
|
+
|
|
91
|
+
**缺陷描述**:Go 只能处理 UTF-8 编码的源文件。使用 GBK、GB2312、Latin-1 等其他编码会导致编译失败或乱码。
|
|
92
|
+
|
|
93
|
+
**不应报告的场景**:纯 ASCII 内容的文件(无法判断编码时不报告)。
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### 6. GoRule103 LineLength - 每行代码不超过 160 个字符 [Critical]
|
|
98
|
+
|
|
99
|
+
**缺陷描述**:单行字符数不超过 160 个字符,超出需要换行。Tab 按 1 个字符计算。
|
|
100
|
+
|
|
101
|
+
**豁免场景**:包含 URL 的行;RSA 密钥等不可拆分的字符串字面量。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
### 7. GoRule301 GofmtFormat - 使用 tab 进行缩进,.go 文件应统一格式化 [Critical]
|
|
106
|
+
|
|
107
|
+
**缺陷描述**:Go 代码使用 `tab` 进行缩进,所有 `.go` 文件应通过格式化工具(如 `gofmt`)统一格式化。
|
|
108
|
+
|
|
109
|
+
**推荐工具**:`gorgeous`、`gofumpt`、`gofmt -w -s`、`goimports`
|
|
110
|
+
|
|
111
|
+
**经典案例**:
|
|
112
|
+
```go
|
|
113
|
+
// 错误写法(使用空格缩进)
|
|
114
|
+
func main() {
|
|
115
|
+
if true {
|
|
116
|
+
fmt.Println("hello")
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 正确写法(使用 tab 缩进)
|
|
121
|
+
func main() {
|
|
122
|
+
if true {
|
|
123
|
+
fmt.Println("hello")
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 三、Import 规则(3项)
|
|
131
|
+
|
|
132
|
+
### 8. GoRule307 ImportGroupOrder - import 按标准库、第三方库、项目自身库分组排列 [Critical]
|
|
133
|
+
|
|
134
|
+
**缺陷描述**:import 按 **标准库 → 第三方库 → 项目自身库** 顺序分三组排列,每组之间用一个空行分隔,组内按字典序升序排列。
|
|
135
|
+
|
|
136
|
+
**经典案例**:
|
|
137
|
+
```go
|
|
138
|
+
// 错误写法
|
|
139
|
+
import (
|
|
140
|
+
"fmt"
|
|
141
|
+
"github.com/some/thirdparty"
|
|
142
|
+
"context"
|
|
143
|
+
"your.company.com/yourproject/pkg"
|
|
144
|
+
"strings"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
// 正确写法
|
|
148
|
+
import (
|
|
149
|
+
"context"
|
|
150
|
+
"fmt"
|
|
151
|
+
"strings"
|
|
152
|
+
|
|
153
|
+
"github.com/some/thirdparty"
|
|
154
|
+
|
|
155
|
+
"your.company.com/yourproject/pkg"
|
|
156
|
+
)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**不应报告的场景**:只有一组 import(全是标准库或全是第三方库)时无需分组。
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
### 9. GoRule308 NoDotImport - 禁止使用点号格式 import [Critical]
|
|
164
|
+
|
|
165
|
+
**缺陷描述**:禁止使用 `. "pkg"` 格式的 import。点号导入会将包的所有导出标识符注入当前命名空间,使代码阅读者无法判断标识符来源。
|
|
166
|
+
|
|
167
|
+
**经典案例**:
|
|
168
|
+
```go
|
|
169
|
+
// 错误写法
|
|
170
|
+
import . "fmt"
|
|
171
|
+
import . "your.company.com/yourproject/models"
|
|
172
|
+
|
|
173
|
+
// 正确写法
|
|
174
|
+
import "your.company.com/yourproject/models"
|
|
175
|
+
user := models.User{Name: "Alice"}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
### 10. GoRule309 BlankImportComment - 使用 "_" import 的包需要添加注释说明原因 [Critical]
|
|
181
|
+
|
|
182
|
+
**缺陷描述**:使用空白标识符 `_` 导入包时,必须添加注释说明导入原因(通常是为了执行包的 `init()` 函数)。
|
|
183
|
+
|
|
184
|
+
**经典案例**:
|
|
185
|
+
```go
|
|
186
|
+
// 错误写法
|
|
187
|
+
import (
|
|
188
|
+
_ "github.com/go-sql-driver/mysql"
|
|
189
|
+
_ "image/jpeg"
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
// 正确写法
|
|
193
|
+
import (
|
|
194
|
+
_ "github.com/go-sql-driver/mysql" // 注册 MySQL driver
|
|
195
|
+
_ "image/jpeg" // 注册 JPEG 解码器
|
|
196
|
+
)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 四、错误处理规则(4项)
|
|
202
|
+
|
|
203
|
+
### 11. GoRule201 GoVetCheck - 文件应通过 go vet 的检查 [Critical]
|
|
204
|
+
|
|
205
|
+
**缺陷描述**:所有代码必须通过 `go vet ./...` 检查,无报错。主要检查项:
|
|
206
|
+
|
|
207
|
+
| 检查项 | 说明 |
|
|
208
|
+
|--------|------|
|
|
209
|
+
| copy locks | 复制了含锁的结构体,可能引发死锁 |
|
|
210
|
+
| loop closure | goroutine 中错误引用循环变量 |
|
|
211
|
+
| lost cancel | context.WithCancel 返回的 cancel 函数未被调用 |
|
|
212
|
+
| struct tag | struct 的 tag 格式不标准 |
|
|
213
|
+
| printf | printf 系列函数的格式串与参数不匹配 |
|
|
214
|
+
|
|
215
|
+
**经典案例**:
|
|
216
|
+
```go
|
|
217
|
+
// 错误写法 — copy locks
|
|
218
|
+
func doWork(c SafeCounter) { c.mu.Lock(); ... } // 传值复制了锁
|
|
219
|
+
|
|
220
|
+
// 正确写法
|
|
221
|
+
func doWork(c *SafeCounter) { c.mu.Lock(); ... } // 传指针
|
|
222
|
+
|
|
223
|
+
// 错误写法 — lost cancel
|
|
224
|
+
ctx, _ := context.WithCancel(context.Background()) // cancel 未调用
|
|
225
|
+
|
|
226
|
+
// 正确写法
|
|
227
|
+
ctx, cancel := context.WithCancel(context.Background())
|
|
228
|
+
defer cancel()
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
### 12. GoRule202 NoBoolCompare - 禁止在 if、for 中对 bool 类型进行等值判断 [Critical]
|
|
234
|
+
|
|
235
|
+
**缺陷描述**:`if`/`for` 中直接使用 bool 值作为条件,无需与 `true` 或 `false` 进行显式比较。
|
|
236
|
+
|
|
237
|
+
**经典案例**:
|
|
238
|
+
```go
|
|
239
|
+
// 错误写法
|
|
240
|
+
if isValid == true { process() }
|
|
241
|
+
if hasError == false { continue }
|
|
242
|
+
|
|
243
|
+
// 正确写法
|
|
244
|
+
if isValid { process() }
|
|
245
|
+
if !hasError { continue }
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
### 13. GoRule204 ErrorLastReturn - error 类型始终放在返回参数末尾 [Critical]
|
|
251
|
+
|
|
252
|
+
**缺陷描述**:当函数有多个返回值且包含 `error` 类型时,`error` 必须作为最后一个返回参数。
|
|
253
|
+
|
|
254
|
+
**经典案例**:
|
|
255
|
+
```go
|
|
256
|
+
// 错误写法
|
|
257
|
+
func GetUser(id int) (error, *User) { ... }
|
|
258
|
+
|
|
259
|
+
// 正确写法
|
|
260
|
+
func GetUser(id int) (*User, error) { ... }
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
### 14. GoRule205 HandleError - 函数返回值中的 error 必须处理,defer 调用除外 [Critical]
|
|
266
|
+
|
|
267
|
+
**缺陷描述**:函数返回的 `error` 必须判断处理。若确实要忽略,应使用 `_ = f()` 显式忽略,而非直接丢弃。
|
|
268
|
+
|
|
269
|
+
**经典案例**:
|
|
270
|
+
```go
|
|
271
|
+
// 错误写法
|
|
272
|
+
os.Remove(tmpFile) // error 被丢弃
|
|
273
|
+
json.Marshal(data) // error 被丢弃
|
|
274
|
+
|
|
275
|
+
// 正确写法
|
|
276
|
+
if err := os.Remove(tmpFile); err != nil {
|
|
277
|
+
log.Warnf("remove tmp file failed: %v", err)
|
|
278
|
+
}
|
|
279
|
+
// 或明确忽略
|
|
280
|
+
_ = writer.Close()
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
### 15. GoRule206 WrapErrorWithW - 包装 error 时应使用 fmt.Errorf 配合 %w [Critical]
|
|
286
|
+
|
|
287
|
+
**缺陷描述**:包装 error 时,应使用 `fmt.Errorf("...: %w", err)` 而非 `%s`/`%v`。使用 `%w` 包装的 error 可通过 `errors.Is()` 和 `errors.As()` 进行类型判断和解包。
|
|
288
|
+
|
|
289
|
+
**经典案例**:
|
|
290
|
+
```go
|
|
291
|
+
// 错误写法
|
|
292
|
+
return fmt.Errorf("query user failed: %s", err.Error()) // 丢失类型信息
|
|
293
|
+
return fmt.Errorf("connect failed: %v", err)
|
|
294
|
+
|
|
295
|
+
// 正确写法
|
|
296
|
+
return fmt.Errorf("query user failed, id=%d: %w", id, err)
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
**不应报告的场景**:`errors.New` 和不带 `err` 参数的 `fmt.Errorf` 是创建新 error,不是包装。
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## 五、Error String 规则(1项)
|
|
304
|
+
|
|
305
|
+
### 16. GoRule310 ErrorStringFormat - error string 不得以大写字母开头,结尾不带标点符号 [Critical]
|
|
306
|
+
|
|
307
|
+
**缺陷描述**:错误字符串(传给 `errors.New`、`fmt.Errorf` 的字面量):首字母不得大写(专有名词除外);结尾不得带标点符号(句号、感叹号、问号)。
|
|
308
|
+
|
|
309
|
+
**经典案例**:
|
|
310
|
+
```go
|
|
311
|
+
// 错误写法
|
|
312
|
+
errors.New("Something went wrong")
|
|
313
|
+
fmt.Errorf("User not found, id=%d", id)
|
|
314
|
+
errors.New("invalid input.")
|
|
315
|
+
|
|
316
|
+
// 正确写法
|
|
317
|
+
errors.New("something went wrong")
|
|
318
|
+
fmt.Errorf("user not found, id=%d", id)
|
|
319
|
+
errors.New("invalid input")
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**不应报告的场景**:专有名词(如 MySQL、Redis)可以首字母大写;普通日志字符串不受约束。
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## 六、编程实践规则(1项)
|
|
327
|
+
|
|
328
|
+
### 17. GoRule203 NoElseAfterReturn - 当 if 块以 return 结尾时,应删除 else 语句 [Critical]
|
|
329
|
+
|
|
330
|
+
**缺陷描述**:当 `if` 分支以 `return`(或 `panic`、`continue`、`break`)结尾时,后续的 `else` 块是多余的,应直接去掉 `else`,将代码提升到外层(early return 风格)。
|
|
331
|
+
|
|
332
|
+
**经典案例**:
|
|
333
|
+
```go
|
|
334
|
+
// 错误写法
|
|
335
|
+
func validate(x int) error {
|
|
336
|
+
if x < 0 {
|
|
337
|
+
return errors.New("negative value")
|
|
338
|
+
} else {
|
|
339
|
+
return nil
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// 正确写法
|
|
344
|
+
func validate(x int) error {
|
|
345
|
+
if x < 0 {
|
|
346
|
+
return errors.New("negative value")
|
|
347
|
+
}
|
|
348
|
+
return nil
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**不应报告的场景**:
|
|
353
|
+
- `if` 块不以 return/panic/continue/break 结尾时,`else` 是必要的
|
|
354
|
+
- `if-else if-else` 链中间的 `else` 不适用此规则
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Java 接口鉴权规则
|
|
2
|
+
|
|
3
|
+
检测对外接口的鉴权缺失与越权访问风险。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
### AUTH_JAVA_01. 对外接口缺少鉴权 [high]
|
|
8
|
+
- **检测**:Spring MVC Controller 方法无 @PreAuthorize/@Secured/自定义鉴权注解,且为对外接口
|
|
9
|
+
- **排除**:健康检查/登录/静态资源;有全局拦截器统一鉴权;@PermitAll
|
|
10
|
+
|
|
11
|
+
### AUTH_JAVA_02. 越权访问 - 未校验资源归属 [high]
|
|
12
|
+
- **检测**:通过 @PathVariable 或 @RequestParam 获取资源 ID,未校验资源归属当前用户
|
|
13
|
+
|
|
14
|
+
### AUTH_JAVA_03. 身份校验逻辑错误 [high]
|
|
15
|
+
- **检测**:用 `==` 比较 Long/Integer userId(应用 `.equals()`);校验变量来自请求参数而非 SecurityContext
|
|
16
|
+
|
|
17
|
+
```java
|
|
18
|
+
// 错误写法 — Long 用 == 比较,超出缓存范围时失效
|
|
19
|
+
if (order.getUserId() == currentUserId) { ... }
|
|
20
|
+
|
|
21
|
+
// 正确写法
|
|
22
|
+
if (order.getUserId().equals(currentUserId)) { ... }
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### AUTH_JAVA_04. 鉴权注解或拦截器配置遗漏 [middle]
|
|
26
|
+
- **检测**:SecurityConfig 中部分 URL pattern 遗漏配置;permitAll 范围过宽
|
|
27
|
+
|
|
28
|
+
### AUTH_JAVA_05. 垂直越权 - 敏感操作缺少角色校验 [high]
|
|
29
|
+
- **检测**:管理员操作缺少 `hasRole('ADMIN')` 或等效校验
|
|
30
|
+
- **排除**:RBAC 中间件统一处理
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
**通用排除**:健康检查/登录/静态资源;Spring Security 全局配置;框架统一权限管理
|
package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_CORRECTNESS_RULES.md
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Java 正确性规则
|
|
2
|
+
|
|
3
|
+
静态模式可识别的确定性错误,单次执行可触发。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 一、空指针异常(9项)
|
|
8
|
+
|
|
9
|
+
### CORRECTNESS_JAVA_01. 对象引用未判空直接调用 [Critical]
|
|
10
|
+
- **检测**:数据库/Map/远程调用返回值未判 null 直接调用方法,可能触发 NPE
|
|
11
|
+
- **排除**:有 null 判断;有 Optional 包裹;上下文保证非 null
|
|
12
|
+
|
|
13
|
+
### CORRECTNESS_JAVA_02. 包装类型自动拆箱导致空指针 [Critical]
|
|
14
|
+
- **检测**:Integer/Long/Boolean 等包装类可能为 null 时,直接参与算术运算、`if(flag)` 或三元表达式发生自动拆箱
|
|
15
|
+
- **排除**:有 null 检查;确认不会返回 null
|
|
16
|
+
|
|
17
|
+
### CORRECTNESS_JAVA_03. 级联调用链路中任一环节为空 [Critical]
|
|
18
|
+
- **检测**:`a.getB().getC().getName()` 形式的多级调用,任一层为 null 则 NPE;`Optional.get()` 未判断 `isPresent()`
|
|
19
|
+
- **排除**:有每层 null 检查;使用 `Optional.map` 链式调用
|
|
20
|
+
|
|
21
|
+
### CORRECTNESS_JAVA_04. 集合迭代时元素为 null 未处理 [Critical]
|
|
22
|
+
- **检测**:遍历 List/Stream 时元素可能为 null,直接调用方法
|
|
23
|
+
- **排除**:集合确保无 null 元素;有 `filter(Objects::nonNull)`
|
|
24
|
+
|
|
25
|
+
### CORRECTNESS_JAVA_05. equals 调用顺序导致空指针 [Critical]
|
|
26
|
+
- **检测**:`variable.equals("CONSTANT")` —— variable 可能为 null,应写成 `"CONSTANT".equals(variable)`
|
|
27
|
+
- **排除**:已知 variable 非 null
|
|
28
|
+
|
|
29
|
+
### CORRECTNESS_JAVA_06. Optional 使用不当 [Critical]
|
|
30
|
+
- **检测**:`Optional.get()` 未判断 `isPresent()`;`Optional.of(null)` 应用 `ofNullable`;`orElse(createObj())` 误用(会无条件执行创建对象)
|
|
31
|
+
- **排除**:已判断 `isPresent()`;已改用 `orElseGet`
|
|
32
|
+
|
|
33
|
+
```java
|
|
34
|
+
// 错误写法 — 无论是否需要,createDefault() 必定执行
|
|
35
|
+
String result = optional.orElse(createDefault());
|
|
36
|
+
|
|
37
|
+
// 正确写法 — 仅在 Optional 为空时执行
|
|
38
|
+
String result = optional.orElseGet(() -> createDefault());
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### CORRECTNESS_JAVA_07. 隐式 toString 调用未判空 [Critical]
|
|
42
|
+
- **检测**:`obj.toString()` 或字符串拼接中 obj 可能为 null
|
|
43
|
+
- **排除**:已确认非 null
|
|
44
|
+
|
|
45
|
+
### CORRECTNESS_JAVA_08. @NonNull 方法返回值存在 null 分支 [Critical]
|
|
46
|
+
- **检测**:标注 `@NonNull`/`@NotNull` 的方法,存在 `return null` 的代码路径,违反非空契约
|
|
47
|
+
|
|
48
|
+
### CORRECTNESS_JAVA_09. @Nonnull 字段未在构造方法中初始化 [Critical]
|
|
49
|
+
- **检测**:标注 `@Nonnull` 的成员变量未在构造方法或静态代码块中赋值
|
|
50
|
+
- **排除**:通过 `@Autowired` 注入(Spring 管理)
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 二、集合使用错误(6项)
|
|
55
|
+
|
|
56
|
+
### CORRECTNESS_JAVA_10. 循环中修改集合导致 ConcurrentModificationException [Critical]
|
|
57
|
+
- **检测**:for-each 遍历集合时直接调用集合的 add/remove 方法
|
|
58
|
+
- **排除**:用 `Iterator.remove()`;用 `removeIf()`;用副本遍历
|
|
59
|
+
|
|
60
|
+
### CORRECTNESS_JAVA_11. Arrays.asList 返回的 List 不可修改 [Critical]
|
|
61
|
+
- **检测**:`Arrays.asList(...)` 返回后调用 add/remove,抛 `UnsupportedOperationException`
|
|
62
|
+
- **排除**:已用 `new ArrayList<>(Arrays.asList(...))`
|
|
63
|
+
|
|
64
|
+
### CORRECTNESS_JAVA_12. SubList 操作不当 [Critical]
|
|
65
|
+
- **检测**:`list.subList()` 后修改原 List,再操作 subList 抛 `ConcurrentModificationException`
|
|
66
|
+
- **排除**:已用 `new ArrayList<>(list.subList(...))`
|
|
67
|
+
|
|
68
|
+
### CORRECTNESS_JAVA_13. 可变对象作为 HashMap key [Critical]
|
|
69
|
+
- **检测**:将 List/自定义对象(未正确重写 hashCode/equals)作为 HashMap key,状态变化后无法 get/remove
|
|
70
|
+
- **排除**:对象不可变;对象重写了 hashCode/equals 且不会变化
|
|
71
|
+
|
|
72
|
+
### CORRECTNESS_JAVA_14. Integer 缓存范围外用 == 比较 [Critical]
|
|
73
|
+
- **检测**:Integer 变量用 `==` 比较,值可能超出 -128~127 缓存范围,返回 false
|
|
74
|
+
- **排除**:明确值在 -128~127 范围内;已用 `equals()`
|
|
75
|
+
|
|
76
|
+
```java
|
|
77
|
+
// 错误写法 — 超出缓存范围时 == 比较失败
|
|
78
|
+
Integer a = 200;
|
|
79
|
+
Integer b = 200;
|
|
80
|
+
if (a == b) { ... } // false!
|
|
81
|
+
|
|
82
|
+
// 正确写法
|
|
83
|
+
if (a.equals(b)) { ... } // true
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### CORRECTNESS_JAVA_15. 集合 toArray 强转类型错误 [Critical]
|
|
87
|
+
- **检测**:`(String[]) list.toArray()` 抛 ClassCastException,应用 `list.toArray(new String[0])`
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 三、异常处理错误(5项)
|
|
92
|
+
|
|
93
|
+
### CORRECTNESS_JAVA_16. catch 后静默忽略不处理 [Critical]
|
|
94
|
+
- **检测**:`catch(Exception e) {}` 或 `catch(Exception e) { /* ignore */ }` 完全不记录日志也不抛出
|
|
95
|
+
|
|
96
|
+
### CORRECTNESS_JAVA_17. finally 中 return/throw 覆盖原始值 [Critical]
|
|
97
|
+
- **检测**:finally 块中 `return` 覆盖 try/catch 的返回值;finally 中 `throw` 覆盖原始异常
|
|
98
|
+
|
|
99
|
+
### CORRECTNESS_JAVA_18. catch 后继续执行导致数据不一致 [Critical]
|
|
100
|
+
- **检测**:捕获关键步骤(如扣款)的异常后仅记录日志,继续执行后续步骤(如发货),导致数据不一致
|
|
101
|
+
- **排除**:异常后有事务回滚;后续步骤有幂等保护
|
|
102
|
+
|
|
103
|
+
### CORRECTNESS_JAVA_19. catch 范围过于宽泛掩盖编程错误 [Critical]
|
|
104
|
+
- **检测**:catch Exception/Throwable 将 NPE、ClassCastException 等编程错误也捕获,返回默认值掩盖问题
|
|
105
|
+
- **排除**:顶层 controller/filter 兜底处理;有充分日志记录
|
|
106
|
+
|
|
107
|
+
### CORRECTNESS_JAVA_20. 无限递归导致 StackOverflowError [Critical]
|
|
108
|
+
- **检测**:递归无终止条件;终止条件在特定输入(负数/null)下不可达;toString/hashCode 相互调用形成无限递归
|
|
109
|
+
- **排除**:有充分的终止条件
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 四、数值与逻辑错误(7项)
|
|
114
|
+
|
|
115
|
+
### CORRECTNESS_JAVA_21. BigDecimal 用 double 构造导致精度丢失 [Critical]
|
|
116
|
+
- **检测**:`new BigDecimal(0.1)` 精度不准确,应用 `new BigDecimal("0.1")` 或 `BigDecimal.valueOf(0.1)`
|
|
117
|
+
|
|
118
|
+
### CORRECTNESS_JAVA_22. BigDecimal 除法未指定精度 [Critical]
|
|
119
|
+
- **检测**:`a.divide(b)` 结果为无限小数时抛 ArithmeticException
|
|
120
|
+
- **排除**:已指定 `scale` 和 `RoundingMode`
|
|
121
|
+
|
|
122
|
+
### CORRECTNESS_JAVA_23. BigDecimal 用 equals 比较忽略精度差异 [Critical]
|
|
123
|
+
- **检测**:`a.equals(b)` 比较 BigDecimal 时,`1.0` 不等于 `1.00`,金融场景应用 `compareTo`
|
|
124
|
+
|
|
125
|
+
### CORRECTNESS_JAVA_24. 整数溢出导致逻辑错误 [Critical]
|
|
126
|
+
- **检测**:int 类型大数乘法(如金额×数量)结果溢出变负数
|
|
127
|
+
- **排除**:已用 long;值域确认不会溢出
|
|
128
|
+
|
|
129
|
+
### CORRECTNESS_JAVA_25. switch 缺少 break 导致 fall-through [Critical]
|
|
130
|
+
- **检测**:case 分支缺少 break/return,穿透到下一 case 执行
|
|
131
|
+
- **排除**:有 `// fall through` 注释明确意图
|
|
132
|
+
|
|
133
|
+
```java
|
|
134
|
+
// 错误写法 — case 1 执行后穿透到 case 2
|
|
135
|
+
switch (status) {
|
|
136
|
+
case 1:
|
|
137
|
+
doA(); // 缺少 break,继续执行 case 2
|
|
138
|
+
case 2:
|
|
139
|
+
doB();
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// 正确写法
|
|
144
|
+
switch (status) {
|
|
145
|
+
case 1:
|
|
146
|
+
doA();
|
|
147
|
+
break;
|
|
148
|
+
case 2:
|
|
149
|
+
doB();
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### CORRECTNESS_JAVA_26. 使用 == 比较字符串内容 [Critical]
|
|
155
|
+
- **检测**:`status == "SUCCESS"` 比较字符串引用,动态字符串场景返回 false
|
|
156
|
+
- **排除**:字符串字面量与字面量比较(编译期优化)
|
|
157
|
+
|
|
158
|
+
### CORRECTNESS_JAVA_27. equals/hashCode 实现不当 [Critical]
|
|
159
|
+
- **检测**:重写 equals 未同步重写 hashCode;equals 方法参数不是 Object 类型(实为重载非覆写);破坏对称原则
|
|
160
|
+
- **排除**:Lombok @EqualsAndHashCode 等工具生成
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 五、代码静态检测(9项)
|
|
165
|
+
|
|
166
|
+
### CORRECTNESS_JAVA_28. 循环不应无限 [Critical]
|
|
167
|
+
- **检测**:`while(true)` 内无 break/return/throw;循环退出条件永不满足
|
|
168
|
+
|
|
169
|
+
### CORRECTNESS_JAVA_29. 不可变对象方法返回值被忽略 [Critical]
|
|
170
|
+
- **检测**:`String.trim()`/`replace()` 等不可变对象方法的返回值未赋值(原对象不变)
|
|
171
|
+
|
|
172
|
+
### CORRECTNESS_JAVA_30. read/readLine 返回值未使用 [Critical]
|
|
173
|
+
- **检测**:`InputStream.read(buffer)` 返回的实际读取字节数被忽略,可能处理不完整数据
|
|
174
|
+
|
|
175
|
+
### CORRECTNESS_JAVA_31. 对数组调用 toString/hashCode/equals [Critical]
|
|
176
|
+
- **检测**:`arr.toString()` 得到内存地址而非内容,应用 `Arrays.toString(arr)`
|
|
177
|
+
|
|
178
|
+
### CORRECTNESS_JAVA_32. PreparedStatement/ResultSet 索引越界 [Critical]
|
|
179
|
+
- **检测**:`setInt(2, ...)` 但 SQL 只有 1 个占位符;`ResultSet.getXxx()` 索引超出列数
|
|
180
|
+
|
|
181
|
+
### CORRECTNESS_JAVA_33. 子类覆写时参数类型来自不同 package [Critical]
|
|
182
|
+
- **检测**:子类方法与父类方法参数类型名相同但来自不同包,实为重载非覆写,调用时选择错误
|
|
183
|
+
|
|
184
|
+
```java
|
|
185
|
+
// 父类(父包)
|
|
186
|
+
package com.a;
|
|
187
|
+
public class Base {
|
|
188
|
+
public void handle(com.a.Request req) { ... }
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// 子类(子包)—— 错误写法,实为重载不是覆写
|
|
192
|
+
package com.b;
|
|
193
|
+
public class Child extends Base {
|
|
194
|
+
public void handle(com.b.Request req) { ... } // Request 来自不同包
|
|
195
|
+
// 调用 child.handle(aRequest) 实际仍走父类方法
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### CORRECTNESS_JAVA_34. toString/clone 不应返回 null [Critical]
|
|
200
|
+
- **检测**:`toString()` 返回 null,字符串拼接时输出 "null" 或 NPE;`clone()` 返回 null 违反语义
|
|
201
|
+
|
|
202
|
+
### CORRECTNESS_JAVA_35. 集合强转未验证继承关系 [Critical]
|
|
203
|
+
- **检测**:`(String) map.get("key")` 类型未验证,可能 ClassCastException
|
|
204
|
+
- **排除**:类型已通过泛型保证;有 instanceof 检查
|
|
205
|
+
|
|
206
|
+
### CORRECTNESS_JAVA_36. 子类方法名与父类相同但非覆写 [Critical]
|
|
207
|
+
- **检测**:子类方法参数类型为父类对应类型的子类(如 ArrayList vs List),实为重载非覆写,需加 @Override 验证
|