diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll index a470d0c4b8a2..6fed45cdf84d 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll @@ -293,6 +293,8 @@ private predicate isMatchingConstant(PatternExpr pe, boolean value) { value = true or exists(Type t, Type strippedType | + not t instanceof UnknownType and + not strippedType instanceof UnknownType and typePatternMustHaveMatchingCompletion(pe, t, strippedType) and not typePatternCommonSubType(t, strippedType) and value = false diff --git a/csharp/ql/src/change-notes/2025-03-10-unknown-type-matching.md b/csharp/ql/src/change-notes/2025-03-10-unknown-type-matching.md new file mode 100644 index 000000000000..634f46067007 --- /dev/null +++ b/csharp/ql/src/change-notes/2025-03-10-unknown-type-matching.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Increase query precision for `cs/useless-assignment-to-local` and `cs/constant-condition` when *unknown* types are involved (mostly relevant for `build-mode: none` databases). diff --git a/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/ConstantCondition.cs b/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/ConstantCondition.cs new file mode 100644 index 000000000000..6f40759b3e67 --- /dev/null +++ b/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/ConstantCondition.cs @@ -0,0 +1,27 @@ +using System; + +partial class C1 +{ + public C2 Prop { get; set; } +} + +class C2 { } + +class ConstantMatching +{ + void M1() + { + var c1 = new C1(); + if (c1.Prop is int) // $ Alert + { + } + + // Should not be considered a constant condition as + // we don't know anything about D. + var d = new D(); + if (d.Prop is C2) + { + } + } +} + diff --git a/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/ConstantCondition.expected b/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/ConstantCondition.expected new file mode 100644 index 000000000000..25ed39bebb72 --- /dev/null +++ b/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/ConstantCondition.expected @@ -0,0 +1,2 @@ +| ConstantCondition.cs:15:13:15:26 | ... is ... | Condition always evaluates to 'false'. | +| ConstantCondition.cs:15:24:15:26 | access to type Int32 | Pattern never matches. | diff --git a/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/ConstantCondition.qlref b/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/ConstantCondition.qlref new file mode 100644 index 000000000000..6692217230e0 --- /dev/null +++ b/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/ConstantCondition.qlref @@ -0,0 +1,2 @@ +query: Bad Practices/Control-Flow/ConstantCondition.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/csharp/ql/test/query-tests/standalone/IncomparableEquals/options b/csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/options similarity index 100% rename from csharp/ql/test/query-tests/standalone/IncomparableEquals/options rename to csharp/ql/test/query-tests/standalone/Bad Practices/Control-Flow/ConstantCondition/options diff --git a/csharp/ql/test/query-tests/standalone/IncomparableEquals/IncomparableEquals.cs b/csharp/ql/test/query-tests/standalone/Likely Bugs/IncomparableEquals/IncomparableEquals.cs similarity index 100% rename from csharp/ql/test/query-tests/standalone/IncomparableEquals/IncomparableEquals.cs rename to csharp/ql/test/query-tests/standalone/Likely Bugs/IncomparableEquals/IncomparableEquals.cs diff --git a/csharp/ql/test/query-tests/standalone/IncomparableEquals/IncomparableEquals.expected b/csharp/ql/test/query-tests/standalone/Likely Bugs/IncomparableEquals/IncomparableEquals.expected similarity index 100% rename from csharp/ql/test/query-tests/standalone/IncomparableEquals/IncomparableEquals.expected rename to csharp/ql/test/query-tests/standalone/Likely Bugs/IncomparableEquals/IncomparableEquals.expected diff --git a/csharp/ql/test/query-tests/standalone/IncomparableEquals/IncomparableEquals.qlref b/csharp/ql/test/query-tests/standalone/Likely Bugs/IncomparableEquals/IncomparableEquals.qlref similarity index 100% rename from csharp/ql/test/query-tests/standalone/IncomparableEquals/IncomparableEquals.qlref rename to csharp/ql/test/query-tests/standalone/Likely Bugs/IncomparableEquals/IncomparableEquals.qlref diff --git a/csharp/ql/test/query-tests/standalone/ObjectComparison/options b/csharp/ql/test/query-tests/standalone/Likely Bugs/IncomparableEquals/options similarity index 100% rename from csharp/ql/test/query-tests/standalone/ObjectComparison/options rename to csharp/ql/test/query-tests/standalone/Likely Bugs/IncomparableEquals/options diff --git a/csharp/ql/test/query-tests/standalone/ObjectComparison/ObjectComparison.cs b/csharp/ql/test/query-tests/standalone/Likely Bugs/ObjectComparison/ObjectComparison.cs similarity index 100% rename from csharp/ql/test/query-tests/standalone/ObjectComparison/ObjectComparison.cs rename to csharp/ql/test/query-tests/standalone/Likely Bugs/ObjectComparison/ObjectComparison.cs diff --git a/csharp/ql/test/query-tests/standalone/ObjectComparison/ObjectComparison.expected b/csharp/ql/test/query-tests/standalone/Likely Bugs/ObjectComparison/ObjectComparison.expected similarity index 100% rename from csharp/ql/test/query-tests/standalone/ObjectComparison/ObjectComparison.expected rename to csharp/ql/test/query-tests/standalone/Likely Bugs/ObjectComparison/ObjectComparison.expected diff --git a/csharp/ql/test/query-tests/standalone/ObjectComparison/ObjectComparison.qlref b/csharp/ql/test/query-tests/standalone/Likely Bugs/ObjectComparison/ObjectComparison.qlref similarity index 100% rename from csharp/ql/test/query-tests/standalone/ObjectComparison/ObjectComparison.qlref rename to csharp/ql/test/query-tests/standalone/Likely Bugs/ObjectComparison/ObjectComparison.qlref diff --git a/csharp/ql/test/query-tests/standalone/Likely Bugs/ObjectComparison/options b/csharp/ql/test/query-tests/standalone/Likely Bugs/ObjectComparison/options new file mode 100644 index 000000000000..7ba3811b2afb --- /dev/null +++ b/csharp/ql/test/query-tests/standalone/Likely Bugs/ObjectComparison/options @@ -0,0 +1 @@ +semmle-extractor-options: --standalone