deanthecoder/ReviewG33k
GitHub: deanthecoder/ReviewG33k
一款面向 C#/.NET 项目的轻量级桌面代码审查工具,通过数十项针对性检查规则帮助开发者快速发现代码质量问题。
Stars: 1 | Forks: 0
# ReviewG33k
ReviewG33k 是一款轻量级桌面应用程序,用于快速、实用的代码审查。它主要针对 C#/.NET 项目,并对诸如 C/C++ 探索及轻量级检查等提供少量的通用源文件支持。为其提供一个 Bitbucket pull request 或本地代码库,让它扫描代码,然后直接跳转到对应的文件。

## 其他窗口
### 审查结果
主要的审查工作区:分类发现、源码预览、快速修复、导出以及一键打开操作。

### 问题分类
带有实时分类切换功能的紧凑饼图视图,方便您在审查时隐藏整个问题类型。

### 审查设置
用于未来扫描的持久化问题类型偏好设置。使用主窗口右上角的齿轮按钮来选择 ReviewG33k 应该运行的检查,例如当缺失测试建议或公共参数守卫提示不适合您的审查风格时,可以将其禁用。
## 功能特性
- 通过粘贴或拖入 PR URL 来审查 **Bitbucket pull request**。
- 审查**本地已提交的更改**、**本地未提交的更改**、**整个本地代码库**,或没有 Git 的**整个本地文件夹**。
- 根据所需的扫描彻底程度,在**更改的行**和**完整修改的文件**之间进行切换。
- 准备隔离的审查 worktree,使您正常的工作树保持原样。
- 查看分组到清晰类别中的发现,例如 `Correctness`、`Threading`、`UI` 和 `Repo Hygiene`。
- 在 **VS Code**、**Visual Studio**、**Rider**、您的**文件浏览器**中打开发现,或将位置复制到**剪贴板**。
- 应用支持的快速修复,导出发现,生成 Codex 提示,以及有选择地发布 Bitbucket PR 评论。
- 使用分类细分窗口按类别实时过滤结果。
## 工作原理(宏观层面)
1. 选择一种审查模式。
2. ReviewG33k 收集相关文件或 diff。
3. 它对这些代码运行针对性的检查。
4. 您对结果进行审查、过滤、修复、导出、打开或评论。
## 快速开始
- **Pull request 审查**:选择一个代码库根目录,粘贴或拖入 PR URL,然后点击 **Review PR**。
- **本地已提交审查**:选择 **Local Committed Changes**,选取一个代码库和基础分支,然后点击 **Review Local**。
- **本地未提交审查**:选择 **Local Uncommitted Changes**,选取一个代码库,然后点击 **Review Local**。
- **整个代码库审查**:选择 **Entire Local Repository**,选取一个代码库,然后点击 **Review Local**。
- **整个文件夹审查**:选择 **Entire Local Folder**,选取任何源代码文件夹,然后点击 **Review Local**。
- **问题类型偏好设置**:点击主窗口右上角的齿轮按钮,启用或禁用检查,然后保存。更改将应用于下次扫描。
## 命令行用法
ReviewG33k 也可以在没有 UI 的情况下运行,用于本地审查自动化,包括从 Codex 或脚本执行编码后的检查。
```
ReviewG33k --cli --repo
--mode uncommitted
ReviewG33k --cli --repo --mode committed --base main
ReviewG33k --cli --repo --mode tree
```
也支持 Windows 风格的开关:
```
ReviewG33k /cli /repo /mode uncommitted
```
模式:
- `uncommitted` 审查工作树相对于 `HEAD` 的更改。
- `committed` 审查已提交的本地更改相对于 `origin/` 的差异。
- `tree` 审查本地代码库中所有可分析的文件。
退出代码:
- `0`:没有发现。
- `1`:报告了发现。
- `2`:审查失败。
运行 `ReviewG33k --help` 或 `ReviewG33k /?` 查看用法。
## 构建和运行
前置条件:.NET 8 SDK。
可选:`git`,用于 Bitbucket pull request 和基于 Git 的本地审查模式。
可选工具:
- VS Code `code` CLI,用于在 VS Code 中打开发现
- Visual Studio、Rider 或桌面文件浏览器,作为替代的打开目标
```
dotnet build ReviewG33k.sln
dotnet run --project ReviewG33k.csproj
```
## 支持的检查
所有检查默认启用。审查设置对话框允许您禁用个别问题类型,而无需更改在已打开的结果窗口中使用的实时类别过滤器。
### 发现分类(结果视图)
ReviewG33k 使用以下类别之一标记每个发现:
- `Correctness`
- `Threading`
- `Performance`
- `Resources`
- `API/Design`
- `Readability`
- `Maintainability`
- `Testing`
- `Documentation`
- `UI`
- `Repo Hygiene`
### 异步和线程
| 检查 | 标记内容 |
| --- | --- |
| Async void (非事件处理程序) | 可能会掩盖错误的 `async void` 方法。 |
| Async 方法命名 | 不以 `Async` 结尾的 `async` 方法。 |
| Task.Run(async ...) | 包装在 `Task.Run(...)` 中的异步工作,可能是不必要或有风险的。 |
| 未观察到的 task 结果 | 结果被忽略的即发即弃 task 调用。 |
| Thread.Sleep 使用 | 在新增代码路径中的阻塞式 sleep。 |
| Lock 目标 | `lock(this)` 或对可能为公共对象的锁定。 |
### 异常和可靠性
| 检查 | 标记内容 |
| --- | --- |
| 空 catch 块 | 没有实际处理逻辑的 `catch` 块。 |
| 空方法 | 没有实现语句的新增普通方法。 |
| 吞噬异常的 catch 块 | 静默消费异常的 `catch` 块。 |
| catch 块中的 `throw ex;` | 丢失原始堆栈跟踪上下文的重新抛出模式。 |
| `IDisposable` 未 dispose | 创建了但没有明确 dispose 的 Disposable 对象。 |
| 没有 `IDisposable` 的 Dispose 方法 | 定义了 `Dispose()` 但未实现 `IDisposable` 的类型。 |
| 空 Dispose 方法 | 没有清理语句的 `Dispose()` 方法。 |
| 构造函数事件订阅生命周期 | 订阅了事件但没有明确取消订阅/disposal 生命周期的构造函数。 |
| 多次枚举 | 意外地重新枚举延迟的 `IEnumerable` 值。 |
| 急切具体化的 IEnumerable 返回 | 返回 `ToList()`/`ToArray()` 结果而不是延迟序列的 `IEnumerable` 方法。 |
| LINQ Count 与零比较 | 在 `Any()` 更清晰且成本更低的情况下,对序列使用 `Count()`/`LongCount()` 进行零检查。 |
| 属性 setter 忽略值 | 不读取隐式 `value` 参数的 setter。 |
| 公共方法参数守卫 | 新增公共方法中缺少 null 守卫。 |
| 文件输出的数字格式 | 转换为文本用于文件写入的 `double`/`float`/`decimal` 没有 `InvariantCulture`。 |
### 设计和可维护性
| 检查 | 标记内容 |
| --- | --- |
| 属性可以是自动属性 | 可以简化为自动属性的冗余属性模式。 |
| 私有只读获取属性应为字段 | 更适合表示为字段的私有只读自动属性。 |
| 私有属性应为字段 | 实际上是字段包装器的简单私有属性。 |
| 私有字段可为 readonly | 仅在构造期间写入的私有字段。 |
| 仅在构造函数中使用的私有 readonly 字段 | 引用仅限于构造函数设置,可能成为局部变量的私有 readonly 字段。 |
| 方法可为 static | 不使用实例状态的实例方法。 |
| 局部变量可为 const | 从不改变且可安全设为 `const` 的局部值。 |
| 重复的代码块 | 在忽略注释和 `using` 行之后,与现有代码库代码完全匹配的新增代码块。 |
| 具有常量返回值的 Bool 方法 | 控制流始终返回相同字面值的非私有 `bool` 方法。 |
| 具有常量返回值的私有 Bool 方法 | 调用方可能被简化的私有 `bool` 方法,因为它们始终返回相同的字面值。 |
| 未使用的局部变量 | 已声明/赋值但从未读取的局部变量。 |
| 未使用的方法参数 | 从未被新增普通方法读取的方法参数。 |
| 每个文件多个类 | 定义了多个类的文件(推荐每个文件一个类)。 |
| 源文件名不匹配 | 文件名与所包含类型不匹配的单类型 `.cs` 文件。 |
| 冗余的自查找 | 不必要地从对象自身解析对象(或等效的冗余查找)。 |
| 公共可变静态状态 | 暴露的可变静态字段/属性。 |
| 未使用的私有成员 | 从未使用过的新增私有代码。 |
| 未使用的 `using` 指令 | 从未被引用的新增导入。 |
### 可读性和风格
| 检查 | 标记内容 |
| --- | --- |
| 方法之间缺少空行 | 挤在一起降低可读性的方法块。 |
| 大括号对之间的空行 | 连续仅含大括号的行之间的空行,如 `}` ... `}` 或 `{` ... `{`。 |
| 高参数数量 | 参数过多的方法/构造函数。 |
| 连续的位置 bool 参数 | 带有连续未命名 `true`/`false` 字面值的调用(为清晰起见,建议使用命名参数)。 |
| 连续的位置 null 参数 | 带有连续未命名 `null` 字面值的调用(为清晰起见,建议使用命名参数)。 |
| Lambda 可为方法组 | 可以被简化的传递 lambda,如 `() => Guid.NewGuid()` 或 `x => Normalize(x)`。 |
| 泛型类型名称后缀 | 不遵循预期后缀约定的泛型类型名称。 |
| If/else 大括号一致性 | `if` 和 `else` 块之间大括号风格不匹配。 |
| 不必要的 if/else 大括号 | 在简单的单行分支周围添加的额外大括号。 |
| 过大的构造函数 | 执行过多内联设置工作的构造函数。 |
| 布尔字面值比较 | 诸如 `== true` / `== false` 可以被简化的比较。 |
| 局部变量使用字段样式前缀 | 使用诸如 `m_foo` 或 `_foo` 等字段样式前缀命名的局部变量。 |
| 不必要的强制转换 | 不改变类型或行为的强制转换。 |
| 不必要的枚举成员值 | 仅匹配默认顺序编号的显式枚举值。 |
| 不必要的逐字字符串前缀 | 没有使用转义好处的 `@` 字符串前缀。 |
| 对同一目标的重复字符串连接 | 在一个块中对同一字符串目标进行 4 次以上的连接(考虑使用 `StringBuilder`)。 |
### 测试和文档覆盖
| 检查 | 标记内容 |
| --- | --- |
| 缺少 XML 文档 | 没有 XML 文档的新增公共类型。 |
| 空 XML 文档内容 | 存在但未包含有意义内容的 XML 文档标签。 |
| 缺少单元测试更新 | 没有相应测试更改的新增生产更改。 |
| 缺少新增公共方法的测试 | 没有测试覆盖更改的新增公共方法。 |
| 新项目缺少 README | 没有附带 README 的新增项目。 |
| 新源文件缺少免责声明/文件头 | 可能需要标准文件头/免责声明的新增源文件。 |
### 本地化 (RESX)
| 检查 | 标记内容 |
| --- | --- |
| 缺少区域设置键 | 缺少基础资源中存在的键的本地化 `.resx` 文件。 |
| 意外的额外区域设置键 | 包含基础资源中不存在的键的本地化 `.resx` 文件。 |
| 空的翻译值 | 翻译文本为空/空白的本地化 `.resx` 条目。 |
| 值中的边界空白 | 更改条目中带有意外前导/尾随空格的资源值。 |
| 美式/英式英语混用 | 中性 `.resx` 文件中混合了美式和英式拼写,程度足以显得不一致。 |
| `en-GB` 中的美式英语 | 包含明显美式拼写(如 `color`/`analyze`)的英式区域文件。 |
| `en-US` 中的英式英语 | 包含明显英式拼写(如 `colour`/`analyse`)的美式区域文件。 |
### 框架和抑制
| 检查 | 标记内容 |
| --- | --- |
| 缺少类型化绑定上下文 (Avalonia) | 在预期有类型化上下文的地方没有类型化上下文的 XAML 绑定。 |
| 布局容器上的固定尺寸 | 将宽度/高度应用于期望灵活性的多子布局容器。 |
| 单子包装容器 | 仅包装一个子项且未添加有意义行为的父容器。 |
| 嵌套的同面板包装器 | 相同面板类型的冗余嵌套容器。 |
| 空的多子容器 | 声时没有子元素的多子容器元素。 |
| 警告抑制 | 新增的 `#pragma warning disable` 或 `[SuppressMessage]` 抑制。 |
| 文件编码更改 | 检测到的编码发生更改的文本文件。 |
| 文件换行符样式更改 | 换行符样式在 LF、CRLF、CR 或混合样式之间发生更改的文本文件。 |
| 仅格式化更改 | 仅空格格式发生更改的生产性 C# 文件。 |
| 仅尾随空格更改 | 其 diff 似乎仅由尾随空格更改组成的文件。 |
## 许可证
基于 MIT 许可证授权。详情请见 [LICENSE](LICENSE)。标签:Bitbucket, C/C++, Codex提示, Correctness, DNS解析, Git, Pull Request, Repo Hygiene, Rider, SDLC, Threading, Visual Studio, Visual Studio Code, VS Code, 中间件漏洞, 事务性I/O, 代码优化, 代码分析工具, 代码安全, 代码审查工具, 代码审查自动化, 代码审查软件, 代码扫描器, 代码规范, 威胁情报, 安全专业人员, 开发者工具, 开发辅助工具, 开源项目, 快速修复, 数据管道, 文件浏览器, 本地仓库扫描, 桌面应用, 测试发现, 漏洞枚举, 系统独立性, 编程工具, 网络安全研究, 自动化审查, 软件工程, 软件开发生命周期, 远程代码执行, 错误基检测, 静态代码分析, 项目扫描