From 09bef0f4df84665b332f81f51431f3acb4e60bad Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 12:51:08 +0000 Subject: [PATCH 1/4] Initial plan From 6011ecbef4d8dd5a1c57757456b54bee68e589a4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 13:01:25 +0000 Subject: [PATCH 2/4] Add ConstAccess class with getConst() predicate and test cases Co-authored-by: hvitved <3667920+hvitved@users.noreply.github.com> --- rust/ql/lib/codeql/rust/elements/Const.qll | 14 +++++++ .../rust/elements/internal/ConstImpl.qll | 33 +++++++++++++++ .../library-tests/const_access/Cargo.lock | 7 ++++ .../const_access/const_access.ql | 23 ++++++++++ .../test/library-tests/const_access/main.rs | 42 +++++++++++++++++++ 5 files changed, 119 insertions(+) create mode 100644 rust/ql/test/library-tests/const_access/Cargo.lock create mode 100644 rust/ql/test/library-tests/const_access/const_access.ql create mode 100644 rust/ql/test/library-tests/const_access/main.rs diff --git a/rust/ql/lib/codeql/rust/elements/Const.qll b/rust/ql/lib/codeql/rust/elements/Const.qll index 39aea3e25dc4..1226d195eeb9 100644 --- a/rust/ql/lib/codeql/rust/elements/Const.qll +++ b/rust/ql/lib/codeql/rust/elements/Const.qll @@ -22,3 +22,17 @@ import codeql.rust.elements.WhereClause * ``` */ final class Const = Impl::Const; + +/** + * A constant access. + * + * For example: + * ```rust + * const X: i32 = 42; + * + * fn main() { + * println!("{}", X); + * } + * ``` + */ +final class ConstAccess = Impl::ConstAccess; diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll index d2f3cde2d037..8144475f36c6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll @@ -6,6 +6,9 @@ */ private import codeql.rust.elements.internal.generated.Const +private import codeql.rust.elements.PathExpr +private import codeql.rust.elements.internal.PathExprBaseImpl::Impl as PathExprBaseImpl +private import codeql.rust.internal.PathResolution /** * INTERNAL: This module contains the customizable definition of `Const` and should not @@ -21,4 +24,34 @@ module Impl { * ``` */ class Const extends Generated::Const { } + + /** + * A constant access. + * + * For example: + * ```rust + * const X: i32 = 42; + * + * fn main() { + * println!("{}", X); + * } + * ``` + */ + class ConstAccess extends PathExprBaseImpl::PathExprBase { + private Const c; + + ConstAccess() { + exists(PathExpr pe | + pe = this and + c = resolvePath(pe.getPath()) + ) + } + + /** Gets the constant being accessed. */ + Const getConst() { result = c } + + override string toStringImpl() { result = c.getName().getText() } + + override string getAPrimaryQlClass() { result = "ConstAccess" } + } } diff --git a/rust/ql/test/library-tests/const_access/Cargo.lock b/rust/ql/test/library-tests/const_access/Cargo.lock new file mode 100644 index 000000000000..876cd502126b --- /dev/null +++ b/rust/ql/test/library-tests/const_access/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "const_access_test" +version = "0.1.0" diff --git a/rust/ql/test/library-tests/const_access/const_access.ql b/rust/ql/test/library-tests/const_access/const_access.ql new file mode 100644 index 000000000000..27b8f85e3dc3 --- /dev/null +++ b/rust/ql/test/library-tests/const_access/const_access.ql @@ -0,0 +1,23 @@ +import rust +import utils.test.InlineExpectationsTest +import TestUtils + +query predicate constAccess(ConstAccess ca, Const c) { + toBeTested(ca) and c = ca.getConst() +} + +module ConstAccessTest implements TestSig { + string getARelevantTag() { result = "const_access" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists(ConstAccess ca | + toBeTested(ca) and + location = ca.getLocation() and + element = ca.toString() and + tag = "const_access" and + value = ca.getConst().getName().getText() + ) + } +} + +import MakeTest diff --git a/rust/ql/test/library-tests/const_access/main.rs b/rust/ql/test/library-tests/const_access/main.rs new file mode 100644 index 000000000000..b8a363adfdb0 --- /dev/null +++ b/rust/ql/test/library-tests/const_access/main.rs @@ -0,0 +1,42 @@ +const GLOBAL_CONST: i32 = 42; +const STRING_CONST: &str = "hello"; + +struct MyStruct { + value: i32, +} + +impl MyStruct { + const ASSOC_CONST: i32 = 100; +} + +mod my_module { + pub const MODULE_CONST: i32 = 200; +} + +fn use_consts() { + // $ const_access=GLOBAL_CONST + let x = GLOBAL_CONST; + // $ const_access=GLOBAL_CONST + println!("{}", GLOBAL_CONST); + + // $ const_access=STRING_CONST + let s = STRING_CONST; + + // $ const_access=ASSOC_CONST + let y = MyStruct::ASSOC_CONST; + + // $ const_access=MODULE_CONST + let z = my_module::MODULE_CONST; + + // $ const_access=GLOBAL_CONST + if GLOBAL_CONST > 0 { + println!("positive"); + } + + // $ const_access=ASSOC_CONST + let arr = [MyStruct::ASSOC_CONST; 5]; +} + +fn main() { + use_consts(); +} From ad51b61a2b5ba7deb525221e892d13f1ef8f8f81 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 31 Oct 2025 13:07:04 +0000 Subject: [PATCH 3/4] Fix trailing whitespace in documentation comments Co-authored-by: hvitved <3667920+hvitved@users.noreply.github.com> --- rust/ql/lib/codeql/rust/elements/Const.qll | 2 +- rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/ql/lib/codeql/rust/elements/Const.qll b/rust/ql/lib/codeql/rust/elements/Const.qll index 1226d195eeb9..d15154835554 100644 --- a/rust/ql/lib/codeql/rust/elements/Const.qll +++ b/rust/ql/lib/codeql/rust/elements/Const.qll @@ -29,7 +29,7 @@ final class Const = Impl::Const; * For example: * ```rust * const X: i32 = 42; - * + * * fn main() { * println!("{}", X); * } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll index 8144475f36c6..99d76dd644aa 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll @@ -31,7 +31,7 @@ module Impl { * For example: * ```rust * const X: i32 = 42; - * + * * fn main() { * println!("{}", X); * } From 0ca62ca5b6d34a5bf8ad8fbd2049b323d382dd5e Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 3 Nov 2025 12:58:29 +0100 Subject: [PATCH 4/4] Fix copilot implementation --- rust/ql/.generated.list | 1 - rust/ql/.gitattributes | 1 - rust/ql/lib/codeql/rust/elements/Const.qll | 14 ------------- .../lib/codeql/rust/elements/ConstAccess.qll | 7 +++++++ .../rust/elements/internal/ConstImpl.qll | 16 ++++----------- rust/ql/lib/rust.qll | 1 + .../macro-expansion/PrintAst.expected | 2 +- .../library-tests/const_access/Cargo.lock | 6 +++--- .../const_access/const_access.expected | 8 ++++++++ .../const_access/const_access.ql | 4 +--- .../test/library-tests/const_access/main.rs | 20 ++++++------------- 11 files changed, 31 insertions(+), 49 deletions(-) create mode 100644 rust/ql/lib/codeql/rust/elements/ConstAccess.qll create mode 100644 rust/ql/test/library-tests/const_access/const_access.expected diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index ffe947da742b..1f580178999e 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -247,7 +247,6 @@ lib/codeql/rust/elements/internal/ConstArgImpl.qll dc7e7b5fe1a6eeb61dd30a55a3ed2 lib/codeql/rust/elements/internal/ConstBlockPatConstructor.qll ddb4a0045635d477e87360ecafec0ba90ddcffc6e62996eb6e7edd5a5d65b860 442061d0497a615b3f008b990f5e3c4f045110f76500eff81a7f44ffd1319acf lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll 2082a3244c21e03b6dadfba9b3f97a00981324e10d1465d3a51cf3c921eb89e4 889e347834d8c6e90dfef9714af073b3b2193f6830f1c8356cee9c6573b3ecb4 lib/codeql/rust/elements/internal/ConstConstructor.qll 72a31fd9b8b3fd910e35af1b2b30fa54cc4d9e14e7eabdb94b4cd2af95b2df38 3edc0a82a7b446fdfd3e71947801f3c7cac010b2a217b8accb69980387bdd67a -lib/codeql/rust/elements/internal/ConstImpl.qll 058b474b9aaf2ad687ab1e62ebc8a51ba93d9ea4340c2f41768b71613ac330c1 c2c5d4746a588096cbbdfa4355ee73d806c7a4ac9507930a120e49060f9d5347 lib/codeql/rust/elements/internal/ConstParamConstructor.qll f6645f952aac87c7e00e5e9661275312a1df47172088b4de6b5a253d5c4ed048 eda737470a7b89cf6a02715c9147d074041d6d00fd50d5b2d70266add6e4b571 lib/codeql/rust/elements/internal/ConstParamImpl.qll c6995be58f84d1df65897c80f7ee3dd8eb410bb3e634ff1bfe1be94dfb3fdf32 bcfb5547b40f24bcec20056fe1d36724b734c920b0bc7538fe2974b03f4478fe lib/codeql/rust/elements/internal/ContinueExprConstructor.qll cd93f1b35ccdb031d7e8deba92f6a76187f6009c454f3ea07e89ba459de57ca6 6f658e7d580c4c9068b01d6dd6f72888b8800860668a6653f8c3b27dc9996935 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index df4a65e7d957..ff149fb36d36 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -249,7 +249,6 @@ /lib/codeql/rust/elements/internal/ConstBlockPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ConstConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ConstImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ConstParamConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ConstParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ContinueExprConstructor.qll linguist-generated diff --git a/rust/ql/lib/codeql/rust/elements/Const.qll b/rust/ql/lib/codeql/rust/elements/Const.qll index d15154835554..39aea3e25dc4 100644 --- a/rust/ql/lib/codeql/rust/elements/Const.qll +++ b/rust/ql/lib/codeql/rust/elements/Const.qll @@ -22,17 +22,3 @@ import codeql.rust.elements.WhereClause * ``` */ final class Const = Impl::Const; - -/** - * A constant access. - * - * For example: - * ```rust - * const X: i32 = 42; - * - * fn main() { - * println!("{}", X); - * } - * ``` - */ -final class ConstAccess = Impl::ConstAccess; diff --git a/rust/ql/lib/codeql/rust/elements/ConstAccess.qll b/rust/ql/lib/codeql/rust/elements/ConstAccess.qll new file mode 100644 index 000000000000..ae2f6c3e333c --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/ConstAccess.qll @@ -0,0 +1,7 @@ +/** + * This module provides the public class `ConstAccess`. + */ + +private import internal.ConstImpl + +final class ConstAccess = Impl::ConstAccess; diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll index 99d76dd644aa..0234f7cf7302 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Const`. * @@ -6,8 +5,7 @@ */ private import codeql.rust.elements.internal.generated.Const -private import codeql.rust.elements.PathExpr -private import codeql.rust.elements.internal.PathExprBaseImpl::Impl as PathExprBaseImpl +private import codeql.rust.elements.internal.PathExprImpl::Impl as PathExprImpl private import codeql.rust.internal.PathResolution /** @@ -15,6 +13,7 @@ private import codeql.rust.internal.PathResolution * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A constant item declaration. * @@ -37,21 +36,14 @@ module Impl { * } * ``` */ - class ConstAccess extends PathExprBaseImpl::PathExprBase { + class ConstAccess extends PathExprImpl::PathExpr { private Const c; - ConstAccess() { - exists(PathExpr pe | - pe = this and - c = resolvePath(pe.getPath()) - ) - } + ConstAccess() { c = resolvePath(this.getPath()) } /** Gets the constant being accessed. */ Const getConst() { result = c } - override string toStringImpl() { result = c.getName().getText() } - override string getAPrimaryQlClass() { result = "ConstAccess" } } } diff --git a/rust/ql/lib/rust.qll b/rust/ql/lib/rust.qll index b46e96868f63..d209672028b9 100644 --- a/rust/ql/lib/rust.qll +++ b/rust/ql/lib/rust.qll @@ -9,6 +9,7 @@ import codeql.rust.elements.ArithmeticOperation import codeql.rust.elements.AssignmentOperation import codeql.rust.elements.BitwiseOperation import codeql.rust.elements.ComparisonOperation +import codeql.rust.elements.ConstAccess import codeql.rust.elements.DerefExpr import codeql.rust.elements.LiteralExprExt import codeql.rust.elements.LogicalOperation diff --git a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected index 60e193113cc8..ffff0f53e7e5 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected @@ -1043,7 +1043,7 @@ macro_expansion.rs: # 98| getParamList(): [ParamList] ParamList # 99| getFunctionBody(): [BlockExpr] { ... } # 99| getStmtList(): [StmtList] StmtList -# 99| getTailExpr(): [PathExpr] CONST_MyDeriveUnion +# 99| getTailExpr(): [ConstAccess] CONST_MyDeriveUnion # 99| getPath(): [Path] CONST_MyDeriveUnion # 99| getSegment(): [PathSegment] CONST_MyDeriveUnion # 99| getIdentifier(): [NameRef] CONST_MyDeriveUnion diff --git a/rust/ql/test/library-tests/const_access/Cargo.lock b/rust/ql/test/library-tests/const_access/Cargo.lock index 876cd502126b..b9856cfaf77d 100644 --- a/rust/ql/test/library-tests/const_access/Cargo.lock +++ b/rust/ql/test/library-tests/const_access/Cargo.lock @@ -1,7 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] -name = "const_access_test" -version = "0.1.0" +name = "test" +version = "0.0.1" diff --git a/rust/ql/test/library-tests/const_access/const_access.expected b/rust/ql/test/library-tests/const_access/const_access.expected new file mode 100644 index 000000000000..83c5022aca84 --- /dev/null +++ b/rust/ql/test/library-tests/const_access/const_access.expected @@ -0,0 +1,8 @@ +testFailures +constAccess +| main.rs:17:13:17:24 | GLOBAL_CONST | main.rs:1:1:1:29 | Const | +| main.rs:19:13:19:24 | STRING_CONST | main.rs:2:1:2:35 | Const | +| main.rs:21:13:21:33 | ...::ASSOC_CONST | main.rs:9:5:9:33 | Const | +| main.rs:23:13:23:35 | ...::MODULE_CONST | main.rs:13:5:13:38 | Const | +| main.rs:25:8:25:19 | GLOBAL_CONST | main.rs:1:1:1:29 | Const | +| main.rs:29:16:29:36 | ...::ASSOC_CONST | main.rs:9:5:9:33 | Const | diff --git a/rust/ql/test/library-tests/const_access/const_access.ql b/rust/ql/test/library-tests/const_access/const_access.ql index 27b8f85e3dc3..b3bb73633927 100644 --- a/rust/ql/test/library-tests/const_access/const_access.ql +++ b/rust/ql/test/library-tests/const_access/const_access.ql @@ -2,9 +2,7 @@ import rust import utils.test.InlineExpectationsTest import TestUtils -query predicate constAccess(ConstAccess ca, Const c) { - toBeTested(ca) and c = ca.getConst() -} +query predicate constAccess(ConstAccess ca, Const c) { toBeTested(ca) and c = ca.getConst() } module ConstAccessTest implements TestSig { string getARelevantTag() { result = "const_access" } diff --git a/rust/ql/test/library-tests/const_access/main.rs b/rust/ql/test/library-tests/const_access/main.rs index b8a363adfdb0..0cf2467d100a 100644 --- a/rust/ql/test/library-tests/const_access/main.rs +++ b/rust/ql/test/library-tests/const_access/main.rs @@ -14,27 +14,19 @@ mod my_module { } fn use_consts() { - // $ const_access=GLOBAL_CONST - let x = GLOBAL_CONST; - // $ const_access=GLOBAL_CONST - println!("{}", GLOBAL_CONST); + let x = GLOBAL_CONST; // $ const_access=GLOBAL_CONST - // $ const_access=STRING_CONST - let s = STRING_CONST; + let s = STRING_CONST; // $ const_access=STRING_CONST - // $ const_access=ASSOC_CONST - let y = MyStruct::ASSOC_CONST; + let y = MyStruct::ASSOC_CONST; // $ const_access=ASSOC_CONST - // $ const_access=MODULE_CONST - let z = my_module::MODULE_CONST; + let z = my_module::MODULE_CONST; // $ const_access=MODULE_CONST - // $ const_access=GLOBAL_CONST - if GLOBAL_CONST > 0 { + if GLOBAL_CONST > 0 { // $ const_access=GLOBAL_CONST println!("positive"); } - // $ const_access=ASSOC_CONST - let arr = [MyStruct::ASSOC_CONST; 5]; + let arr = [MyStruct::ASSOC_CONST; 5]; // $ const_access=ASSOC_CONST } fn main() {