From 2ef9339d00ffefe5894c1d473e63d24582a54ea3 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Fri, 3 Jan 2025 13:58:25 +0100 Subject: [PATCH] Rust: Generate CFG node for FormatArgsArg --- rust/ql/.generated.list | 14 ++-- .../internal/generated/CfgNodes.qll | 76 ++++++++++++++++++- rust/ql/lib/codeql/rust/elements/Format.qll | 4 + .../codeql/rust/elements/FormatArgsArg.qll | 4 +- .../elements/internal/FormatArgsArgImpl.qll | 4 +- .../rust/elements/internal/FormatImpl.qll | 4 + .../elements/internal/generated/Format.qll | 4 + .../internal/generated/FormatArgsArg.qll | 4 +- .../rust/elements/internal/generated/Raw.qll | 4 +- .../generated/.generated_tests.list | 4 +- .../generated/FormatArgsExpr/gen_format.rs | 2 + .../FormatArgsExpr/gen_format_args_arg.rs | 4 +- rust/schema/annotations.py | 10 ++- 13 files changed, 114 insertions(+), 24 deletions(-) diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 641a45f0d5d..879592a5d75 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -1,4 +1,4 @@ -lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll c25526db135a85c2a2aa4e3f2fe051a2d9d76e4225e98fbcd777e7bc6cde0844 c8acc325e4c8dbb9582bf8c97ed96d7070fc88e721041b56d7105a175aa233d4 +lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 8067b2d0a930b90b430c0b6d47709f924305492317a7baed92011c37176dbc21 25e598a69493a9d21b2f5dc676c73578287f3659601a1fe19f7afd0c4bba2cc0 lib/codeql/rust/elements/Abi.qll 4c973d28b6d628f5959d1f1cc793704572fd0acaae9a97dfce82ff9d73f73476 250f68350180af080f904cd34cb2af481c5c688dc93edf7365fd0ae99855e893 lib/codeql/rust/elements/Addressable.qll 13011bfd2e1556694c3d440cc34af8527da4df49ad92b62f2939d3699ff2cea5 ddb25935f7553a1a384b1abe2e4b4fa90ab50b952dadec32fd867afcb054f4be lib/codeql/rust/elements/ArgList.qll 661f5100f5d3ef8351452d9058b663a2a5c720eea8cf11bedd628969741486a2 28e424aac01a90fb58cd6f9f83c7e4cf379eea39e636bc0ba07efc818be71c71 @@ -57,8 +57,8 @@ lib/codeql/rust/elements/FieldList.qll bd243adc4696c60f636055a1c2da28039fe202847 lib/codeql/rust/elements/FnPtrTypeRepr.qll 25a88a8445b4abfaf7c95fcef03db5328aa81e35cebe56516bdda01380f0a69e 0a77d08b6b2d63e7a037f366b6dffd5006e975a8af2424af60a4f9ad74d441ba lib/codeql/rust/elements/ForExpr.qll 0cc8bfe10b8baf62a1ff65c8463cfb17ab64b41c30c9e1edb962a227df2036d9 b1be73294e6da0f49fd32177ad0b05fecf26081d5ce424f288be99a4bd59cc84 lib/codeql/rust/elements/ForTypeRepr.qll dc4e00cd23606df93d753f2ca6862b55a10c722a7e952bb2e11b494738d2a3d2 ca169d2faca3baab3720086f7b2de5c26f55faf2dbab958298377ad65f73949b -lib/codeql/rust/elements/Format.qll 51222fa2d2e85d496ab093d74d3bc606ede3ce48f926106e059dc8478e657203 b4da6be38413c86f2e9d82004624abab16e23ef238197a5c85246009cce276d5 -lib/codeql/rust/elements/FormatArgsArg.qll 5bc9b4cd1bac7131165836e93838c45452a08ea6011741cbddace3cbf9c69440 f825140e98dc9800d5c045402186793c7b21511448e2f6bf6402d1e06305219c +lib/codeql/rust/elements/Format.qll 1b186730710e7e29ea47594998f0b359ad308927f84841adae0c0cb35fc8aeda d6f7bfdda60a529fb9e9a1975628d5bd11aa28a45e295c7526692ac662fd19f8 +lib/codeql/rust/elements/FormatArgsArg.qll a2c23cd512d44dd60b7d65eba52cc3adf6e2fbbcd0588be375daa16002cd7741 d9c5fe183fb228375223d83f857b7a9ee686f1d3e341bcf323d7c6f39652f88b lib/codeql/rust/elements/FormatArgsExpr.qll 8127cbe4082f7acc3d8a05298c2c9bea302519b8a6cd2d158a83c516d18fc487 88cf9b3bedd69a1150968f9a465c904bbb6805da0e0b90cfd1fc0dab1f6d9319 lib/codeql/rust/elements/FormatArgument.qll f6fe17ee1481c353dd42edae8b5fa79aeb99dff25b4842ec9a6f267b1837d1e3 5aed19c2daf2383b89ad7fd527375641cff26ddee7afddb89bc0d18d520f4034 lib/codeql/rust/elements/FormatTemplateVariableAccess.qll ff3218a1dda30c232d0ecd9d1c60bbb9f3973456ef0bee1d1a12ad14b1e082b5 e4316291c939800d8b34d477d92be9404a30d52b7eee37302aef3d3205cf4ae0 @@ -277,7 +277,7 @@ lib/codeql/rust/elements/internal/ForExprConstructor.qll d79b88dac19256300b758ba lib/codeql/rust/elements/internal/ForTypeReprConstructor.qll eae141dbe9256ab0eb812a926ebf226075d150f6506dfecb56c85eb169cdc76b 721c2272193a6f9504fb780d40e316a93247ebfb1f302bb0a0222af689300245 lib/codeql/rust/elements/internal/ForTypeReprImpl.qll 5595a576085f032f056c0c5c4e78076b60520df420396fbc785eb912a88fa2b2 e8ee94d7722ece3483872411f60a7b01f1c2578823b0263236f25eedd2c2a6ac lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll 8bd9b4e035ef8adeb3ac510dd68043934c0140facb933be1f240096d01cdfa11 74e9d3bbd8882ae59a7e88935d468e0a90a6529a4e2af6a3d83e93944470f0ee -lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll 601f7715e9a65bcfa7cea1979fa30d694b5bea29650d799d7dd3080b8eea58e9 ecb0800cdb8c0f93277982dad295ac6a5332e42eff4fb5c8ff19f903b9857003 +lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll 6a8f55e51e141e4875ed03a7cc65eea49daa349de370b957e1e8c6bc4478425c 7efab8981ccbe75a4843315404674793dda66dde02ba432edbca25c7d355778a lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll ce29ff5a839b885b1ab7a02d6a381ae474ab1be3e6ee7dcfd7595bdf28e4b558 63bf957426871905a51ea319662a59e38104c197a1024360aca364dc145b11e8 lib/codeql/rust/elements/internal/FunctionConstructor.qll b50aea579938d03745dfbd8b5fa8498f7f83b967369f63d6875510e09ab7f5d2 19cca32aeaecaf9debc27329e8c39ecec69464bb1d89d7b09908a1d73a8d92a2 lib/codeql/rust/elements/internal/GenericArgImpl.qll 6b1b804c357425c223f926e560a688e81506f5a35b95485cecf704e88cc009ee cc1ccf6a23dadc397e82664f3911d4b385d4c8ca80b1ee16d5275d9c936148dd @@ -521,8 +521,8 @@ lib/codeql/rust/elements/internal/generated/FieldList.qll 43c13c6e3c9ba75a7a4cb8 lib/codeql/rust/elements/internal/generated/FnPtrTypeRepr.qll d490ab9f2e3654d9abde18a06e534abd99ca62f518ca08670b696a97e9d5c592 01500319820f66cb4bbda6fe7c26270f76ea934efff4bb3cbf88e9b1e07e8be2 lib/codeql/rust/elements/internal/generated/ForExpr.qll 6c1838d952be65acaa9744736e73d9bfdcf58d7b392394223bf6fbfdcc172906 44237a248a5aa326a2544e84bc77f536f118f57a98c51562b71ddc81edfcccb8 lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll 3027879795a6be5bfb370b8c2231b579f9df8afde54345416c6ce2c64bd3dfec f871d73b36f079f473915db298951020e5a05bb5e8e4d570822063afb4807559 -lib/codeql/rust/elements/internal/generated/Format.qll df7ef61e6ba61fa0eb093f8e6b3e7a0329104e03f659c9507db9535b8b4ea759 ef8ddd98405fc84938ad8cd5f87d2858e01d06a6bb00566a785a984b60a79dc6 -lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll e07a1ae310f590003f1b88fada7dcf4847c99adb9d4c838d1c88e66e1da85c5f 0ef7342451fe2cb06e765fb4b33bb8c4a9b927f5edbc8feb5c6ba3655697f447 +lib/codeql/rust/elements/internal/generated/Format.qll b1c2ce8dc4ee3cee9f637a007aa3d282e2001c754207604c8c4412ed94a20b4b 880e43fdaadae50e8b0e87ccaab93122d48cdbf73c612cbbd748ccacb91ea5a7 +lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll c762a4af8609472e285dd1b1aec8251421aec49f8d0e5ce9df2cc5e2722326f8 c8c226b94b32447634b445c62bd9af7e11b93a706f8fa35d2de4fda3ce951926 lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll 8aed8715a27d3af3de56ded4610c6792a25216b1544eb7e57c8b0b37c14bd9c1 590a2b0063d2ecd00bbbd1ce29603c8fd69972e34e6daddf309c915ce4ec1375 lib/codeql/rust/elements/internal/generated/FormatArgument.qll cd05153276e63e689c95d5537fbc7d892615f62e110323759ef02e23a7587407 be2a4531b498f01625effa4c631d51ee8857698b00cfb829074120a0f2696d57 lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll a6175214fad445df9234b3ee9bf5147da75baf82473fb8d384b455e3add0dac1 a928db0ff126b2e54a18f5c488232abd1bd6c5eda24591d3c3bb80c6ee71c770 @@ -594,7 +594,7 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 51d1e9e683fc79dddbff lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll aac2ca733fa3ee544307443f4ab78ec8dc6d635d8047ec706ed46d2101321d35 aec95fb3b33a96aed2ee7a46d0d8cacef13389f0f107ce2736b4d39502d512d5 +lib/codeql/rust/elements/internal/generated/Raw.qll db71278eea846cffd8748f1650493822d95108609a5c055bfaed7af4f42011c1 fabbf440a40ff5b1e9da26a95d20db89fbe7d33717bbc4f02ef518fc9dfd1e54 lib/codeql/rust/elements/internal/generated/RecordExpr.qll 2131b2cb336caa76170082e69776011bf02576bbfdd34ba68ca84af24209250a 39a2e3ec32352b594c43cc1295e0e8b3f9808173322d3d73cb7d48ef969d5565 lib/codeql/rust/elements/internal/generated/RecordExprField.qll 7e9f8663d3b74ebbc9603b10c9912f082febba6bd73d344b100bbd3edf837802 fbe6b578e7fd5d5a6f21bbb8c388957ab7210a6a249ec71510a50fb35b319ea1 lib/codeql/rust/elements/internal/generated/RecordExprFieldList.qll 179a97211fe7aa6265085d4d54115cdbc0e1cd7c9b2135591e8f36d6432f13d3 dd44bbbc1e83a1ed3a587afb729d7debf7aeb7b63245de181726af13090e50c0 diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll index da99fc98fdf..4fe436f7d49 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll @@ -1021,10 +1021,57 @@ module MakeCfgNodes Input> { predicate hasPat() { exists(this.getPat()) } } + final private class ParentFormatArgsArg extends ParentAstNode, FormatArgsArg { + override predicate relevantChild(AstNode child) { + none() + or + child = this.getExpr() + } + } + + /** + * A FormatArgsArg. For example the `"world"` in: + * ```rust + * format_args!("Hello, {}!", "world") + * ``` + */ + final class FormatArgsArgCfgNode extends CfgNodeFinal { + private FormatArgsArg node; + + FormatArgsArgCfgNode() { node = this.getAstNode() } + + /** Gets the underlying `FormatArgsArg`. */ + FormatArgsArg getFormatArgsArg() { result = node } + + /** + * Gets the expression of this format arguments argument, if it exists. + */ + ExprCfgNode getExpr() { + any(ChildMapping mapping).hasCfgChild(node, node.getExpr(), this, result) + } + + /** + * Holds if `getExpr()` exists. + */ + predicate hasExpr() { exists(this.getExpr()) } + + /** + * Gets the name of this format arguments argument, if it exists. + */ + Name getName() { result = node.getName() } + + /** + * Holds if `getName()` exists. + */ + predicate hasName() { exists(this.getName()) } + } + final private class ParentFormatArgsExpr extends ParentAstNode, FormatArgsExpr { override predicate relevantChild(AstNode child) { none() or + child = this.getArg(_) + or child = this.getTemplate() } } @@ -1050,12 +1097,14 @@ module MakeCfgNodes Input> { /** * Gets the `index`th argument of this format arguments expression (0-based). */ - FormatArgsArg getArg(int index) { result = node.getArg(index) } + FormatArgsArgCfgNode getArg(int index) { + any(ChildMapping mapping).hasCfgChild(node, node.getArg(index), this, result) + } /** * Gets any of the arguments of this format arguments expression. */ - FormatArgsArg getAnArg() { result = this.getArg(_) } + FormatArgsArgCfgNode getAnArg() { result = this.getArg(_) } /** * Gets the number of arguments of this format arguments expression. @@ -3404,6 +3453,29 @@ module MakeCfgNodes Input> { cfgNode ) or + pred = "getExpr" and + parent = + any(Nodes::FormatArgsArgCfgNode cfgNode, FormatArgsArg astNode | + astNode = cfgNode.getFormatArgsArg() and + child = getDesugared(astNode.getExpr()) and + i = -1 and + hasCfgNode(child) and + not child = cfgNode.getExpr().getAstNode() + | + cfgNode + ) + or + pred = "getArg" and + parent = + any(Nodes::FormatArgsExprCfgNode cfgNode, FormatArgsExpr astNode | + astNode = cfgNode.getFormatArgsExpr() and + child = getDesugared(astNode.getArg(i)) and + hasCfgNode(child) and + not child = cfgNode.getArg(i).getAstNode() + | + cfgNode + ) + or pred = "getTemplate" and parent = any(Nodes::FormatArgsExprCfgNode cfgNode, FormatArgsExpr astNode | diff --git a/rust/ql/lib/codeql/rust/elements/Format.qll b/rust/ql/lib/codeql/rust/elements/Format.qll index f8b705be4fd..603cb31d8d6 100644 --- a/rust/ql/lib/codeql/rust/elements/Format.qll +++ b/rust/ql/lib/codeql/rust/elements/Format.qll @@ -13,5 +13,9 @@ import codeql.rust.elements.Locatable * ```rust * println!("Hello {}", "world"); * ``` + * or the `{value:#width$.precision$}` in: + * ```rust + * println!("Value {value:#width$.precision$}"); + * ``` */ final class Format = Impl::Format; diff --git a/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll b/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll index fc461602dd6..4946f978930 100644 --- a/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll +++ b/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll @@ -9,9 +9,9 @@ import codeql.rust.elements.Expr import codeql.rust.elements.Name /** - * A FormatArgsArg. For example: + * A FormatArgsArg. For example the `"world"` in: * ```rust - * todo!() + * format_args!("Hello, {}!", "world") * ``` */ final class FormatArgsArg = Impl::FormatArgsArg; diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll index 1b6c2e027b3..c7fa88b51b0 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll @@ -13,9 +13,9 @@ private import codeql.rust.elements.internal.generated.FormatArgsArg */ module Impl { /** - * A FormatArgsArg. For example: + * A FormatArgsArg. For example the `"world"` in: * ```rust - * todo!() + * format_args!("Hello, {}!", "world") * ``` */ class FormatArgsArg extends Generated::FormatArgsArg { } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatImpl.qll index 7cde91053e9..19fd59db004 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatImpl.qll @@ -23,6 +23,10 @@ module Impl { * ```rust * println!("Hello {}", "world"); * ``` + * or the `{value:#width$.precision$}` in: + * ```rust + * println!("Value {value:#width$.precision$}"); + * ``` */ class Format extends Generated::Format { private Raw::FormatArgsExpr parent; diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll index 41c748d7fde..9c5ba12ab7a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll @@ -20,6 +20,10 @@ module Generated { * ```rust * println!("Hello {}", "world"); * ``` + * or the `{value:#width$.precision$}` in: + * ```rust + * println!("Value {value:#width$.precision$}"); + * ``` * INTERNAL: Do not reference the `Generated::Format` class directly. * Use the subclass `Format`, where the following predicates are available. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll index 0c78bd03f88..80ca340284f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll @@ -16,9 +16,9 @@ import codeql.rust.elements.Name */ module Generated { /** - * A FormatArgsArg. For example: + * A FormatArgsArg. For example the `"world"` in: * ```rust - * todo!() + * format_args!("Hello, {}!", "world") * ``` * INTERNAL: Do not reference the `Generated::FormatArgsArg` class directly. * Use the subclass `FormatArgsArg`, where the following predicates are available. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index 63c6c0f7054..deb5cf0764b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -305,9 +305,9 @@ module Raw { /** * INTERNAL: Do not use. - * A FormatArgsArg. For example: + * A FormatArgsArg. For example the `"world"` in: * ```rust - * todo!() + * format_args!("Hello, {}!", "world") * ``` */ class FormatArgsArg extends @format_args_arg, AstNode { diff --git a/rust/ql/test/extractor-tests/generated/.generated_tests.list b/rust/ql/test/extractor-tests/generated/.generated_tests.list index 78f9e0cfc77..519fb8d71a7 100644 --- a/rust/ql/test/extractor-tests/generated/.generated_tests.list +++ b/rust/ql/test/extractor-tests/generated/.generated_tests.list @@ -32,8 +32,8 @@ FieldExpr/gen_field_expr.rs 9a70500d592e0a071b03d974a55558b3bc0df531ff11bce5898f FnPtrTypeRepr/gen_fn_ptr_type_repr.rs 46af312570a9caec11e14ba05190e95e750c32565559f1622a132f7145320253 46af312570a9caec11e14ba05190e95e750c32565559f1622a132f7145320253 ForExpr/gen_for_expr.rs 67decf3073e1a9363d9df05a5a64a6059349e50b81356f480f7aeb352189136d 67decf3073e1a9363d9df05a5a64a6059349e50b81356f480f7aeb352189136d ForTypeRepr/gen_for_type_repr.rs 5108a5d63ce440305b92dd87387c22a0a57abfd19d88e03e1984e1537779f4a4 5108a5d63ce440305b92dd87387c22a0a57abfd19d88e03e1984e1537779f4a4 -FormatArgsExpr/gen_format.rs bd009cb152c35e2aacd147b5520a42be31e66e9a8715ec1d0fd57b8e97c743ed bd009cb152c35e2aacd147b5520a42be31e66e9a8715ec1d0fd57b8e97c743ed -FormatArgsExpr/gen_format_args_arg.rs c466f2fc2c0f9592061a159a217a87551d67f1ccb0e4d8f7f56a463a2aa4a73a c466f2fc2c0f9592061a159a217a87551d67f1ccb0e4d8f7f56a463a2aa4a73a +FormatArgsExpr/gen_format.rs 38adb675e5d635a08fb5353982a03a484b34e92042a15ae3b57f0ff40479b59f 38adb675e5d635a08fb5353982a03a484b34e92042a15ae3b57f0ff40479b59f +FormatArgsExpr/gen_format_args_arg.rs 53ffd6abe4cd899c57d1973b31df0edc1d5eaa5835b19172ec4cda15bb3db28f 53ffd6abe4cd899c57d1973b31df0edc1d5eaa5835b19172ec4cda15bb3db28f FormatArgsExpr/gen_format_args_expr.rs 72c806ed163e9dcce2d0c5c8664d409b2aa635c1022c91959f9e8ae084f05bf2 72c806ed163e9dcce2d0c5c8664d409b2aa635c1022c91959f9e8ae084f05bf2 FormatArgsExpr/gen_format_argument.rs 350d370e6f1db03d756384a3dbdb294697d241ff7c28d159cf57748abe99cfe9 350d370e6f1db03d756384a3dbdb294697d241ff7c28d159cf57748abe99cfe9 Function/gen_function.rs ba6ecb9e0d89183295eb02f3c20ebbf5c209f89bd0172c73a3b4a6dacbf3a54c ba6ecb9e0d89183295eb02f3c20ebbf5c209f89bd0172c73a3b4a6dacbf3a54c diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format.rs b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format.rs index 86b78256d40..bfd52908518 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format.rs +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format.rs @@ -3,4 +3,6 @@ fn test_format() -> () { // A format element in a formatting template. For example the `{}` in: println!("Hello {}", "world"); + // or the `{value:#width$.precision$}` in: + println!("Value {value:#width$.precision$}"); } diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_arg.rs b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_arg.rs index 6f189e15de6..89cefb58c3b 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_arg.rs +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_arg.rs @@ -1,6 +1,6 @@ // generated by codegen, do not edit fn test_format_args_arg() -> () { - // A FormatArgsArg. For example: - todo!() + // A FormatArgsArg. For example the `"world"` in: + format_args!("Hello, {}!", "world") } diff --git a/rust/schema/annotations.py b/rust/schema/annotations.py index b2ce365bc4c..eece1cc85d6 100644 --- a/rust/schema/annotations.py +++ b/rust/schema/annotations.py @@ -1067,13 +1067,13 @@ class _: """ -@annotate(FormatArgsArg) +@annotate(FormatArgsArg, cfg = True) @qltest.test_with(FormatArgsExpr) class _: """ - A FormatArgsArg. For example: + A FormatArgsArg. For example the `"world"` in: ```rust - todo!() + format_args!("Hello, {}!", "world") ``` """ @@ -1871,6 +1871,10 @@ class Format(Locatable): ```rust println!("Hello {}", "world"); ``` + or the `{value:#width$.precision$}` in: + ```rust + println!("Value {value:#width$.precision$}"); + ``` """ parent: FormatArgsExpr index: int