C#: cs/simplifiable-boolean-expression false positive on Nullable<bool> compared with a literal
- 主要语言
- CodeQL
- 星标
- 10.1k
- 派生
- 2.1k
- 平均合并
- 2 天 15 小时
- 30 天内合并 PR
- 141
描述
**Description of the false positive**
`cs/simplifiable-boolean-expression` flags `x == false` and `x == true` when `x` is a `bool?` (`Nullable`), suggesting `!x` / `x`. The suggestion is not equivalent and does not compile: `!x` on a `bool?` is `CS0266`/`CS0023`, and using a `bool?` directly as a condition is `CS0266`. Comparing a nullable bool with a literal is the idiomatic way to write "has a value and it is false", and it is also the form EF Core translates cleanly (`x is false` is not allowed in an expression tree, and `x.HasValue && !x.Value` is what the rule is meant to steer people away from).
`simplifyBinaryExpr` in `SimplifyBoolExpr.ql` only matches on the operator; it never checks the operand's type. Restricting the `==`/`!=`-with-literal cases to operands whose type is `bool` (not `Nullable`) would remove the false positive.
The alert is raised as a Code Quality finding on every PR touching one of these comparisons, and there is no way to filter a rule under Code Quality's default setup, so it recurs.
**Code samples or links to source code**
```csharp
public class Rule
{
public bool? ScanToLocation { get; set; }
public int? LocationId { get; set; }
}
// Flagged: "The expression 'A == false' can be simplified to '!A'."
// !r.ScanToLocation does not compile for a bool?.
var rules = context.Rules
.Where(r => r.ScanToLocation == false && r.LocationId != null)
.ToList();
// Also flagged, same problem
var off = rules.Where(r => r.ScanToLocation == false);
```
Expected: no alert when the operand is `Nullable`.
**URL to the alert on GitHub code scanning (optional)**
Private repository (Code Quality PR comments, CodeQL CLI 2.27.0 with the `code-quality` suite).
贡献指南
调研方向
先从 SimplifyBoolExpr.ql 中的 simplifyBinaryExpr 开始,然后检查 == 和 != 字面量情况如何确定操作数类型。使用 issue 中的 nullable-bool 示例,验证比较不再产生 alert,同时现有的简化行为保持不变。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- csharp
- 领域
- devtools
- Issue 类型
- 缺陷
- 难度
- 2/5
- 预计耗时
- 1-3 小时
- 活跃度
- 活跃
- 描述清晰度
- 描述清楚
- 新手友好度
- 82/100