github / github/codeql

C#: cs/simplifiable-boolean-expression false positive on Nullable<bool> compared with a literal

Abierto Apto para principiantes
#22,556 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
CodeQL
Estrellas
10.1k
Forks
2.1k
Merge medio
2 d 15 h
PR fusionados (30 d)
141

Descripción

**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).

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Start with simplifyBinaryExpr in SimplifyBoolExpr.ql, then inspect how the == and != literal cases determine operand types. Use the nullable-bool examples in the issue to verify that comparisons no longer produce an alert while the existing simplification behavior remains unchanged.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
csharp
Área
devtools
Tipo de issue
Error
Dificultad
2/5
Tiempo estimado
1-3 horas
Estado de actividad
Activo
Claridad
Bien especificado
Aptitud para principiantes
82/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.