|
|
# CodeDetect 贡献指南
|
|
|
|
|
|
感谢您对CodeDetect项目的关注!本文档将指导您如何为项目做出贡献。
|
|
|
|
|
|
## 目录
|
|
|
|
|
|
- [行为准则](#行为准则)
|
|
|
- [开始贡献](#开始贡献)
|
|
|
- [开发环境设置](#开发环境设置)
|
|
|
- [代码规范](#代码规范)
|
|
|
- [测试规范](#测试规范)
|
|
|
- [提交规范](#提交规范)
|
|
|
- [Pull Request流程](#pull-request流程)
|
|
|
- [问题报告](#问题报告)
|
|
|
- [功能请求](#功能请求)
|
|
|
|
|
|
## 行为准则
|
|
|
|
|
|
### 我们的承诺
|
|
|
|
|
|
为了营造开放和友好的环境,我们作为贡献者和维护者承诺:
|
|
|
|
|
|
- 友善和包容
|
|
|
- 尊重不同观点和经验
|
|
|
- 耐心接受建设性批评
|
|
|
- 关注社区最大利益
|
|
|
|
|
|
### 不当行为
|
|
|
|
|
|
不当行为包括:
|
|
|
|
|
|
- 使用性暗示语言或图像
|
|
|
- 人身攻击或侮辱性评论
|
|
|
- 公开或私下骚扰
|
|
|
- 未经明确许可发布他人信息
|
|
|
|
|
|
## 开始贡献
|
|
|
|
|
|
### 寻找要贡献的内容
|
|
|
|
|
|
1. 查看 [Issues](https://github.com/your-username/codedetect/issues) 中标记为 "good first issue" 的问题
|
|
|
2. 查看 [Features](https://github.com/your-username/codedetect/issues) 中请求的功能
|
|
|
3. 改进文档
|
|
|
4. 修复拼写错误或格式问题
|
|
|
5. 添加测试用例
|
|
|
|
|
|
### 与团队沟通
|
|
|
|
|
|
- 在开始工作之前,先创建Issue讨论
|
|
|
- 在Issue中@相关维护者
|
|
|
- 加入我们的[社区讨论](https://github.com/your-username/codedetect/discussions)
|
|
|
|
|
|
## 开发环境设置
|
|
|
|
|
|
### 前提条件
|
|
|
|
|
|
- Python 3.8+
|
|
|
- Git
|
|
|
- CBMC (可选,用于运行完整测试)
|
|
|
|
|
|
### 克隆仓库
|
|
|
|
|
|
```bash
|
|
|
git clone https://github.com/your-username/codedetect.git
|
|
|
cd codedetect
|
|
|
```
|
|
|
|
|
|
### 设置开发环境
|
|
|
|
|
|
```bash
|
|
|
# 创建虚拟环境
|
|
|
python -m venv venv
|
|
|
source venv/bin/activate # Windows: venv\Scripts\activate
|
|
|
|
|
|
# 安装依赖
|
|
|
pip install -r requirements.txt
|
|
|
pip install -r requirements-dev.txt
|
|
|
|
|
|
# 安装pre-commit hooks
|
|
|
pre-commit install
|
|
|
```
|
|
|
|
|
|
### 验证设置
|
|
|
|
|
|
```bash
|
|
|
# 运行测试
|
|
|
python -m pytest tests/unit/ -v
|
|
|
|
|
|
# 检查代码风格
|
|
|
black --check src/ tests/
|
|
|
flake8 src/ tests/
|
|
|
isort --check-only src/ tests/
|
|
|
|
|
|
# 检查类型
|
|
|
mypy src/
|
|
|
```
|
|
|
|
|
|
## 代码规范
|
|
|
|
|
|
### Python代码风格
|
|
|
|
|
|
我们遵循以下工具和规范:
|
|
|
|
|
|
- **Black**: 代码格式化
|
|
|
- **flake8**: 代码风格检查
|
|
|
- **isort**: 导入排序
|
|
|
- **mypy**: 类型检查
|
|
|
|
|
|
#### 格式化代码
|
|
|
|
|
|
```bash
|
|
|
# 格式化代码
|
|
|
black src/ tests/
|
|
|
isort src/ tests/
|
|
|
|
|
|
# 检查格式
|
|
|
black --check src/ tests/
|
|
|
isort --check-only src/ tests/
|
|
|
```
|
|
|
|
|
|
#### 代码风格规则
|
|
|
|
|
|
```python
|
|
|
# 好的示例
|
|
|
import os
|
|
|
from typing import List, Dict
|
|
|
|
|
|
class CodeProcessor:
|
|
|
"""代码处理器类"""
|
|
|
|
|
|
def __init__(self, config: Dict[str, Any]):
|
|
|
self.config = config
|
|
|
|
|
|
def process_code(self, code: str) -> List[str]:
|
|
|
"""处理代码
|
|
|
|
|
|
Args:
|
|
|
code: 要处理的代码字符串
|
|
|
|
|
|
Returns:
|
|
|
处理后的代码行列表
|
|
|
"""
|
|
|
if not code:
|
|
|
return []
|
|
|
|
|
|
return code.split('\n')
|
|
|
|
|
|
# 避免的做法
|
|
|
class codeProcessor: # 类名应该使用CamelCase
|
|
|
def __init__(self,config): # 缺少空格和类型注解
|
|
|
self.config=config
|
|
|
```
|
|
|
|
|
|
### 文档规范
|
|
|
|
|
|
#### 文档字符串
|
|
|
|
|
|
使用Google风格的文档字符串:
|
|
|
|
|
|
```python
|
|
|
def verify_function(
|
|
|
function_name: str,
|
|
|
source_code: str,
|
|
|
options: Optional[Dict[str, Any]] = None
|
|
|
) -> VerificationResult:
|
|
|
"""验证函数的内存安全性。
|
|
|
|
|
|
Args:
|
|
|
function_name: 要验证的函数名
|
|
|
source_code: 包含函数的源代码
|
|
|
options: 可选的验证选项
|
|
|
|
|
|
Returns:
|
|
|
VerificationResult: 验证结果对象
|
|
|
|
|
|
Raises:
|
|
|
ValueError: 如果函数名或源代码无效
|
|
|
VerificationError: 如果验证过程失败
|
|
|
"""
|
|
|
pass
|
|
|
```
|
|
|
|
|
|
#### 注释规范
|
|
|
|
|
|
```python
|
|
|
# 好的注释
|
|
|
def process_data(data: List[str]) -> Dict[str, int]:
|
|
|
"""处理输入数据并返回统计信息。
|
|
|
|
|
|
这个函数会去除空行,统计每个单词的出现频率,
|
|
|
并返回频率最高的前10个单词。
|
|
|
"""
|
|
|
# 过滤空行和空白字符
|
|
|
filtered_data = [line.strip() for line in data if line.strip()]
|
|
|
|
|
|
# 统计词频
|
|
|
word_counts = {}
|
|
|
for line in filtered_data:
|
|
|
for word in line.split():
|
|
|
word_counts[word] = word_counts.get(word, 0) + 1
|
|
|
|
|
|
return word_counts
|
|
|
|
|
|
# 避免的注释
|
|
|
def bad_example(data):
|
|
|
# 这个函数处理数据
|
|
|
result = [] # 初始化结果列表
|
|
|
for item in data: # 遍历数据
|
|
|
result.append(item) # 添加到结果
|
|
|
return result # 返回结果
|
|
|
```
|
|
|
|
|
|
## 测试规范
|
|
|
|
|
|
### 测试结构
|
|
|
|
|
|
```
|
|
|
tests/
|
|
|
├── unit/ # 单元测试
|
|
|
├── integration/ # 集成测试
|
|
|
├── performance/ # 性能测试
|
|
|
├── regression/ # 回归测试
|
|
|
└── fixtures/ # 测试固件
|
|
|
```
|
|
|
|
|
|
### 编写测试
|
|
|
|
|
|
#### 单元测试示例
|
|
|
|
|
|
```python
|
|
|
import pytest
|
|
|
from unittest.mock import Mock, patch
|
|
|
from src.processor import CodeProcessor
|
|
|
|
|
|
class TestCodeProcessor:
|
|
|
"""代码处理器测试"""
|
|
|
|
|
|
@pytest.fixture
|
|
|
def processor(self):
|
|
|
"""创建处理器实例"""
|
|
|
return CodeProcessor({"max_length": 100})
|
|
|
|
|
|
def test_process_simple_code(self, processor):
|
|
|
"""测试简单代码处理"""
|
|
|
code = "int main() { return 0; }"
|
|
|
result = processor.process_code(code)
|
|
|
|
|
|
assert len(result) == 1
|
|
|
assert result[0] == "int main() { return 0; }"
|
|
|
|
|
|
def test_process_empty_code(self, processor):
|
|
|
"""测试空代码处理"""
|
|
|
result = processor.process_code("")
|
|
|
assert result == []
|
|
|
|
|
|
@patch('src.processor.external_api')
|
|
|
def test_process_with_external_dependency(self, mock_api, processor):
|
|
|
"""测试有外部依赖的代码处理"""
|
|
|
mock_api.return_value = {"status": "success"}
|
|
|
|
|
|
result = processor.process_with_api("test code")
|
|
|
|
|
|
mock_api.assert_called_once()
|
|
|
assert result["status"] == "success"
|
|
|
```
|
|
|
|
|
|
#### 集成测试示例
|
|
|
|
|
|
```python
|
|
|
import pytest
|
|
|
from src.main import CodeDetectApp
|
|
|
|
|
|
class TestCodeDetectIntegration:
|
|
|
"""CodeDetect集成测试"""
|
|
|
|
|
|
@pytest.fixture
|
|
|
def app(self):
|
|
|
"""创建应用实例"""
|
|
|
return CodeDetectApp()
|
|
|
|
|
|
def test_full_verification_pipeline(self, app):
|
|
|
"""测试完整验证管道"""
|
|
|
test_code = """
|
|
|
int add(int a, int b) {
|
|
|
return a + b;
|
|
|
}
|
|
|
"""
|
|
|
|
|
|
result = app.verify_code(test_code)
|
|
|
|
|
|
assert result["success"] is True
|
|
|
assert "verification_result" in result
|
|
|
assert result["verification_result"]["status"] == "SUCCESS"
|
|
|
```
|
|
|
|
|
|
### 测试覆盖率要求
|
|
|
|
|
|
- **单元测试**: 最低80%行覆盖率
|
|
|
- **集成测试**: 覆盖所有主要功能路径
|
|
|
- **性能测试**: 覆盖关键性能指标
|
|
|
- **回归测试**: 覆盖所有已修复的问题
|
|
|
|
|
|
### 运行测试
|
|
|
|
|
|
```bash
|
|
|
# 运行所有测试
|
|
|
python -m pytest
|
|
|
|
|
|
# 运行特定测试类型
|
|
|
python -m pytest tests/unit/
|
|
|
python -m pytest tests/integration/
|
|
|
|
|
|
# 运行覆盖率测试
|
|
|
python -m pytest --cov=src/ --cov-report=html
|
|
|
|
|
|
# 运行性能测试
|
|
|
python -m pytest tests/performance/ -m "not slow"
|
|
|
|
|
|
# 并行运行测试
|
|
|
python -m pytest -n auto
|
|
|
```
|
|
|
|
|
|
## 提交规范
|
|
|
|
|
|
### 提交消息格式
|
|
|
|
|
|
```
|
|
|
<类型>(<范围>): <描述>
|
|
|
|
|
|
[可选的详细描述]
|
|
|
|
|
|
[可选的脚注]
|
|
|
```
|
|
|
|
|
|
### 提交类型
|
|
|
|
|
|
- **feat**: 新功能
|
|
|
- **fix**: 修复bug
|
|
|
- **docs**: 文档更新
|
|
|
- **style**: 代码格式化
|
|
|
- **refactor**: 代码重构
|
|
|
- **test**: 测试相关
|
|
|
- **chore**: 构建或工具变动
|
|
|
|
|
|
### 提交示例
|
|
|
|
|
|
```bash
|
|
|
# 好的提交
|
|
|
feat(verification): add support for array bounds checking
|
|
|
- Add array bounds checking functionality
|
|
|
- Update verification result format
|
|
|
- Add unit tests for new feature
|
|
|
|
|
|
fix(parser): fix null pointer dereference in code parsing
|
|
|
- Add null check before pointer access
|
|
|
- Fix issue #123
|
|
|
- Add regression test
|
|
|
|
|
|
docs(api): update API documentation
|
|
|
- Add new endpoint documentation
|
|
|
- Fix broken links
|
|
|
- Update examples
|
|
|
|
|
|
# 避免的提交
|
|
|
fix bug
|
|
|
update docs
|
|
|
minor changes
|
|
|
```
|
|
|
|
|
|
### 提交前检查
|
|
|
|
|
|
```bash
|
|
|
# 运行所有检查
|
|
|
./scripts/run-comprehensive-tests.sh
|
|
|
|
|
|
# 或者单独运行
|
|
|
python -m pytest
|
|
|
black --check src/ tests/
|
|
|
flake8 src/ tests/
|
|
|
mypy src/
|
|
|
```
|
|
|
|
|
|
## Pull Request流程
|
|
|
|
|
|
### PR流程
|
|
|
|
|
|
1. **Fork仓库**
|
|
|
2. **创建功能分支**
|
|
|
3. **编写代码和测试**
|
|
|
4. **确保所有测试通过**
|
|
|
5. **提交代码**
|
|
|
6. **创建Pull Request**
|
|
|
7. **响应审查意见**
|
|
|
8. **合并代码**
|
|
|
|
|
|
### 分支命名
|
|
|
|
|
|
```
|
|
|
feature/your-feature-name
|
|
|
fix/your-fix-name
|
|
|
docs/your-docs-update
|
|
|
```
|
|
|
|
|
|
### PR模板
|
|
|
|
|
|
```markdown
|
|
|
## 变更描述
|
|
|
|
|
|
简要描述这个PR的目的和变更内容。
|
|
|
|
|
|
## 变更类型
|
|
|
|
|
|
- [ ] Bug修复
|
|
|
- [ ] 新功能
|
|
|
- [ ] 文档更新
|
|
|
- [ ] 重构
|
|
|
- [ ] 测试
|
|
|
- [ ] 其他: ___
|
|
|
|
|
|
## 相关Issue
|
|
|
|
|
|
Closes #123
|
|
|
Related to #456
|
|
|
|
|
|
## 测试
|
|
|
|
|
|
- [ ] 添加了单元测试
|
|
|
- [ ] 添加了集成测试
|
|
|
- [ ] 手动测试通过
|
|
|
- [ ] 所有现有测试通过
|
|
|
|
|
|
## 检查清单
|
|
|
|
|
|
- [ ] 代码遵循项目规范
|
|
|
- [ ] 文档已更新
|
|
|
- [ ] 测试覆盖率满足要求
|
|
|
- [ ] 无安全漏洞
|
|
|
- [ ] 性能影响已考虑
|
|
|
```
|
|
|
|
|
|
### PR审查指南
|
|
|
|
|
|
#### 审查者检查清单
|
|
|
|
|
|
- [ ] 代码是否清晰易懂
|
|
|
- [ ] 是否遵循项目规范
|
|
|
- [ ] 测试是否充分
|
|
|
- [ ] 文档是否更新
|
|
|
- [ ] 是否有潜在的安全问题
|
|
|
- [ ] 性能影响是否合理
|
|
|
- [ ] 错误处理是否完善
|
|
|
|
|
|
#### 审查评论示例
|
|
|
|
|
|
```markdown
|
|
|
### 代码审查
|
|
|
|
|
|
**总体印象**: 代码质量很好,逻辑清晰。
|
|
|
|
|
|
**建议**:
|
|
|
1. 在第45行,建议添加错误处理:
|
|
|
```python
|
|
|
try:
|
|
|
result = dangerous_operation()
|
|
|
except Exception as e:
|
|
|
logger.error(f"Operation failed: {e}")
|
|
|
return None
|
|
|
```
|
|
|
|
|
|
2. 考虑将这个函数拆分成更小的函数以提高可读性
|
|
|
|
|
|
**问题**:
|
|
|
- 为什么选择使用这种算法而不是其他替代方案?
|
|
|
|
|
|
**表扬**:
|
|
|
- 测试覆盖很全面
|
|
|
- 错误处理很好
|
|
|
```
|
|
|
|
|
|
## 问题报告
|
|
|
|
|
|
### 报告Bug
|
|
|
|
|
|
使用GitHub Issue模板报告bug:
|
|
|
|
|
|
```markdown
|
|
|
## Bug描述
|
|
|
|
|
|
简要描述bug现象。
|
|
|
|
|
|
## 复现步骤
|
|
|
|
|
|
1. 执行操作A
|
|
|
2. 点击按钮B
|
|
|
3. 观察现象C
|
|
|
|
|
|
## 期望行为
|
|
|
|
|
|
描述期望的正确行为。
|
|
|
|
|
|
## 实际行为
|
|
|
|
|
|
描述实际观察到的行为。
|
|
|
|
|
|
## 环境信息
|
|
|
|
|
|
- 操作系统: Ubuntu 20.04
|
|
|
- Python版本: 3.9.0
|
|
|
- CodeDetect版本: v1.0.0
|
|
|
- CBMC版本: 5.10
|
|
|
|
|
|
## 其他信息
|
|
|
|
|
|
添加任何其他相关信息、截图、日志等。
|
|
|
```
|
|
|
|
|
|
### 功能请求
|
|
|
|
|
|
```markdown
|
|
|
## 功能描述
|
|
|
|
|
|
描述你希望添加的功能。
|
|
|
|
|
|
## 使用场景
|
|
|
|
|
|
描述这个功能的使用场景和用户需求。
|
|
|
|
|
|
## 建议实现
|
|
|
|
|
|
如果你有实现建议,请描述。
|
|
|
|
|
|
## 替代方案
|
|
|
|
|
|
描述你考虑过的替代方案。
|
|
|
|
|
|
## 附加信息
|
|
|
|
|
|
添加任何其他相关信息。
|
|
|
```
|
|
|
|
|
|
## 发布流程
|
|
|
|
|
|
### 版本号规范
|
|
|
|
|
|
- **主版本号**: 不兼容的API变更
|
|
|
- **次版本号**: 向后兼容的功能新增
|
|
|
- **修订号**: 向后兼容的问题修复
|
|
|
|
|
|
### 发布检查清单
|
|
|
|
|
|
- [ ] 所有测试通过
|
|
|
- [ ] 文档已更新
|
|
|
- [ ] 变更日志已更新
|
|
|
- [ ] 版本号已更新
|
|
|
- [ ] 安全检查通过
|
|
|
- [ ] 性能测试通过
|
|
|
|
|
|
## 获取帮助
|
|
|
|
|
|
如果您在贡献过程中遇到问题:
|
|
|
|
|
|
1. 查看 [文档](https://github.com/your-username/codedetect/docs)
|
|
|
2. 搜索现有的 [Issues](https://github.com/your-username/codedetect/issues)
|
|
|
3. 在 [Discussions](https://github.com/your-username/codedetect/discussions) 中提问
|
|
|
4. 联系维护者
|
|
|
|
|
|
## 致谢
|
|
|
|
|
|
感谢所有为CodeDetect项目做出贡献的开发者!
|
|
|
|
|
|
特别感谢:
|
|
|
- 所有Issue报告者
|
|
|
- 所有Pull Request贡献者
|
|
|
- 所有文档改进者
|
|
|
- 所有测试编写者
|
|
|
|
|
|
您的贡献使CodeDetect变得更好!🎉 |