diff --git a/cpp/ql/src/Best Practices/Unused Entities/UnusedStaticVariables.ql b/cpp/ql/src/Best Practices/Unused Entities/UnusedStaticVariables.ql index c67bac65bdd3..442f75027d82 100644 --- a/cpp/ql/src/Best Practices/Unused Entities/UnusedStaticVariables.ql +++ b/cpp/ql/src/Best Practices/Unused Entities/UnusedStaticVariables.ql @@ -22,6 +22,7 @@ predicate declarationHasSideEffects(Variable v) { from Variable v where v.isStatic() and + not v.isCompilerGenerated() and v.hasDefinition() and not v.isConstexpr() and not exists(VariableAccess a | a.getTarget() = v) and diff --git a/cpp/ql/src/change-notes/2026-10-30-unused-static-compiler-generated.md b/cpp/ql/src/change-notes/2026-10-30-unused-static-compiler-generated.md new file mode 100644 index 000000000000..4ede33c64a12 --- /dev/null +++ b/cpp/ql/src/change-notes/2026-10-30-unused-static-compiler-generated.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cpp/unused-static-variable` query no longer reports compiler-generated variables, such as placeholders for empty function parameter packs. diff --git a/cpp/ql/test/query-tests/Best Practices/Unused Entities/UnusedStaticVariables/test.cpp b/cpp/ql/test/query-tests/Best Practices/Unused Entities/UnusedStaticVariables/test.cpp index 7a18491408c6..13ab913733bb 100644 --- a/cpp/ql/test/query-tests/Best Practices/Unused Entities/UnusedStaticVariables/test.cpp +++ b/cpp/ql/test/query-tests/Best Practices/Unused Entities/UnusedStaticVariables/test.cpp @@ -1,4 +1,4 @@ -// semmle-extractor-options: -std=c++17 +// semmle-extractor-options: -std=c++20 int globalVar; // GOOD (not static) static int staticVar1; // GOOD (used) static int staticVar2; // GOOD (used) @@ -49,3 +49,10 @@ struct WithDestructor static WithConstructor constructed; // GOOD (constructor has a side effect) static WithDestructor destructed; // GOOD (destructor has a side effect) + +static auto sum(auto... values) +{ + return (0 + ... + values); +} + +int globalVar2 = sum() + sum(2);