Rust: Generate CFG node for FormatArgsArg

This commit is contained in:
Simon Friis Vindum
2025-01-03 13:58:25 +01:00
parent 42d125676e
commit 2ef9339d00
13 changed files with 114 additions and 24 deletions

View File

@@ -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

View File

@@ -1021,10 +1021,57 @@ module MakeCfgNodes<LocationSig Loc, InputSig<Loc> 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<LocationSig Loc, InputSig<Loc> 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<LocationSig Loc, InputSig<Loc> 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 |

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 { }

View File

@@ -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;

View File

@@ -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.
*/

View File

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

View File

@@ -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 {

View File

@@ -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

View File

@@ -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$}");
}

View File

@@ -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")
}

View File

@@ -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