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

Open Beginner friendly
#22,556 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
82/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
csharp
Domain
devtools

Research direction

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.

Written by the indexing model from the issue text.

Description

Description of the false positive

cs/simplifiable-boolean-expression flags x == false and x == true when x is a bool? (Nullable<bool>), 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<bool>) 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

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<bool>.

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

Dominant language
CodeQL
Stars
10.1k
Forks
2.1k
Avg merge
2d 11h
Merged PRs (30d)
129

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from github/codeql

All issues in github/codeql

Similar issues

More DevTools issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.