Compare commits

...

939 Commits

Author SHA1 Message Date
Arthur Baars
28f02c07d7 Merge pull request #20346 from github/release-prep/2.23.0
Release preparation for version 2.23.0
2025-09-02 13:13:45 +02:00
github-actions[bot]
0bfa93828b Release preparation for version 2.23.0 2025-09-02 11:09:32 +00:00
Michael Nebel
7ae5d405fc Merge pull request #20332 from michaelnebel/ruby/ql4ql
Ruby: Fix some Ql4Ql violations.
2025-09-02 12:04:03 +02:00
Michael Nebel
88ee20f189 Merge pull request #20331 from michaelnebel/ql/ql4ql
Ql: Fix some Ql4Ql violations.
2025-09-02 12:02:40 +02:00
Michael Nebel
2a932f0748 Merge pull request #20328 from michaelnebel/java/ql4ql
Java: Fix some Ql4Ql violations.
2025-09-02 12:01:16 +02:00
Joe Farebrother
ab641b3144 Merge pull request #20344 from joefarebrother/fix-changenote
Shared: Fix changenote
2025-09-02 10:58:16 +01:00
Michael Nebel
9a88e38d6f Merge pull request #20327 from michaelnebel/go/ql4ql
Go: Fix some Ql4Ql violations.
2025-09-02 11:45:26 +02:00
Michael Nebel
39d3741a91 Merge pull request #20326 from michaelnebel/csharp/ql4ql
C#: Fix some Ql4Ql violations.
2025-09-02 11:44:22 +02:00
Michael Nebel
f73f9a0447 Merge pull request #20334 from michaelnebel/swift/ql4ql
Swift: Fix a Ql4Ql violation.
2025-09-02 11:40:33 +02:00
Joe Farebrother
11309e99ce Fix changenote 2025-09-02 10:35:58 +01:00
Asger F
19fa29d527 Merge pull request #20307 from asgerf/js/overlay-extract-and-discard-only
JS: Add overlay support to extractor
2025-09-02 11:24:11 +02:00
Tom Hvitved
9bae0bfb35 Merge pull request #20295 from geoffw0/oldpaths1
Rust: Remove extractor path resolution.
2025-09-02 11:17:51 +02:00
Simon Friis Vindum
0ed6428a94 Merge pull request #20321 from paldepind/rust/trait-method-scope-2
Rust: Take trait visibility into account when resolving paths and methods
2025-09-02 10:58:00 +02:00
Michael Nebel
55e5281429 Go: Fix a couple more spelling errors. 2025-09-02 10:47:36 +02:00
Michael Nebel
a732b36fa8 Update java/ql/src/experimental/quantum/Analysis/ArtifactReuse.qll
Co-authored-by: Anders Schack-Mulligen <aschackmull@users.noreply.github.com>
2025-09-02 10:39:37 +02:00
Michael Nebel
367027e777 Ql: Fix some Ql4Ql violations. 2025-09-02 10:01:14 +02:00
Tom Hvitved
1130595c67 Merge pull request #20340 from hvitved/rust/taint-tracking-implicit-deref-at-sinks
Rust: Deref as taint step
2025-09-02 09:44:33 +02:00
Michael Nebel
d0323a6425 Fix one more violation. 2025-09-02 09:42:05 +02:00
Michael Nebel
ef4b41ab6d C#: Replace exists with any. 2025-09-02 09:26:37 +02:00
Michael Nebel
0c5c798ca5 Merge pull request #20290 from michaelnebel/csharp/xmldictionaryreader
C#: Add manual models for more some XML related classes.
2025-09-02 09:12:54 +02:00
Simon Friis Vindum
322ef4d985 Rust: Account for trait visibility when resolving paths and methods 2025-09-02 09:01:17 +02:00
Tom Hvitved
5b51bb2ef0 Rust: Deref as taint step 2025-09-02 08:55:10 +02:00
Henry Mercer
d71991fdc0 Merge pull request #20320 from github/henrymercer/default-queries
Specify default queries in `codeql-extractor.yml`
2025-09-01 15:52:47 +01:00
Michael Nebel
55dd098307 C#: Address review comments. 2025-09-01 15:43:49 +02:00
Michael Nebel
aa8a72d639 C#: Add change-note. 2025-09-01 15:43:48 +02:00
Michael Nebel
525c095287 C#: Update expected test output. 2025-09-01 15:43:46 +02:00
Michael Nebel
5cd30f023c C#: Add some XmlTextReader models. 2025-09-01 15:43:44 +02:00
Michael Nebel
8a480b6be1 C#: Update test expected output. 2025-09-01 15:43:42 +02:00
Michael Nebel
8b2ebaa047 C#: Promote some generated- and refine models for XmlReader. 2025-09-01 15:43:40 +02:00
Michael Nebel
1d35bd1a59 C#: Update expected test output. 2025-09-01 15:43:38 +02:00
Michael Nebel
beeb91dd2a C#: Add some XmlDictionaryReader models. 2025-09-01 15:43:36 +02:00
Michael Nebel
011f8dd3b3 Swift: Fix a Ql4Ql violation. 2025-09-01 15:22:56 +02:00
Michael Nebel
c5cf46bc2c Ruby: Fix some Ql4Ql violations. 2025-09-01 15:19:25 +02:00
Michael Nebel
77113b2e42 Java: Fix some Ql4Ql violations. 2025-09-01 15:04:08 +02:00
Michael Nebel
ea664e08d1 Go: Fix some Ql4Ql violations. 2025-09-01 15:00:34 +02:00
Michael Nebel
7491352278 C#: Fix some Ql4Ql violations. 2025-09-01 14:57:30 +02:00
Anders Schack-Mulligen
70a871c1e5 Merge pull request #20253 from aschackmull/shared/basicblock-signature2
Shared: Add and use a signature for basic blocks
2025-09-01 12:39:33 +02:00
Michael B. Gale
cbdc54adf7 Merge pull request #20313 from github/dependabot/github_actions/actions/checkout-5
Bump actions/checkout from 4 to 5
2025-09-01 11:34:41 +01:00
Jeroen Ketema
93f4721418 Merge pull request #20316 from jketema/stats
C++: Update dbscheme stats file
2025-09-01 11:54:43 +02:00
Joe Farebrother
42e8b32841 Merge pull request #20280 from joefarebrother/shared-loc-option
Shared: Add Option types with location
2025-09-01 10:54:04 +01:00
Anders Schack-Mulligen
09b2c5abf0 BasicBlock: Replace entryBlock predicate with subclass. 2025-09-01 11:48:44 +02:00
Anders Schack-Mulligen
e2eb6dbbf2 Ruby: Fix query compilation. 2025-09-01 11:26:37 +02:00
Anders Schack-Mulligen
6ffb9b129f C++: Extend final IRBlock 2025-09-01 11:26:36 +02:00
Anders Schack-Mulligen
3821f172df Guards/Java: Use BasicBlock signature in Guards library. 2025-09-01 11:26:36 +02:00
Anders Schack-Mulligen
a7b2a2fa9f C++: Sync files. 2025-09-01 11:26:35 +02:00
Anders Schack-Mulligen
f459ddc40a Languages: Adapt to api changes. 2025-09-01 11:26:33 +02:00
Anders Schack-Mulligen
e53b22dfa7 SSA/VariableCapture: Use shared BasicBlock signature. 2025-09-01 11:19:49 +02:00
Anders Schack-Mulligen
bb3abc815f SSA: Update input to use member predicates. 2025-09-01 11:19:48 +02:00
Anders Schack-Mulligen
119837bb1d BasicBlock: Add CFG signature. 2025-09-01 11:19:48 +02:00
Joe Farebrother
1b808fed34 Fix incorrect switch of None and Some cases 2025-09-01 09:51:00 +01:00
Joe Farebrother
80ab35c3a0 Apply review suggestions - rename things and clean up style. 2025-09-01 09:50:54 +01:00
Joe Farebrother
8e5efb5fba Add change note 2025-09-01 09:50:47 +01:00
Joe Farebrother
fc5501b9c8 Add LocOption2 for types with getLocation. 2025-09-01 09:50:39 +01:00
Joe Farebrother
51f96deb2e Add shared LocOption module for optional types with locations 2025-09-01 09:50:30 +01:00
Asger F
67a1c2ffef Update javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-01 10:20:17 +02:00
Asger F
0d0eaa21a1 Merge pull request #20302 from asgerf/js/simpler-locations
JS: Remove synthetic locations
2025-09-01 09:46:13 +02:00
Tom Hvitved
aa604425a5 Merge pull request #20305 from hvitved/csharp/dataflow-base-non-exact-type
C#: Fix context-sensitive dispatch when using `base` qualifier
2025-09-01 09:20:15 +02:00
Simon Friis Vindum
c1c7127894 Rust: Add examples where trait visibility affects path and method resolution 2025-08-30 13:26:13 +02:00
Henry Mercer
55869f28c3 Specify default queries in codeql-extractor.yml 2025-08-29 17:34:45 +01:00
Jeroen Ketema
b361b0f3c3 Merge pull request #20310 from MathiasVP/add-comptr-model-now-with-more-models
C++: Add `ComPtr` conversion operators
2025-08-29 16:45:39 +02:00
Geoffrey White
45d6fc04ce Merge pull request #20312 from geoffw0/dbquality
Rust: Tune rust/diagnostic/database-quality
2025-08-29 13:04:46 +01:00
Taus
f89fae39c5 Merge pull request #20276 from github/tausbn/python-model-psycopg2-connection-pools
Python: Add support for Psycopg2 database connection pools
2025-08-29 13:52:59 +02:00
Geoffrey White
d650d56485 Rust: Implement upgrade and downgrade scripts. 2025-08-29 12:37:52 +01:00
Jeroen Ketema
7c5b04a0da Merge pull request #20315 from jketema/uninit-test
C++: Add uninitialized local test
2025-08-29 12:52:28 +02:00
Asger F
cc8fe10801 JS: Update locations in expected files 2025-08-29 12:03:11 +02:00
Jeroen Ketema
277f5efa9c C++: Update dbscheme stats file 2025-08-29 11:13:59 +02:00
Jeroen Ketema
6b580ac12d C++: Update expected test results 2025-08-29 10:57:03 +02:00
Jeroen Ketema
a145e52faf C++: Add uninitialized local test 2025-08-29 10:55:10 +02:00
Tom Hvitved
611eca41b9 Add change note 2025-08-29 10:22:11 +02:00
Geoffrey White
bdc1f1715d Rust: Add upgrade and downgrade scripts (template). 2025-08-29 08:49:33 +01:00
Geoffrey White
a6bdab15f6 Merge branch 'main' into oldpaths1 2025-08-29 08:30:43 +01:00
Napalys Klicius
b4d6cb6e5f Merge pull request #20178 from Napalys/java/visible-for-testing-abuse
Java: Added new query `java/visible-for-testing-abuse`
2025-08-29 08:38:04 +02:00
Napalys Klicius
bafe22c50c Merge pull request #20048 from Napalys/js/xml_bomb_sinks
JS: Exclude patched libraries from `xml-bomb` sink
2025-08-29 08:10:55 +02:00
Napalys Klicius
6132900e12 Java: add full stops for ql docs 2025-08-29 08:09:03 +02:00
dependabot[bot]
6e1d9752d2 Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-29 03:04:30 +00:00
Tom Hvitved
0cc9ff8320 Merge pull request #20225 from hvitved/rust/path-resolution-crate-fallback
Rust: Fallback crate resolution
2025-08-28 20:48:51 +02:00
Geoffrey White
5d14ef5fd3 Rust: Change note. 2025-08-28 17:14:53 +01:00
Geoffrey White
9e0a31cafc Rust: Change note. 2025-08-28 17:08:03 +01:00
Geoffrey White
5c90b908cd Rust: Lower the thresholds in rust/diagnostic/database-quality to more pragmatic numbers. 2025-08-28 17:08:02 +01:00
Jeroen Ketema
b8917c8c19 Merge branch 'main' into add-comptr-model-now-with-more-models 2025-08-28 17:15:06 +02:00
Mathias Vorreiter Pedersen
b9cd7a80f9 C++: Fix conflation in models. 2025-08-28 17:10:06 +02:00
Mathias Vorreiter Pedersen
759e339444 C++: Add change note. 2025-08-28 17:02:26 +02:00
Mathias Vorreiter Pedersen
ddf0f37dac C++: Accept test changes. 2025-08-28 16:58:49 +02:00
Mathias Vorreiter Pedersen
e59de9a3d6 C++: Add models for the remaining member functions (and conversions) in ComPtr. 2025-08-28 16:56:39 +02:00
Mathias Vorreiter Pedersen
3e78572a3a C++: Drive-by fix: Add missing '@'. 2025-08-28 16:54:49 +02:00
Mathias Vorreiter Pedersen
f135ed957d C++: Add testcases with missing model. 2025-08-28 16:54:46 +02:00
Mathias Vorreiter Pedersen
2c2b1e4116 Merge pull request #20306 from MathiasVP/fix-new-initializer-bug
C++: Fix IR construction for implicit conversions in `new` initializers
2025-08-28 16:40:37 +02:00
Jeroen Ketema
1847a450cc Merge pull request #20298 from jketema/pch-expose
C++: Add class representing PCH files
2025-08-28 15:33:20 +02:00
Geoffrey White
e8b7ce43a5 Merge pull request #20270 from geoffw0/pathi
Rust: Improve FS models
2025-08-28 14:30:18 +01:00
Napalys Klicius
c836104717 Update java/ql/src/Violations of Best Practice/Implementation Hiding/VisibleForTestingAbuse.md
Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com>
2025-08-28 15:01:53 +02:00
Napalys Klicius
d3be456c5c Update java/ql/src/Violations of Best Practice/Implementation Hiding/VisibleForTestingAbuse.ql
Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com>
2025-08-28 15:01:43 +02:00
Napalys Klicius
73c8f3ded9 Merge pull request #20205 from Napalys/java/mocking-all-non-private-methods-means-unit-test-is-too-big
Java: port quality query `java/mocking-all-non-private-methods-means-unit-test-is-too-big`
2025-08-28 14:59:37 +02:00
Joe Farebrother
7ef2b01119 Merge pull request #20142 from joefarebrother/python-qual-subclass-shadow
Python: Modernise Superclass attribute shadows subclass method query
2025-08-28 13:40:26 +01:00
Napalys Klicius
1949d9f8f3 Merge branch 'main' into java/mocking-all-non-private-methods-means-unit-test-is-too-big 2025-08-28 14:22:06 +02:00
Napalys Klicius
970167bc62 Java: moved java/mocking-all-non-private-methods-means-unit-test-is-too-big to a more appropriate location, namely Violation of Best Practice/Testing 2025-08-28 14:20:19 +02:00
Geoffrey White
e860600712 Rust: Remove the canonical_path_disabled test entirely. 2025-08-28 12:55:01 +01:00
Michael Nebel
919ed3cff0 Merge pull request #20304 from michaelnebel/csharp/prettyprintmad
C#: Convert Blazor test to use pretty print models processing.
2025-08-28 13:54:23 +02:00
Tom Hvitved
aa3f4e1eca C#: Fix context-sensitive dispatch when using base qualifier 2025-08-28 13:24:47 +02:00
Jeroen Ketema
31126649a9 Update cpp/ql/lib/semmle/code/cpp/PchFile.qll
Co-authored-by: Idriss Riouak <idrissrio@github.com>
2025-08-28 13:10:39 +02:00
Mathias Vorreiter Pedersen
4116292888 C++: Accept test changes. 2025-08-28 12:13:19 +02:00
Mathias Vorreiter Pedersen
2033552bb2 C++: Handle conversions in new initializers. 2025-08-28 12:13:02 +02:00
Mathias Vorreiter Pedersen
d0e766da3e C++: Add a testcase with invalid IR. 2025-08-28 12:06:21 +02:00
Napalys Klicius
ad6ca51ef2 Update java/ql/src/Likely Bugs/Frameworks/JUnit/ExcessivePublicMethodMocking.ql
Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com>
2025-08-28 12:03:56 +02:00
Tom Hvitved
fa7295f0a1 Merge pull request #20303 from hvitved/python/jump-to-def-unpack-tests
Python: Add jump-to-def tests for unpacking assignments
2025-08-28 12:03:55 +02:00
Geoffrey White
1e46dd8412 Rust: Remove redundant code. 2025-08-28 10:59:37 +01:00
Tom Hvitved
c2bb3797b0 C#: Add data flow test 2025-08-28 11:57:03 +02:00
Michael Nebel
73ce2a2f57 C#: Convert Blazor test to use pretty print models processing. 2025-08-28 11:46:08 +02:00
Asger F
d117c52d2f JS: Use the LHS as the location for SsaExplicitDefinition 2025-08-28 11:35:15 +02:00
Asger F
4437f47a7b Merge pull request #20297 from asgerf/js/simpler-summary-pruning
JS: Change pruning to not rely on Import
2025-08-28 11:20:14 +02:00
Michael Nebel
bd31e7f230 Merge pull request #20278 from michaelnebel/csharp/streamlinebulkmodels2
C#: Update MaD models to taint entire byte- and char collection.
2025-08-28 10:49:44 +02:00
Tom Hvitved
bf47f66691 Python: Add jump-to-def tests for unpacking assignments 2025-08-28 10:38:21 +02:00
Joe Farebrother
bde143e4c1 Merge pull request #20038 from joefarebrother/python-qual-comparison
Python: Modernize 3 quality queries for comparison methods
2025-08-28 09:37:20 +01:00
Joe Farebrother
45910b9505 Merge remote-tracking branch 'origin/python-qual-subclass-shadow' into python-qual-subclass-shadow 2025-08-28 09:23:42 +01:00
Tom Hvitved
f87f52d8d2 Address review comments 2025-08-28 10:08:48 +02:00
Joe Farebrother
c6ababd262 Fix test output 2025-08-28 08:49:34 +01:00
Tom Hvitved
dcaf4a735b Rust: Fallback crate resolution 2025-08-28 09:34:05 +02:00
Geoffrey White
194363c107 Rust: Codegen. 2025-08-27 20:01:16 +01:00
Geoffrey White
f838494bf0 Rust: Remove empty impls. 2025-08-27 19:58:03 +01:00
Geoffrey White
9efb6ea995 Rust: Cargo fmt. 2025-08-27 19:16:43 +01:00
Geoffrey White
83df1137b6 Rust: Codegen. 2025-08-27 17:47:34 +01:00
Geoffrey White
2e747bb05c Merge branch 'main' into oldpaths1 (some generated files are left unmerged). 2025-08-27 16:56:06 +01:00
Simon Friis Vindum
028f1cb7b4 Merge pull request #20299 from paldepind/rust/certain-extensions
Rust: Minor tweaks to certain type inference
2025-08-27 17:49:20 +02:00
Geoffrey White
a075ed595c Rust: Remove telemetry about extractor generated paths. 2025-08-27 15:56:59 +01:00
Mathias Vorreiter Pedersen
bb08611f55 Merge pull request #20301 from MathiasVP/add-comptr-model
C++: Add `ComPtr` MaD models
2025-08-27 16:52:02 +02:00
Joe Farebrother
ada0b372c6 Merge pull request #20120 from joefarebrother/python-qual-unexpected-raise-special
Python: Modernize Unexpected Raise In Special Method query
2025-08-27 15:01:46 +01:00
Mathias Vorreiter Pedersen
bebfe03166 C++: Add missing model and accept test changes. 2025-08-27 15:15:26 +02:00
Mathias Vorreiter Pedersen
8c07a3e552 C++: Add testcase with missing model. 2025-08-27 15:12:52 +02:00
Mathias Vorreiter Pedersen
7c05622a91 C++: Add missing type and accept test changes. 2025-08-27 14:41:00 +02:00
Mathias Vorreiter Pedersen
96b6986660 C++: Fix duplicated entries. 2025-08-27 14:35:45 +02:00
Joe Farebrother
2c6b2df7cc Update python/ql/src/Classes/SubclassShadowing/SubclassShadowing.qhelp
Co-authored-by: Taus <tausbn@github.com>
2025-08-27 13:20:54 +01:00
Joe Farebrother
5b0beb91d1 Update python/ql/src/Functions/IncorrectRaiseInSpecialMethod.qhelp
Co-authored-by: Taus <tausbn@github.com>
2025-08-27 13:19:55 +01:00
Mathias Vorreiter Pedersen
9e9f6dd11a C++: Accept test changes. 2025-08-27 14:18:21 +02:00
Mathias Vorreiter Pedersen
246ed9d30b C++: Add a model for ComPtr. 2025-08-27 14:18:12 +02:00
Mathias Vorreiter Pedersen
6f64129b04 C++: Add ComPtr tests. 2025-08-27 14:05:13 +02:00
Simon Friis Vindum
08f025f164 Rust: Infer range expressions certainly and support full ranges 2025-08-27 13:59:20 +02:00
Simon Friis Vindum
4c10f07d5f Rust: Add type inference test with range full expression 2025-08-27 13:59:19 +02:00
Simon Friis Vindum
2f4e2d6d79 Rust: Infer certain types for logical operators 2025-08-27 13:59:18 +02:00
Simon Friis Vindum
0ff4dbcea0 Rust: Fix type inference inconsistency 2025-08-27 13:59:16 +02:00
Simon Friis Vindum
1981668f3c Rust: Add pattern match type inference test 2025-08-27 13:59:15 +02:00
Jeroen Ketema
fd752d36cb C++: Add missing QLDoc 2025-08-27 13:48:10 +02:00
Jeroen Ketema
97d3982061 C++: Add change note 2025-08-27 13:42:46 +02:00
Napalys Klicius
a3aacfb688 Merge pull request #20190 from Napalys/java/jvm-exit-query-promotion
Java: Enhance `java/jvm-exit` query and add to quality
2025-08-27 13:23:02 +02:00
Jeroen Ketema
9b19ccf884 C++: Update dbscheme stats file 2025-08-27 12:52:26 +02:00
Geoffrey White
1d815b16d6 Rust: Update test expectations. 2025-08-27 10:42:45 +01:00
Geoffrey White
5d060d621b Rust: Remove leftover QL use of Resolvable. 2025-08-27 10:42:44 +01:00
Geoffrey White
152ae1d29b Rust: Codegen. 2025-08-27 10:42:42 +01:00
Geoffrey White
c7947a0afa Rust: Remove built-in methods from Addressable in the schema. 2025-08-27 10:42:11 +01:00
Tom Hvitved
f232335618 Merge pull request #20291 from hvitved/rust/type-inference-more-certain-types
Rust: Add more cases to `inferCertainType`
2025-08-27 11:25:24 +02:00
Asger F
4a687a1222 JS: Add deprecated alias
The old DbLocation class was public, hence the alias
2025-08-27 11:21:18 +02:00
Asger F
dcf63fc434 JS: Remove synthetic locations 2025-08-27 11:20:24 +02:00
Asger F
be32579cab JS: Change pruning to not rely on Import 2025-08-27 10:44:23 +02:00
Jami
b7c1e1e8ce Merge pull request #20006 from jcogs33/jcogs33/java/insecure-spring-actuator-config-promotion
Java: Promote Insecure Spring Boot Actuator Configuration query from experimental
2025-08-26 19:29:03 -04:00
Jeroen Ketema
896a802194 C++: Add upgrade and downgrade scripts 2025-08-26 23:12:15 +02:00
Jeroen Ketema
e20ce57023 C++: Expose PCH file creation as usage in QL 2025-08-26 22:12:27 +02:00
Jeroen Ketema
e9b00f1e0d C++: Add tables that represent the creation and use of PCH files
This allows a use to be linked to a creation.
2025-08-26 22:12:12 +02:00
Florin Coada
499e432065 Merge pull request #20268 from github/changedocs/2.22.4
Add changelog entry for CodeQL CLI version 2.22.4
2025-08-26 20:29:35 +01:00
Geoffrey White
3cd057fe39 Rust: Remove Resolvable from the schema. 2025-08-26 17:32:02 +01:00
Florin Coada
feca56582a Update codeql-cli-2.22.4.rst 2025-08-26 16:48:23 +01:00
Paolo Tranquilli
dd68d68064 Merge pull request #20288 from github/redsun82/rust-less-warnings
Rust: downgrade uncompiled source files from warning to info
2025-08-26 17:45:17 +02:00
Paolo Tranquilli
531955e922 Merge branch 'main' into redsun82/rust-less-warnings 2025-08-26 17:29:20 +02:00
Napalys Klicius
b3f90bbdfc Update java/ql/src/Violations of Best Practice/Undesirable Calls/CallsToSystemExit.ql
Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com>
2025-08-26 13:23:24 +00:00
Napalys Klicius
6c51ba80c7 Update java/ql/src/Violations of Best Practice/Undesirable Calls/CallsToSystemExit.ql
Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com>
2025-08-26 15:19:02 +02:00
Geoffrey White
a8f7f74812 Rust: Remove unused use decls. 2025-08-26 13:57:33 +01:00
Geoffrey White
70600fe6d9 Rust: Remove unused traits and things. 2025-08-26 13:55:29 +01:00
Geoffrey White
bd5f863efc Rust: Remove uncalled methods. 2025-08-26 13:55:28 +01:00
Tom Hvitved
6453b71017 Rust: Add more cases to inferCertainType 2025-08-26 14:44:55 +02:00
Tom Hvitved
3527fca617 Merge pull request #20274 from hvitved/rust/type-synth-type-param
Rust: Include synthetic type parameters in `Type.getATypeParameter`
2025-08-26 14:42:29 +02:00
Simon Friis Vindum
87d1a14ff2 Merge pull request #20286 from github/rust/fix-examples
Rust: Fix examples in qldoc
2025-08-26 14:13:08 +02:00
Simon Friis Vindum
4ed0fb71f3 Merge pull request #20289 from github/rust/typo-in-bound
Rust: Fix minor typo in bound in comment
2025-08-26 14:12:33 +02:00
Jami
3675e4bb4f Merge branch 'main' into jcogs33/java/insecure-spring-actuator-config-promotion 2025-08-26 08:02:17 -04:00
Paolo Tranquilli
42a40c14ac Rust: reword macro expansion error 2025-08-26 13:58:47 +02:00
Geoffrey White
dd00df74dd Rust: Remove unused wiring. 2025-08-26 12:54:31 +01:00
Simon Friis Vindum
600417a767 Rust: Fix minor typo in bound in comment 2025-08-26 13:43:30 +02:00
Jeroen Ketema
d5f4a3961e Merge pull request #20287 from jketema/not-included
Java: Update integration test after query removal
2025-08-26 12:54:52 +02:00
Paolo Tranquilli
999920c968 Rust: accept test changes 2025-08-26 12:30:27 +02:00
Paolo Tranquilli
02b4c1fa85 Rust: downgrade uncompiled source files from warning to info 2025-08-26 11:56:53 +02:00
Jeroen Ketema
680aeea1ba Merge pull request #14331 from asgerf/cpp/use-flow-state-inout-barriers
C++: use in/out barriers with flow state
2025-08-26 11:47:35 +02:00
Napalys Klicius
8017fae297 Java: Simplify mock call location check using getEnclosingCallable 2025-08-26 09:44:00 +00:00
Jeroen Ketema
54f264851a Merge branch 'main' into cpp/use-flow-state-inout-barriers 2025-08-26 11:24:32 +02:00
Jeroen Ketema
704ae1a3b1 Java: Update integration test after query removal 2025-08-26 11:19:42 +02:00
Asger F
629a96c167 Merge pull request #5 from jketema/cpp/use-flow-state-inout-barriers
C++: Revert changes to `cpp/constant-array-overflow`
2025-08-26 11:08:56 +02:00
Tom Hvitved
80031e5c00 Merge pull request #20273 from hvitved/rust/attribute-in-macro-expansion
Rust: Include `getAttributeMacroExpansion` in `isInMacroExpansion`
2025-08-26 11:08:02 +02:00
Simon Friis Vindum
17f7b7f710 Rust: Fix examples in qldoc 2025-08-26 10:56:52 +02:00
Geoffrey White
078fbc6427 Rust: Remove resolve_paths from the translator. 2025-08-26 09:51:00 +01:00
Geoffrey White
456f56096f Rust: Remove ResolvePaths enum and resolve_paths arguments up to Translator::new (hardcode to false). 2025-08-26 09:46:20 +01:00
Jeroen Ketema
75786e9a71 C++: Revert changes to cpp/constant-array-overflow
It is not clear that this does what we want here, and the query is severly
broken in any case.
2025-08-26 10:43:54 +02:00
Napalys Klicius
1abb8ad54a Java: Use strictcount instead of count for method counting
Co-authored-by: michaelnebel <michaelnebel@github.com>
2025-08-26 08:41:33 +00:00
Napalys Klicius
b271f1fcd0 Java: Renamed query java/mocking-all-non-private-methods-means-unit-test-is-too-big to java/excessive-public-method-mocking and changed wording from non-private to public 2025-08-26 08:37:57 +00:00
Geoffrey White
d6d0645d7b Rust: Remove skip_path_resolution config variable (hardhoded to true). 2025-08-26 09:33:52 +01:00
Tom Hvitved
fb7c3f32d3 Merge pull request #20283 from hvitved/rust/update-test-output
Rust: Update expected test output
2025-08-26 10:06:54 +02:00
Jeroen Ketema
7a3973b941 Merge pull request #20279 from jketema/loc-cleanup
C++: Update expected test results after extractor changes
2025-08-26 09:55:02 +02:00
Tom Hvitved
83ca08cad6 Rust: Update expected test output 2025-08-25 21:54:15 +02:00
Tom Hvitved
9b4d37df24 Add change note 2025-08-25 20:49:10 +02:00
Jeroen Ketema
a104600d4d Merge branch 'main' into cpp/use-flow-state-inout-barriers 2025-08-25 17:04:30 +02:00
Paolo Tranquilli
7de34e4be0 Merge pull request #20055 from github/redsun82/cargo-upgrade-2
Rust: upgrade to rust-analyzer 0.0.300
2025-08-25 16:26:13 +02:00
Taus
1008ca9744 Python: Add psycopg2.pool tests 2025-08-25 14:14:16 +00:00
Jeroen Ketema
0752c07bc1 C++: Update expected test results after extractor changes 2025-08-25 15:56:00 +02:00
Michael Nebel
7394a80bf3 C#: Add change-note. 2025-08-25 14:53:23 +02:00
Michael Nebel
be123cf2bc C#: Update test expected output. 2025-08-25 14:52:41 +02:00
Michael Nebel
311e3ac8b5 C#: Taint entire return for Byte- and Char array summaries. 2025-08-25 14:39:29 +02:00
Taus
d5e0298999 Python: Add support for Psycopg2 database connection pools
Our current modelling only treated `psycopg2` insofar as it implemented
PEP 249 (which does not define any notion of connection pool), which
meant we were missing database connections that arose from such pools.

With these changes, we add support for the three classes relating to
database pools that are defined in `psycopg2`. (Note that
`getAnInstance` automatically looks at subclasses, which means this
should also handle cases where the user has defined a new subclass that
inherits from one of these three classes.)
2025-08-25 12:35:57 +00:00
Tom Hvitved
88059d97c8 Merge pull request #20275 from hvitved/python/fix-print-ast-yaml
Python: Only include relevant YAML in `printAst.ql`
2025-08-25 14:22:14 +02:00
Tom Hvitved
bf7e3dabd6 Python: Only include relevant YAML in printAst.ql 2025-08-25 13:54:19 +02:00
Tom Hvitved
9ef839dc8a Rust: Include synthetic type parameters in Type.getATypeParameter 2025-08-25 13:13:05 +02:00
Tom Hvitved
1d8f29136b Rust: Include getAttributeMacroExpansion in isInMacroExpansion 2025-08-25 11:00:49 +02:00
Anders Schack-Mulligen
4be995dc19 Merge pull request #20267 from aschackmull/java/nullness-fix
Java: Add more nullness tests and fix a bug causing false negatives.
2025-08-25 09:13:25 +02:00
Anders Schack-Mulligen
891ce62948 Merge pull request #17660 from knewbury01/knewbury01/improve-quality-java-set
Remove unnecessary query
2025-08-25 08:37:02 +02:00
Paolo Tranquilli
e20c8e139c Merge pull request #20250 from github/redsun82/redsun82/no-lld
Bazel: do not force `lld` and fix `platforms` warning
2025-08-25 08:32:25 +02:00
Napalys Klicius
38f517ecfa Java: Add lambda-aware test detection to VisibleForTesting query 2025-08-24 10:02:43 +00:00
Napalys Klicius
4149968f33 Java: Remove the hardcoded path filter that excluded CodeQL's own unit tests from the java/visible-for-testing-abuse query. 2025-08-24 09:58:35 +00:00
Jami Cogswell
f0542dd828 Java: add summary to change note 2025-08-22 17:17:51 -04:00
Geoffrey White
4a4f782d86 Rust: Accept another consistency test change. 2025-08-22 16:57:51 +01:00
Geoffrey White
0e2bc7c95d Merge remote-tracking branch 'upstream/main' into pathi 2025-08-22 16:57:41 +01:00
Geoffrey White
08cb038086 Rust: Accept changes to other tests. 2025-08-22 16:17:50 +01:00
Napalys Klicius
4a693d9b60 Update java/ql/src/Violations of Best Practice/Undesirable Calls/CallsToSystemExit.ql
Co-authored-by: Michael Nebel <michaelnebel@github.com>
2025-08-22 16:09:46 +02:00
Henning Makholm
3134c0aa38 Merge pull request #20269 from github/hmakholm/pr/test-run-output
rust integration test: use all output from codeql test run
2025-08-22 15:47:33 +02:00
Geoffrey White
701aec1c8e Rust: Fix the canonicalize models. 2025-08-22 14:35:51 +01:00
Henning Makholm
2e69417d67 rust integration test: use all output from codeql test run
The integration test expectes to find a certain phrase from the
extractor repeated in the _stderr_ of `codeql test run`. However, that
subcommand is about to start reproducing the extractor output as-is,
which means the phrase will instead appear in _stdout_.

Change the integration test to capture all of the output, so it
will keep passing across the change.
2025-08-22 15:27:37 +02:00
Geoffrey White
49c4c34882 Merge pull request #20221 from github/copilot/fix-20220
Rust: Implement a new query for Log Injection
2025-08-22 14:01:49 +01:00
Anders Schack-Mulligen
e343fd32d3 Java: Add change note. 2025-08-22 14:29:27 +02:00
Paolo Tranquilli
e05eca6680 Merge branch 'main' into redsun82/cargo-upgrade-2 2025-08-22 13:52:28 +02:00
Geoffrey White
7279b0318b Rust: Model a few more Path and PathBuf methods. 2025-08-22 11:31:43 +01:00
Jeroen Ketema
374c547fa2 Merge pull request #18722 from superboy-zjc/main
Fix the broken reference
2025-08-22 12:26:59 +02:00
Jeroen Ketema
6ce3aac7b7 Merge pull request #12660 from moshekaplan/patch-1
Correct menu title name of "Open Workspace"
2025-08-22 12:08:06 +02:00
Jeroen Ketema
6d7f6ff77d Merge branch 'main' into patch-1 2025-08-22 11:51:33 +02:00
Florin Coada
ea0e31fc30 Add changelog entry for CodeQL CLI version 2.22.4 2025-08-22 10:19:12 +01:00
Geoffrey White
40b9754071 Rust: Change note. 2025-08-22 09:58:11 +01:00
Geoffrey White
2f2a975350 Rust: Model path::new. 2025-08-22 09:58:09 +01:00
Geoffrey White
d1a5c9b297 Rust: Add a test case resembling code seen in the wild. 2025-08-22 09:58:08 +01:00
Geoffrey White
8b04bc0ceb Rust: Model std::fs::OpenOptions and similar. 2025-08-22 09:58:07 +01:00
Geoffrey White
9fbbe02da0 Rust: Compact these models a little. 2025-08-22 09:58:05 +01:00
Geoffrey White
fcce862cea Rust: Add an explicit test case for sinks with two relevant args. 2025-08-22 09:58:04 +01:00
Geoffrey White
16e0de0cfb Rust: Fill gaps in the tokio models. 2025-08-22 09:58:03 +01:00
Geoffrey White
29e7b6ad2c Rust: Fill a gap in the std::fs model. 2025-08-22 09:58:01 +01:00
Geoffrey White
1d2ac33bb6 Rust: Model async-std::fs. 2025-08-22 09:58:00 +01:00
Geoffrey White
49b4adcc99 Rust: Add more tests for DirEntry, PathBuf, OsString. 2025-08-22 09:57:59 +01:00
Anders Schack-Mulligen
f2352f76c0 Java: Teach guards that exceptions in catch-clauses are non-null. 2025-08-22 10:16:42 +02:00
Anders Schack-Mulligen
02452704b2 Java: Fix bug in nullness 2025-08-22 10:15:22 +02:00
Anders Schack-Mulligen
9fc0793d6a Java: More nullness qltests, including highlight of FN bug. 2025-08-22 10:12:48 +02:00
Anders Schack-Mulligen
1c724372f2 Java: More nullness qltests. 2025-08-22 10:08:17 +02:00
Anders Schack-Mulligen
ba252cb5cf Java: Add a couple of difficult condition correlation tests. 2025-08-22 10:08:00 +02:00
Napalys Klicius
4705ad2e32 Java: Added extra test cases for fields 2025-08-22 09:23:49 +02:00
Napalys Klicius
38b3df07ee Java: Address comments 2025-08-22 09:23:49 +02:00
Napalys Klicius
66f2911497 Update java/ql/src/Violations of Best Practice/Implementation Hiding/VisibleForTestingAbuse.ql
Co-authored-by: Michael Nebel <michaelnebel@github.com>
2025-08-22 09:23:49 +02:00
Napalys Klicius
0b172080aa Update java/ql/src/Violations of Best Practice/Implementation Hiding/VisibleForTestingAbuse.ql
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-22 09:23:49 +02:00
Napalys Klicius
d20fd5beba Java: updated visible-for-testing-abuse meta data and docs. 2025-08-22 09:23:49 +02:00
Napalys Klicius
ea831a8352 Java: Fix VisibleForTestingAbuse false positives in annotations 2025-08-22 09:23:49 +02:00
Napalys Klicius
eb46e54c43 Java: Refactor VisibleForTestingAbuse query to reduce complexity 2025-08-22 09:23:49 +02:00
Napalys Klicius
225723bfeb Java: Exclude @VisibleForTesting-to-@VisibleForTesting access from VisibleForTestingAbuse alerts 2025-08-22 09:23:49 +02:00
Napalys Klicius
e4042402bc Java: Resolve spurious VisibleForTestingAbuse alerts for inner class access patterns 2025-08-22 09:23:49 +02:00
Napalys Klicius
1e2e6eccd7 Java: Test @VisibleForTesting method accessing @VisibleForTesting members 2025-08-22 09:23:49 +02:00
Napalys Klicius
7e2a1944f6 Java: Fix Predicate QLDoc style. 2025-08-22 09:23:49 +02:00
Napalys Klicius
9dfb4d4301 Java: Enchanced isWithinType to also include lambdas, inner classes etc. 2025-08-22 09:23:49 +02:00
Napalys Klicius
fbf18af076 Java: enchanced check if it is within same package 2025-08-22 09:23:49 +02:00
Napalys Klicius
2a16f4829e Java: Expanded test suite of java/visible-for-testing-abuse 2025-08-22 09:23:49 +02:00
Napalys Klicius
ff6ddd2893 Java: Promoted java/visible-for-testing-abuse to quality 2025-08-22 09:23:49 +02:00
Napalys Klicius
652e9cba3d Java: Added inline test expectations for java/visible-for-testing-abuse 2025-08-22 09:23:49 +02:00
Napalys Klicius
0c14d93bc6 Java: Added new query java/visible-for-testing-abuse 2025-08-22 09:23:49 +02:00
Chris Smowton
2d9470ded8 Merge pull request #20264 from github/smowton/admin/merge-rc319-into-main
Merge rc/3.19 into main
2025-08-21 17:06:17 +01:00
Geoffrey White
8da44828a6 Rust: Add tests for std::fs::canonicalize and similar. 2025-08-21 16:47:12 +01:00
Geoffrey White
801be8fbbd Rust: Add more tests for std::fs::DirBuilder and similar. 2025-08-21 16:47:11 +01:00
Geoffrey White
bc226e2117 Rust: Add more general test cases for async_std::fs and tokio::fs. 2025-08-21 16:47:10 +01:00
Geoffrey White
5da296d77f Rust: Add tests for std::fs::OpenOptions and similar. 2025-08-21 16:47:08 +01:00
Chris Smowton
1829060fab Merge remote-tracking branch 'origin/main' into smowton/admin/merge-rc319-into-main 2025-08-21 16:33:37 +01:00
Napalys Klicius
eb6e9b8fe6 Java: Fix java/jvm-exit false positives for local nested classes in test methods 2025-08-21 14:20:49 +00:00
Napalys Klicius
41a78a0c3d Java: Added nested local class test case 2025-08-21 14:10:12 +00:00
Tom Hvitved
7a4bc80582 Merge pull request #20248 from hvitved/rust/jump-to-def-generic-args
Rust: Adjust jump-to-def for paths with generic arguments
2025-08-21 16:00:51 +02:00
Tom Hvitved
0144c77dd1 Merge pull request #20234 from hvitved/type-inference/rename-vars
Type inference: Rename some variables
2025-08-21 16:00:31 +02:00
Michael Nebel
c89f2e309d Merge pull request #20089 from michaelnebel/csharp/allowsinkimplicitread
C#: Allow implicit collection reads in sink nodes.
2025-08-21 15:29:52 +02:00
Jami
771d7cb171 Merge pull request #20095 from jcogs33/jcogs33/java/finalizers-on-exit-and-garbage-collection
Java: Add `previous-id` and adjust tags for `java/garbage-collection` and `java/run-finalizers-on-exit`
2025-08-21 08:10:36 -04:00
Owen Mansel-Chan
f1c6064f4e Merge pull request #20188 from github/dependabot/go_modules/go/extractor/extractor-dependencies-c0b353d580
Bump the extractor-dependencies group in /go/extractor with 2 updates
2025-08-21 12:44:15 +01:00
Napalys Klicius
46a2de69cd Update java/ql/src/Violations of Best Practice/Undesirable Calls/CallsToSystemExit.ql
Co-authored-by: Michael Nebel <michaelnebel@github.com>
2025-08-21 13:21:17 +02:00
Mathias Vorreiter Pedersen
dfda5a0793 Merge pull request #20249 from MathiasVP/type-tracking-for-cpp-3
C++: Use the shared type-tracking library for virtual dispatch resolution
2025-08-21 11:14:12 +02:00
Napalys Klicius
3369e16b1b Merge pull request #20254 from Napalys/cs/ldap-injection-qhelp
CS: Update `cs/ldap-injection` qhelp
2025-08-21 08:57:03 +02:00
Michael Nebel
ebfbc71104 C#: Address more review comments. 2025-08-21 08:07:17 +02:00
dependabot[bot]
e99b423e28 Bump the extractor-dependencies group in /go/extractor with 2 updates
Bumps the extractor-dependencies group in /go/extractor with 2 updates: [golang.org/x/mod](https://github.com/golang/mod) and [golang.org/x/tools](https://github.com/golang/tools).


Updates `golang.org/x/mod` from 0.26.0 to 0.27.0
- [Commits](https://github.com/golang/mod/compare/v0.26.0...v0.27.0)

Updates `golang.org/x/tools` from 0.35.0 to 0.36.0
- [Release notes](https://github.com/golang/tools/releases)
- [Commits](https://github.com/golang/tools/compare/v0.35.0...v0.36.0)

---
updated-dependencies:
- dependency-name: golang.org/x/mod
  dependency-version: 0.27.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: extractor-dependencies
- dependency-name: golang.org/x/tools
  dependency-version: 0.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: extractor-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-21 03:46:43 +00:00
Jeroen Ketema
b79f0a2cf2 Merge pull request #20252 from knewbury01/knewbury01/add-uniform-Customizations
Add extra Customizations files
2025-08-20 20:14:02 +02:00
Kristen Newbury
cf0342410d Merge branch 'knewbury01/add-uniform-Customizations' of https://github.com/knewbury01/codeql into knewbury01/add-uniform-Customizations 2025-08-20 13:19:16 -04:00
Kristen Newbury
854a5b5871 Add changenotes customizations addition 2025-08-20 13:18:17 -04:00
Napalys Klicius
71a8e10f3d CS: added extra guidance in recommendation section for LDAPInjection 2025-08-20 13:37:02 +02:00
Napalys Klicius
c475bedf73 CS: removed dead links from LDAPInjection qhelp 2025-08-20 12:58:54 +02:00
Mathias Vorreiter Pedersen
70d3e69ce5 C++: Rename 'lambda' to 'virtual'. 2025-08-20 10:38:22 +02:00
Paolo Tranquilli
fd7668d94a Merge pull request #20251 from github/redsun82/rust-remove-warning
Rust: update README to remove experimental warning
2025-08-20 10:12:19 +02:00
Michael Nebel
3e03728ffe Merge pull request #20244 from github/workflow/coverage/update
Update CSV framework coverage reports
2025-08-20 08:55:48 +02:00
Michael Nebel
b42c366250 C#: Address review comments. 2025-08-20 08:50:23 +02:00
Jeroen Ketema
c9f0e3a377 Apply suggestions from code review 2025-08-20 08:07:10 +02:00
github-actions[bot]
e74116b347 Add changed framework coverage reports 2025-08-20 00:23:14 +00:00
Kristen Newbury
d630e32ce9 Format Customizations.qll 2025-08-19 15:27:29 -04:00
Kristen Newbury
49ef6939d4 Add extra Customizations files 2025-08-19 14:49:31 -04:00
Paolo Tranquilli
65e5ded80d Rust: update README to remove experimental warning 2025-08-19 16:02:45 +02:00
Paolo Tranquilli
d6f845ee17 Bazel: do not force lld and fix platforms warning
This was meant to avoid using `gold`, but `lld` might not be installed.
Having `gold` installed results in the following warning:
```
warning: the gold linker is deprecated and has known bugs with Rust
  |
  = help: consider using LLD or ld from GNU binutils instead
```

* if a user sees this warning, they can provide the `lld` or whatever
  linker they prefer themselves, or make sure to uninstall `gold`
* in any case, this is not what we use for releasing (where we are sure
  we don't use `gold`).
2025-08-19 15:56:16 +02:00
Paolo Tranquilli
fbeebd7d3c Rust: fix old.dbscheme in downgrade script 2025-08-19 14:38:39 +02:00
Paolo Tranquilli
5e0f0c0408 Merge branch 'main' into redsun82/cargo-upgrade-2 2025-08-19 14:37:52 +02:00
Paolo Tranquilli
680b4abae2 Rust: accept test changes 2025-08-19 14:37:45 +02:00
Geoffrey White
963e028645 Merge pull request #20238 from geoffw0/scinit
Rust: Update StreamCipherInit to use getCanonicalPath.
2025-08-19 13:18:10 +01:00
Paolo Tranquilli
8ed277d6ee Rust: adapt upgrade/downgrade scripts to new hash 2025-08-19 14:03:18 +02:00
Paolo Tranquilli
49bf48eda1 Rust: fix duplicate asm! expressions 2025-08-19 14:01:25 +02:00
Mathias Vorreiter Pedersen
02bf923f7e C++: Add change note. 2025-08-19 13:57:15 +02:00
Mathias Vorreiter Pedersen
0631bd7466 C++: Add object/flow conflation for unions when resolving function pointers. 2025-08-19 13:57:13 +02:00
Mathias Vorreiter Pedersen
16508b1800 C++: Fix off-by-one error in getType on 'FinalGlobalValue' nodes and accept test changes. 2025-08-19 13:57:11 +02:00
Mathias Vorreiter Pedersen
302d35bedc C++: Accept test changes. 2025-08-19 13:57:10 +02:00
Mathias Vorreiter Pedersen
cca5bd9ada C++: Update 'mayBenefitFromCallContext' to not use the old virtual dispatch local flow predicate. 2025-08-19 13:57:07 +02:00
Mathias Vorreiter Pedersen
383799ce67 C++: Perform 6 rounds of virtual dispatch resolution like Java. 2025-08-19 13:57:05 +02:00
Mathias Vorreiter Pedersen
d4188d59a8 C++: Instantiate the type tracking module inside a reusable module like it's done in Java. 2025-08-19 13:57:03 +02:00
Mathias Vorreiter Pedersen
ea8d766ae8 Merge pull request #20242 from MathiasVP/fprintf-partial-flow
C++: Mark the write to `fprintf`'s 0'th argument as partial
2025-08-19 13:43:22 +02:00
Paolo Tranquilli
d38459a50a Fix ForTypeRepr docs and test with proper instance 2025-08-19 12:46:16 +02:00
Mathias Vorreiter Pedersen
caf7464f3b C++: Prefix with 'DataflowPrivate'. 2025-08-19 12:46:12 +02:00
Mathias Vorreiter Pedersen
fdb9f7ba2a C++: Move these predicates to make the diff smaller. 2025-08-19 12:42:15 +02:00
Mathias Vorreiter Pedersen
42fcfca849 C++: Remove the old virtual dispatch case from 'defaultViableCallable' and slightly reorganize the code in preparation for the next commit. 2025-08-19 12:39:26 +02:00
Mathias Vorreiter Pedersen
c1b91db37a C++: Add more virtual dispatch tests. 2025-08-19 12:32:09 +02:00
Paolo Tranquilli
ce48202b6a Merge branch 'main' into redsun82/cargo-upgrade-2 2025-08-19 12:25:49 +02:00
Geoffrey White
401315c4f5 Update rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll
Co-authored-by: Tom Hvitved <hvitved@github.com>
2025-08-19 09:22:53 +01:00
Tom Hvitved
714423d6b9 Rust: Adjust jump-to-def for paths with generic arguments 2025-08-19 10:22:32 +02:00
Tom Hvitved
0cd8c9009f Rust: Add more jump-to-def tests 2025-08-19 10:20:59 +02:00
Tom Hvitved
4684ac1ed9 Merge pull request #20191 from hvitved/rust/path-resolution-successor-kind
Rust: Distinguish internal/external items in path resolution
2025-08-19 10:20:05 +02:00
Anders Schack-Mulligen
a8f394fedb Merge pull request #20237 from aschackmull/guards/nullguard-caching
Guards: Cache nullGuard predicate.
2025-08-19 09:51:31 +02:00
Geoffrey White
9f04de859f Rust: Update test results following merge. 2025-08-19 08:50:23 +01:00
Geoffrey White
ab49c33915 Merge branch 'main' into scinit 2025-08-19 08:50:12 +01:00
Tom Hvitved
e6150e2079 Merge pull request #20243 from hvitved/rust/canonical-path-transitive-deps
Rust: Take transitive dependencies into account when computing canonical paths
2025-08-19 09:46:53 +02:00
Asger F
6783456213 JS: Add discard predicates 2025-08-19 09:20:00 +02:00
Asger F
ba585b8af5 JS: Add upgrade/downgrade scripts 2025-08-19 09:19:58 +02:00
Asger F
30baf0acec JS: Add overlayChangedFiles 2025-08-19 09:19:57 +02:00
Asger F
c1df8a95cb JS: Overlay extraction support 2025-08-19 09:19:55 +02:00
Asger F
6872f51725 JS: Add metadata to dbscheme and stats 2025-08-19 09:19:54 +02:00
Tom Hvitved
60b2cf6638 Rust: Take transitive dependencies into account when computing canonical paths 2025-08-18 22:02:44 +02:00
Tom Hvitved
5a69845485 Rust: Elaborate QL doc 2025-08-18 21:31:37 +02:00
Geoffrey White
bf33d1b870 Rust: Make a couple of new imports private. 2025-08-18 18:51:33 +01:00
Geoffrey White
fdec780921 Rust: Accept consistency .expected changes. 2025-08-18 18:42:06 +01:00
Geoffrey White
402e901811 Merge branch 'main' into scinit 2025-08-18 18:35:03 +01:00
Chris Smowton
238cb9ca68 Merge pull request #20241 from github/post-release-prep/codeql-cli-2.22.4
Post-release preparation for codeql-cli-2.22.4
2025-08-18 17:34:58 +01:00
Mathias Vorreiter Pedersen
af00e46fc8 C++: Mark fprintf and friends as a partial write of the stream argument. 2025-08-18 18:15:14 +02:00
Mathias Vorreiter Pedersen
6a57da79de C++: Add a test with missing flow. 2025-08-18 18:12:52 +02:00
Mathias Vorreiter Pedersen
4551875e2e C++: Drive-by improvement: Use 'partialFlowFunc' since it is in scope anyway. 2025-08-18 18:10:35 +02:00
Paolo Tranquilli
a658fa168d Rust: refine upgrade script 2025-08-18 17:19:47 +02:00
Paolo Tranquilli
6266d6e7b0 Rust: add downgrade script 2025-08-18 17:12:05 +02:00
github-actions[bot]
42e3d31c49 Post-release preparation for codeql-cli-2.22.4 2025-08-18 14:42:42 +00:00
Chris Smowton
57378ec4e4 Merge pull request #20240 from github/release-prep/2.22.4
Release preparation for version 2.22.4
2025-08-18 15:09:03 +01:00
github-actions[bot]
90d29994c8 Release preparation for version 2.22.4 2025-08-18 14:06:09 +00:00
Paolo Tranquilli
3d2bd8fedb Merge branch 'main' into redsun82/cargo-upgrade-2 2025-08-18 15:55:15 +02:00
Paolo Tranquilli
4df479471f Rust: accept test changes 2025-08-18 15:55:06 +02:00
Tom Hvitved
f1ca0ecc3c Merge pull request #20233 from hvitved/rust/remove-tc
Rust: Remove TC from `ImplTraitTypeRepr.isInReturnPos`
2025-08-18 14:46:26 +02:00
Paolo Tranquilli
a8671452fc Rust: add upgrade script 2025-08-18 13:06:30 +02:00
Michael Nebel
4b0c725367 C#: Add change note. 2025-08-18 12:56:15 +02:00
Michael Nebel
7431ee8df9 C#: Update the barrier in HashWithoutSalt to avoid an FP. It worked by accident before as we didn't allow implicit element reads at sinks. 2025-08-18 12:56:13 +02:00
Michael Nebel
1d25a20c9c C#: Update the external flow test and expected test output. 2025-08-18 12:56:12 +02:00
Michael Nebel
abd0b2e2f9 C#: Update test expected output. 2025-08-18 12:56:10 +02:00
Michael Nebel
81751ea591 C#: Allow implicit reads from collections in argument nodes (sinks and additional flow steps) for default taint tracking configurations. 2025-08-18 12:56:09 +02:00
Michael Nebel
d8215a35c0 C#: Add example of failing taint flow for collections in sinks. 2025-08-18 12:56:07 +02:00
Ian Lynagh
fd020b52e4 Merge pull request #20232 from igfoo/igfoo/SloppyGlobal
C++: SloppyGlobal: Don't alert on template instantiations, only the template
2025-08-18 11:39:30 +01:00
Tom Hvitved
299ccb68f5 Merge pull request #20230 from hvitved/cfg/standard-tree-skip-non-tree-children
Shared: Skip non-CFG children in `StandardTree`
2025-08-18 12:13:31 +02:00
Geoffrey White
4eea4431b5 Merge pull request #20222 from geoffw0/pathbuf
Rust: Add a type inference test case resembling PathBuf.canonicalize.
2025-08-18 11:06:41 +01:00
Geoffrey White
e84135a6de Update rust/ql/src/queries/security/CWE-117/LogInjection.qhelp
Co-authored-by: Sophie <29382425+sophietheking@users.noreply.github.com>
2025-08-18 10:34:43 +01:00
Geoffrey White
265c2e3603 Rust: Change note. 2025-08-18 10:29:14 +01:00
Anders Schack-Mulligen
877d397eb9 Merge pull request #20228 from 5idg5/java/data-extensions-change
Add data extensions for remote tainted sources
2025-08-18 11:26:38 +02:00
Geoffrey White
a9650e02ca Rust: Add a slightly simpler / more explicit test case. 2025-08-18 10:20:30 +01:00
Anders Schack-Mulligen
e17382d179 Guards: Cache nullGuard predicate. 2025-08-18 11:09:11 +02:00
Nora Dimitrijević
f1b55641e1 Merge pull request #20073 from d10c/d10c/diff-informed-phase-3-cpp
C++: Diff-informed queries: phase 3 (non-trivial locations)
2025-08-18 09:41:38 +02:00
Nora Dimitrijević
4199859eaa Merge pull request #20079 from d10c/d10c/diff-informed-phase-3-python
Python: Diff-informed queries: phase 3 (non-trivial locations)
2025-08-18 09:33:57 +02:00
Napalys Klicius
b19d1e0f57 Merge pull request #20151 from Napalys/js/command-line-libs
JS: Enhance command injection detection for CLI argument parsing libraries
2025-08-18 09:32:29 +02:00
Napalys Klicius
b2346183d6 Merge pull request #20148 from Napalys/js/reg-exp-env-variable-threat-model
JS: Exclude environment variables from `js/regex-injection` query by default
2025-08-18 09:32:15 +02:00
Paolo Tranquilli
7a95d5aaa6 Merge branch 'main' into redsun82/cargo-upgrade-2 2025-08-18 09:21:37 +02:00
Sid Gawri
d84e5319c3 changenote 2025-08-15 15:59:05 -04:00
Sid Gawri
e697e89171 Merge branch 'main' of https://github.com/5idg5/codeql into java/data-extensions-change 2025-08-15 15:50:12 -04:00
Nora Dimitrijević
bb9daa00c3 Merge pull request #20072 from d10c/d10c/diff-informed-phase-3-actions
Actions: Diff-informed queries: phase 3 (non-trivial locations)
2025-08-15 14:05:44 +02:00
Jeroen Ketema
84119baa50 Merge pull request #20223 from jketema/go-1.25-doc
Go: Mention Go 1.25 as supported
2025-08-15 13:47:40 +02:00
Tom Hvitved
b104535b32 Type inference: Rename some variables 2025-08-15 13:46:30 +02:00
Ian Lynagh
0870cc370b C++: Add a changenote for the change to cpp/short-global-name 2025-08-15 12:09:37 +01:00
Ian Lynagh
3157fcdf79 C++: Add some BAD annotations to SloppyGlobal test 2025-08-15 12:07:09 +01:00
Tom Hvitved
1af6ddd8e3 Rust: Remove TC from ImplTraitTypeRepr.isInReturnPos 2025-08-15 12:45:13 +02:00
Ian Lynagh
bfd4c41ed9 C++: SloppyGlobal: Accept test changes
We no longer alert on template instantiations, just the template.
2025-08-15 11:24:19 +01:00
Nora Dimitrijević
0512940c0c Merge pull request #20075 from d10c/d10c/diff-informed-phase-3-go
Go: Diff-informed queries: phase 3 (non-trivial locations)
2025-08-15 12:23:53 +02:00
Ian Lynagh
4b786061d6 C++: SloppyGlobal: Don't alert on template instantiations, only the template 2025-08-15 11:23:48 +01:00
Ian Lynagh
0b68c1c974 C++: Add some more tests for SloppyGlobal 2025-08-15 11:20:31 +01:00
Nora Dimitrijević
8000e7c442 Merge pull request #20074 from d10c/d10c/diff-informed-phase-3-csharp
C#: Diff-informed queries: phase 3 (non-trivial locations)
2025-08-15 12:07:47 +02:00
Nora Dimitrijević
89788206d1 [DIFF-INFORMED] C++: TypeConfusion 2025-08-15 12:01:30 +02:00
Nora Dimitrijević
5b9e37cd8f [DIFF-INFORMED] C++: TaintedCondition 2025-08-15 12:01:28 +02:00
Nora Dimitrijević
0c636dd400 [DIFF-INFORMED] C++: UnsafeDaclSecurityDescriptor 2025-08-15 12:01:25 +02:00
Nora Dimitrijević
194d9a9f44 [DIFF-INFORMED] C++: UnsafeCreateProcessCall 2025-08-15 12:01:23 +02:00
Nora Dimitrijević
39b430aa7e [DIFF-INFORMED] C++: IteratorToExpiredContainer 2025-08-15 12:01:21 +02:00
Nora Dimitrijević
ec85e55069 [DIFF-INFORMED] C++: InsufficientKeySize 2025-08-15 12:01:19 +02:00
Nora Dimitrijević
c0c96eaf5b [DIFF-INFORMED] C++: UseOfHttp 2025-08-15 12:01:17 +02:00
Nora Dimitrijević
8560868e95 [DIFF-INFORMED] C++: CleartextSqliteDatabase 2025-08-15 12:01:15 +02:00
Nora Dimitrijević
05df2f2216 [DIFF-INFORMED] C++: CWE-311/Cleartext… 2025-08-15 12:01:13 +02:00
Nora Dimitrijević
21914030e8 [DIFF-INFORMED] C++: SSLResultConflation (has secondary config but passes test) 2025-08-15 12:01:11 +02:00
Nora Dimitrijević
87016f399c [DIFF-INFORMED] C++: AuthenticationBypass 2025-08-15 12:01:09 +02:00
Nora Dimitrijević
861a768b2c [DIFF-INFORMED] C++: CWE-190/ArithmeticTainted,etc. 2025-08-15 12:01:07 +02:00
Nora Dimitrijević
62fa7301c3 [DIFF-INFORMED] C++: ImproperNullTerminationTainted 2025-08-15 12:01:05 +02:00
Nora Dimitrijević
f3098e7695 [DIFF-INFORMED] C++: UnboundedWrite 2025-08-15 12:01:03 +02:00
Nora Dimitrijević
7df09f369f [DIFF-INFORMED] C++: SqlTainted 2025-08-15 12:01:01 +02:00
Nora Dimitrijević
36d43a4830 [DIFF-INFORMED] C++: CgiXss 2025-08-15 12:00:59 +02:00
Nora Dimitrijević
80da00b599 [DIFF-INFORMED] C++: ExecTainted 2025-08-15 12:00:57 +02:00
Nora Dimitrijević
a77cab6981 [DIFF-INFORMED] C++: TaintedPath 2025-08-15 12:00:54 +02:00
Nora Dimitrijević
91b9c3e647 [DIFF-INFORMED] C++: LeapYear
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/cpp/ql/src/Likely%20Bugs/Leap%20Year/UncheckedLeapYearAfterYearModification.ql#L57
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/cpp/ql/src/Likely%20Bugs/Leap%20Year/Adding365DaysPerYear.ql#L21
2025-08-15 12:00:52 +02:00
Nora Dimitrijević
2f56baace2 [DIFF-INFORMED] C++: NonConstantFormat 2025-08-15 12:00:50 +02:00
Nora Dimitrijević
e382cb5696 [DIFF-INFORMED] C++: DecompressionBombs 2025-08-15 12:00:48 +02:00
Nora Dimitrijević
fabdf9923c [DIFF-INFORMED] C++: ConstantSizeArrayOffByOne 2025-08-15 12:00:46 +02:00
Nora Dimitrijević
448a1ea87a [DIFF-INFORMED] C++: OverflowDestination 2025-08-15 12:00:39 +02:00
Nora Dimitrijević
43e99d0872 [TEST] C++: CleartextSqliteDatabase: add new test 2025-08-15 12:00:26 +02:00
Nora Dimitrijević
126d24a522 [DIFF-INFORMED] Actions: EnvVarInjection
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/Security/CWE-077/EnvVarInjectionMedium.ql#L35
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/Security/CWE-077/EnvVarInjectionCritical.ql#L46
2025-08-15 11:11:12 +02:00
Nora Dimitrijević
f1445eb52f [DIFF-INFORMED] Actions: EnvPathInjection
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/Security/CWE-077/EnvPathInjectionMedium.ql#L30
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/Security/CWE-077/EnvPathInjectionCritical.ql#L37
2025-08-15 11:11:07 +02:00
Nora Dimitrijević
f1b995a736 [DIFF-INFORMED] Actions: CommandInjection
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/experimental/Security/CWE-078/CommandInjectionMedium.ql#L24
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/experimental/Security/CWE-078/CommandInjectionCritical.ql#L28
2025-08-15 11:11:03 +02:00
Nora Dimitrijević
418e4b4a3a [DIFF-INFORMED] Actions: CodeInjection
Query: https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/Security/CWE-349/CachePoisoningViaCodeInjection.ql#L46
2025-08-15 11:10:58 +02:00
Nora Dimitrijević
bbda2902be [DIFF-INFORMED] Actions: ArtifactPoisoning
Queries:
- https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/Security/CWE-829/ArtifactPoisoningMedium.ql#L23
- https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/Security/CWE-829/ArtifactPoisoningCritical.ql#L26
2025-08-15 11:10:42 +02:00
Nora Dimitrijević
896819fdf3 [DIFF-INFORMED] Actions: ArgumentInjection
Query:
- https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/experimental/Security/CWE-088/ArgumentInjectionMedium.ql#L23
- https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/actions/ql/src/experimental/Security/CWE-088/ArgumentInjectionCritical.ql#L27
2025-08-15 11:10:14 +02:00
Tom Hvitved
7501e621d1 Shared: Skip non-CFG children in StandardTree 2025-08-15 10:30:47 +02:00
Michael B. Gale
ec605b2c95 Merge pull request #20229 from github/mbg/ci/fix/csharp-create-extractor-pack
C#: Replace input interpolation with environment variable
2025-08-15 09:19:41 +01:00
Paolo Tranquilli
71edc48c0e Merge branch 'main' into redsun82/cargo-upgrade-2 2025-08-15 10:15:26 +02:00
Paolo Tranquilli
0924d795b4 Rust: accept test changes 2025-08-15 10:12:12 +02:00
Michael B. Gale
e1ffb323a0 C#: Replace input interpolation with environment variable 2025-08-15 09:00:28 +01:00
Sid Gawri
a8889ff056 add extensions for remote sources 2025-08-14 16:10:49 -04:00
Tom Hvitved
a07e357e67 Rust: Distinguish internal/external items in path resolution 2025-08-14 20:42:47 +02:00
Tom Hvitved
f1bff93bc5 Merge pull request #20203 from hvitved/rust/if-let-chain-test
Rust: Handle chained `let` expressions
2025-08-14 19:51:43 +02:00
Geoffrey White
f05d815af9 Rust: Update the security-severity tag. 2025-08-14 17:59:54 +01:00
Geoffrey White
bc0d327278 Rust: Add log injection sinks to stats. 2025-08-14 17:42:04 +01:00
Geoffrey White
9e4f59ce30 Rust: Accept consistency check failures. 2025-08-14 17:39:06 +01:00
Geoffrey White
4328ed8fcb Rust: Update suite lists. 2025-08-14 17:39:04 +01:00
Geoffrey White
9836592278 Rust: Fix compilation errors in example code. 2025-08-14 17:39:02 +01:00
Paolo Tranquilli
6ca1c587f6 Merge branch 'main' into redsun82/cargo-upgrade-2 2025-08-14 17:55:17 +02:00
Anders Schack-Mulligen
b67394a450 Merge pull request #20183 from aschackmull/java/barrierguard-wrappers
Java: Enable BarrierGuard wrappers
2025-08-14 16:06:21 +02:00
copilot-swe-agent[bot]
7b1aa2307f Address PR feedback: trim examples, remove duplicate CWE ref, autoformat
Co-authored-by: geoffw0 <40627776+geoffw0@users.noreply.github.com>
2025-08-14 13:15:03 +00:00
Geoffrey White
49265b6e7e Rust: Update inline test annotations accordingly. 2025-08-14 13:49:41 +01:00
Tom Hvitved
5c0300cbdf Merge pull request #20224 from hvitved/rust/remove-extractor-resolution-references
Rust: Remove references to `getResolvedPath` and `getExtendedCanonicalPath`
2025-08-14 14:45:33 +02:00
Tom Hvitved
d09645bc96 Add change note 2025-08-14 14:38:44 +02:00
Geoffrey White
2a19a1789d Rust: Run test, accept .expected and Cargo.lock. 2025-08-14 13:17:50 +01:00
Geoffrey White
6951f585c8 Merge pull request #20226 from geoffw0/stdlib
Rust: Update StartswithCall to use getCanonicalPath
2025-08-14 13:04:30 +01:00
Geoffrey White
02b9229be7 Rust: Update StartswithCall. 2025-08-14 12:09:49 +01:00
Geoffrey White
6941e7fef1 Rust: Add tags to intermediate steps in the test. 2025-08-14 11:37:22 +01:00
Geoffrey White
ecf0e08f55 Rust: Add some more path injection test case variants. 2025-08-14 11:05:48 +01:00
Tom Hvitved
51fb2157ef Rust: Remove references to getResolvedPath and getExtendedCanonicalPath 2025-08-14 11:31:42 +02:00
Jeroen Ketema
28f2157a8c Go: Mention Go 1.25 as supported 2025-08-14 10:49:19 +02:00
Geoffrey White
1c186e2a59 Merge remote-tracking branch 'upstream/main' into pathbuf 2025-08-14 09:38:38 +01:00
Tom Hvitved
f63e55c1fd Rust: Handle chained let expressions 2025-08-14 10:36:43 +02:00
Tom Hvitved
fd1d9401c0 Rust: Add tests for chained let expressions 2025-08-14 10:36:41 +02:00
Jeroen Ketema
72c89ec076 Merge pull request #20218 from MathiasVP/fix-guard-conditions-for-likely
C++: Improvements to `IRGuard`s
2025-08-14 10:24:48 +02:00
copilot-swe-agent[bot]
d72efc52f7 Final validation and cleanup of Rust log injection query
Co-authored-by: geoffw0 <40627776+geoffw0@users.noreply.github.com>
2025-08-13 18:12:36 +00:00
copilot-swe-agent[bot]
39ea50746f Implement Rust log injection query and test infrastructure
Co-authored-by: geoffw0 <40627776+geoffw0@users.noreply.github.com>
2025-08-13 18:09:03 +00:00
copilot-swe-agent[bot]
d954b504b4 Initial plan 2025-08-13 17:56:12 +00:00
Jon Janego
603f0f2d55 Merge pull request #20219 from github/changedocs-2.22.3
Sitedocs for 2.22.3
2025-08-13 11:54:05 -05:00
Jon Janego
cc302c0d1d Sitedocs for 2.22.3 2025-08-13 11:32:31 -05:00
Mathias Vorreiter Pedersen
39f5e33dea C++: Accept more test changes. 2025-08-13 17:46:06 +02:00
Mathias Vorreiter Pedersen
9c3bb87b89 C++: Add change note. 2025-08-13 16:42:39 +02:00
Mathias Vorreiter Pedersen
9ee313ff0a C++: Remove code that is now subsumed. 2025-08-13 16:29:49 +02:00
Mathias Vorreiter Pedersen
bf4a84ba8f C++: Drive-by: Add forgotten disjuncts involving '__builtin_expect'. 2025-08-13 16:29:42 +02:00
Mathias Vorreiter Pedersen
e6cd27a992 C++: Skip non-Boolean instructions in the new inference step. 2025-08-13 16:20:21 +02:00
Mathias Vorreiter Pedersen
e67b6d6c9a C++: Add another inference step. 2025-08-13 16:20:19 +02:00
Jeroen Ketema
ff288d799e Merge pull request #20210 from github/jketema/go-1.25
Go: Update Go version to 1.25.0
2025-08-13 16:07:36 +02:00
Chuan-kai Lin
4c263c0535 Merge pull request #20047 from github/cklin/alert-filtering-qldoc
Shared: Overhaul the AlertFiltering QLDoc
2025-08-13 06:58:38 -07:00
Jeroen Ketema
4b215d50e2 Go: Update maxGoVersion in the autobuilder 2025-08-13 14:09:53 +02:00
Jeroen Ketema
5e2a5600a7 Update go_rules to the latest version
This version includes https://github.com/bazel-contrib/rules_go/pull/4397 which
addresses the build fialure we were seeing.
2025-08-13 13:40:14 +02:00
Jeroen Ketema
976ef99d60 Go: Request go1.25.0 toolchain 2025-08-13 13:39:35 +02:00
Jeroen Ketema
4baf115c3a Go: Use Go 1.25.0 to build the Go extractor 2025-08-13 13:39:34 +02:00
Jeroen Ketema
d5f8289bcd Go: Update Go version in tests to 1.25.0 2025-08-13 13:39:32 +02:00
Jeroen Ketema
653a99779e Merge pull request #20216 from github/redsun82/rust-fix-bazel
Bazel: regenerate cargo vendored files
2025-08-13 13:36:20 +02:00
Tom Hvitved
dc6e76a0d7 Merge pull request #20182 from hvitved/rust/type-inference-tuple-types-follow-up
Rust: Unify type inference for tuple indexing expressions
2025-08-13 13:32:53 +02:00
Paolo Tranquilli
ea320c2a7b Bazel: regenerate cargo vendored files 2025-08-13 13:30:01 +02:00
Geoffrey White
91eb4dad4e Rust: Add a type inference test case resembling PathBuf.canonicalize. 2025-08-13 12:25:12 +01:00
Mathias Vorreiter Pedersen
a27135495c C++: Add tests. 2025-08-13 12:54:23 +02:00
Jeroen Ketema
fcbd333144 Merge pull request #20215 from github/redsun82/rust-fix-bazel
Rust: regenerate bazel files
2025-08-13 12:40:03 +02:00
Paolo Tranquilli
c997b29c1e Rust: regenerate bazel files 2025-08-13 11:51:11 +02:00
Geoffrey White
17b468239b Merge pull request #20208 from geoffw0/sqlmodels
Rust: Fill some gaps in our database models.
2025-08-13 08:54:23 +01:00
Mathias Vorreiter Pedersen
caa935d011 C++: Update the tests for guard conditions so that the tests print more detailed location information. 2025-08-13 09:41:28 +02:00
Chuan-kai Lin
34d546ce82 Merge branch 'main' into cklin/alert-filtering-qldoc 2025-08-12 11:11:27 -07:00
Paolo Tranquilli
92e94695e7 Rust: add ForBinder case in ClosureExpr and accept test changes 2025-08-12 17:29:11 +02:00
Paolo Tranquilli
fbc81cbb18 Rust: fix compilation errors 2025-08-12 17:10:02 +02:00
Paolo Tranquilli
338572f256 Rust: run codegen again 2025-08-12 17:04:26 +02:00
Paolo Tranquilli
0a42b7aba3 Bazel: regenerate vendored cargo dependencies 2025-08-12 16:51:13 +02:00
Paolo Tranquilli
6ad8af0ea9 Cargo: upgrade dependencies 2025-08-12 16:46:29 +02:00
Chuan-kai Lin
b20521b648 Shared: Overhaul the AlertFiltering QLDoc
This commit strengthens the contract for the restrictAlertsTo and the
restrictAlertsToExactLocation extensible predicates.

- restrictAlertsTo is now documented to match any alert location that
  intersects with a specified line range. (Previously an alert location
  matches only when its first line is in a specified line range.)

- restrictAlertsToExactLocation is now documented to match any alert
  location that wholly contains a specific character range. (Previously
  an alert location matchis only when it is exactly the same as a
  specified character range.)

It also contains misc wording changes for clarity.
2025-08-12 07:43:46 -07:00
Paolo Tranquilli
a007230f21 Merge branch 'main' into redsun82/cargo-upgrade-2 2025-08-12 16:42:23 +02:00
Tom Hvitved
0a67902f5d Merge pull request #20101 from mschwager/main
Fix #19294, Ruby NetHttpRequest improvements
2025-08-12 14:42:32 +02:00
Paolo Tranquilli
2b92b83868 Merge pull request #20207 from github/redsun82/rust-toolchain
Cargo: align rust toolchain version with internal repository
2025-08-12 11:52:37 +02:00
Tom Hvitved
454ab4db8c Rust: Unify type inference for tuple indexing expressions 2025-08-12 10:32:23 +02:00
Tom Hvitved
b2343f94c1 Rust: Add another type inference test 2025-08-12 10:32:21 +02:00
Tom Hvitved
8436f00b23 Merge pull request #20179 from hvitved/rust/type-inference-certain-follow-up
Rust: Generalize certain type inference logic
2025-08-12 10:30:02 +02:00
Paolo Tranquilli
0dfacf4be8 Rust: add test rust-toolchain.toml after fixing .gitignore 2025-08-12 10:06:32 +02:00
Paolo Tranquilli
565d607580 Merge branch 'main' into redsun82/rust-toolchain 2025-08-12 09:28:46 +02:00
Andrew Eisenberg
f5fbef9b83 Merge pull request #20196 from github/aeisenberg/indentation-fix
Fix indentation in the "Supported languages and frameworks" page
2025-08-11 13:58:46 -07:00
Andrew Eisenberg
cb541b52ed Fix indentation in the "Supported languages and frameworks" page
I'm not sure why this works, but I see it is correct in my
dev tools page.
2025-08-11 13:44:30 -07:00
Geoffrey White
af20d335c8 Rust: Accept consistency test changes. 2025-08-11 20:25:41 +01:00
Geoffrey White
993f00b658 Rust: Change note. 2025-08-11 19:32:13 +01:00
Geoffrey White
398d2ac930 Rust: Fix a couple more gaps. 2025-08-11 19:24:54 +01:00
Geoffrey White
0544ea8728 Rust: Add postgres sources. 2025-08-11 18:43:11 +01:00
Geoffrey White
4bbffc56a8 Rust: Expand tokio-postgres sources. 2025-08-11 18:42:44 +01:00
Geoffrey White
35681d0617 Rust: Add SQLx sources. 2025-08-11 18:05:58 +01:00
Geoffrey White
5056ebf186 Rust: Fix typo in one of the models. 2025-08-11 18:05:42 +01:00
Geoffrey White
17741af88e Rust: Fill out a few gaps in the models. 2025-08-11 17:45:51 +01:00
Geoffrey White
b31186451f Rust: Test more variants of rusqlite usage. 2025-08-11 17:41:28 +01:00
Geoffrey White
31353e7efc Rust: Test more variants of postgres usage. 2025-08-11 17:41:24 +01:00
Paolo Tranquilli
911d6f07b6 Shared tree-sitter extractor: run clippy 2025-08-11 17:04:22 +02:00
Paolo Tranquilli
45c0c46c9d Cargo: align rust toolchain version with internal repository
Also:
* remove new warnings raised by the rust toolchain
* run new formatting and linting
* update the rust toolchain used by `cargo`

While we keep `bazel` builds using the same toolchain as internally
(now a nightly one), I opted for using a stable toolchain for `cargo`.
The nightly toolchain is only required internally for build reasons, we
should keep not using any unstable rust features in our sources.
2025-08-11 16:45:47 +02:00
Napalys Klicius
6e38087d20 Merge pull request #20204 from p-/p--actions-untrusted-checkout-doc
Actions: clarify doc for untrusted checkout
2025-08-11 14:42:12 +02:00
Matt Schwager
357964e789 Remove duplicate lines and format query 2025-08-11 08:11:36 -04:00
Napalys Klicius
ff648fcb27 Java: Removed redundant cast to Stmt 2025-08-11 13:43:36 +02:00
Napalys Klicius
f41cb67a69 Java: Promote java/mocking-all-non-private-methods-means-unit-test-is-too-big to quality status 2025-08-11 13:43:36 +02:00
Napalys Klicius
b56f8cca2d Java: Fix QLDoc style compliance and qhelp for mocking query 2025-08-11 13:43:36 +02:00
Napalys Klicius
53ccc56959 Java: exclude single-method classes from mocking 2025-08-11 13:43:36 +02:00
Napalys Klicius
a9e9a62439 Java: add single-method class test case for mocking rule
Classes with only one public method should be compliant when mocked.
2025-08-11 13:43:36 +02:00
Napalys Klicius
22caa584ad Java: Add inline test expectations for MockingAllNonPrivateMethodsMeansUnitTestIsTooBig.qlref 2025-08-11 13:43:36 +02:00
Napalys Klicius
50c7160819 Java: port java/mocking-all-non-private-methods-means-unit-test-is-too-big query 2025-08-11 13:43:36 +02:00
Tom Hvitved
9905cd6436 Merge pull request #20192 from hvitved/rust/path-resolution-remove-source-lib-dedup
Rust: Remove source/library deduplication in path resolution
2025-08-11 13:40:34 +02:00
Geoffrey White
5fc8db8244 Merge pull request #20137 from geoffw0/cleartextstorage
Rust: New Query rust/cleartext-storage-database
2025-08-11 12:33:24 +01:00
Geoffrey White
3382d06ede Rust: Remove newline. 2025-08-11 11:51:21 +01:00
Peter Stöckli
98d312fda1 Actions: clarify doc for untrusted checkout 2025-08-11 09:56:53 +00:00
Jeroen Ketema
f9f99a043c Merge pull request #20126 from MathiasVP/fix-missing-global-flow
C++: Fix missing global variable flow
2025-08-11 11:54:35 +02:00
Mathias Vorreiter Pedersen
c8eb1cf826 C++: Add change note. 2025-08-11 11:28:53 +02:00
Mathias Vorreiter Pedersen
851cb04d36 Merge pull request #20193 from MathiasVP/fix-fp-in-overflow-buffer
C++: Fix FP in `cpp/overflow-buffer`
2025-08-11 10:45:06 +02:00
Geoffrey White
a1bc865691 Merge pull request #20185 from geoffw0/typeconsistencycounts
Rust: Add rust/diagnostics/type-inference-consistency-counts.
2025-08-11 09:42:19 +01:00
Geoffrey White
04014d9bf0 Merge pull request #20150 from geoffw0/ctorinit
Rust: Update BadCtorInitialization.ql to use getCanonicalPath.
2025-08-11 09:41:16 +01:00
Mathias Vorreiter Pedersen
ccfcd90f08 Merge pull request #20156 from MathiasVP/value-numbering-for-noop-casts
C++: Value numbering for casts that only modify specifiers
2025-08-11 10:33:58 +02:00
Mathias Vorreiter Pedersen
56aacb1e55 Merge pull request #20145 from MathiasVP/fix-type-error-in-ir
C++: Fix missing `bool` -> `int` conversions in C code
2025-08-11 10:26:54 +02:00
Tom Hvitved
874f951727 Merge pull request #20172 from hvitved/shared/concepts-final-aliases
Shared: Use `final` aliases in `ConcentsShared.qll`
2025-08-11 10:14:55 +02:00
Napalys Klicius
f6aad96504 Java: Update docs and promote to quality java/jvm-exit 2025-08-11 09:24:01 +02:00
Napalys Klicius
4df613ce37 Java: Improved java/jvm-exit query to remove FP's. 2025-08-11 09:24:01 +02:00
Napalys Klicius
d41a5e3a25 Java: Added basic test cases for java/jvm-exit 2025-08-11 09:24:01 +02:00
Paolo Tranquilli
e02a2d8eae Merge pull request #20189 from github/redsun82/java-17-in-gradle-no-wrapper-tests
Java: use java 17 in `no-wrapper` tests
2025-08-08 17:47:31 +02:00
Mathias Vorreiter Pedersen
b00107f927 C++: Add change note. 2025-08-08 15:23:40 +01:00
Mathias Vorreiter Pedersen
0c9d14f417 C++: Accept test changes. 2025-08-08 15:14:09 +01:00
Mathias Vorreiter Pedersen
d76ce4fb69 C++: Also handle reference types when computing 'trueSize'. 2025-08-08 15:12:45 +01:00
Mathias Vorreiter Pedersen
26be9839df C++: Add FP. 2025-08-08 15:10:40 +01:00
Tom Hvitved
c043e30d46 Rust: Remove source/library deduplication in path resolution 2025-08-08 13:28:18 +02:00
Anders Schack-Mulligen
492a5ca087 Java: Add some more exception edges to the CFG to facilitate guard wrappers. 2025-08-08 10:40:07 +02:00
Anders Schack-Mulligen
e94f018e14 Kotlin: Support kotlin Throws annotations. 2025-08-08 10:28:58 +02:00
Paolo Tranquilli
72843b56e8 Java: use java 17 in no-wrapper tests
Gradle 9 requires Java 17.
2025-08-08 08:58:56 +02:00
Geoffrey White
1965fdb158 Rust: Update consistency .expected. 2025-08-07 18:41:47 +01:00
Chuan-kai Lin
72563ec5a4 Merge pull request #20080 from d10c/d10c/diff-informed-phase-3-ruby
Ruby: Diff-informed queries: phase 3 (non-trivial locations)
2025-08-07 07:37:40 -07:00
Geoffrey White
38f4f8d1d2 Rust: Update suite lists. 2025-08-07 15:28:01 +01:00
Geoffrey White
c5f83c4423 Rust: Add rust/diagnostics/type-inference-consistency-counts. 2025-08-07 14:43:48 +01:00
Anders Schack-Mulligen
3b3f4bc782 Java/Guards: Remove unused. 2025-08-07 15:43:00 +02:00
Anders Schack-Mulligen
b19f15b3aa Java: Simplify ArithmeticCommon using BarrierGuards. 2025-08-07 15:43:00 +02:00
Anders Schack-Mulligen
9957cbe656 Java/Guards: Improve BarrierGuards to include validate(x = ...) checks. 2025-08-07 15:42:59 +02:00
Anders Schack-Mulligen
a04ff18ba4 Java: Enable validation wrappers in BarrierGuards. 2025-08-07 15:42:59 +02:00
Anders Schack-Mulligen
3674966946 Merge pull request #20121 from aschackmull/guards/wrapperguard
Guards: Improve support for wrapped guards
2025-08-07 15:41:04 +02:00
Anders Schack-Mulligen
2909def9b6 Guards: Rename predicate. 2025-08-07 14:51:50 +02:00
Anders Schack-Mulligen
b51c0e7cb6 Java: Add change note. 2025-08-07 14:51:50 +02:00
Anders Schack-Mulligen
d9cfe14729 Java: Accept qltest change. 2025-08-07 14:51:49 +02:00
Anders Schack-Mulligen
a40ae3a11a Guards: Slight join-order improvement. 2025-08-07 14:51:49 +02:00
Anders Schack-Mulligen
ec513ead0d Guards: Add support for extending BarrierGuards with wrapped invocations. 2025-08-07 14:51:48 +02:00
Anders Schack-Mulligen
f90b6ab005 Guards: Add support for wrappers that may throw exceptions. 2025-08-07 14:51:48 +02:00
Anders Schack-Mulligen
b156bd5ce2 Guards: Rename predicate. 2025-08-07 14:51:48 +02:00
Anders Schack-Mulligen
0c31a80f3c Guards: Generalise wrapper guards. 2025-08-07 14:51:47 +02:00
Anders Schack-Mulligen
6e52df1639 Guards: Rename module. 2025-08-07 14:51:47 +02:00
Anders Schack-Mulligen
1bdaa2420d Java: Simplify Guards instantiation a bit. 2025-08-07 14:51:46 +02:00
Anders Schack-Mulligen
3aaf48de11 Guards: Remove CustomGuard nesting in Guards instantiation. 2025-08-07 14:51:46 +02:00
Tom Hvitved
e172e74357 Rust: Remove comment from type inference test 2025-08-07 10:37:19 +02:00
Tom Hvitved
1be542ec56 Rust: Generalize certain type inference logic 2025-08-07 10:37:17 +02:00
Geoffrey White
aafdf1a279 Rust: Update StreamCipherInit to use getCanonicalPath. 2025-08-07 09:27:51 +01:00
Tom Hvitved
dfe4401f13 Merge pull request #20169 from hvitved/javascript/legacy-summary-steps
JS: Generate legacy flow steps for all flow summaries
2025-08-06 18:52:39 +02:00
Geoffrey White
e991aa3253 Merge branch 'main' into cleartextstorage 2025-08-06 15:49:44 +01:00
Tom Hvitved
ed3a33fdc6 Merge pull request #20177 from hvitved/rust/type-inference-where
Rust: Improve handling of where clauses in type inference and path resolution
2025-08-06 15:52:56 +02:00
Geoffrey White
d215ea16da Merge pull request #19802 from geoffw0/sqlx
Rust: Update SqlxQuery, SqlxExecute to use getCanonicalPath
2025-08-06 14:52:03 +01:00
Simon Friis Vindum
b50a76693a Rust: Handle multiple type bounds for the same type parameter in getTypeBound 2025-08-06 11:15:28 +02:00
Simon Friis Vindum
0cfb22ff3f Rust: Add example with multiple where clause items for the same type parameter 2025-08-06 11:15:24 +02:00
Simon Friis Vindum
b302f3f98f Rust: Improve handling of where clauses in type inference and path resolution 2025-08-06 11:08:18 +02:00
Simon Friis Vindum
766083290c Rust: Add tests with where clause 2025-08-06 11:08:13 +02:00
Tom Hvitved
d201ce1705 Merge pull request #20155 from paldepind/rust/type-inference-certain
Rust: Add predicate for certain type information
2025-08-06 10:55:34 +02:00
Tom Hvitved
1f15fc8a35 Merge pull request #20173 from hvitved/rust/type-mention-remove-restriction
Rust: Remove restriction in `PathTypeMention`
2025-08-06 10:13:23 +02:00
Tom Hvitved
eb3c054b0f JS: Generate legacy flow steps for all flow summaries 2025-08-06 09:38:49 +02:00
Geoffrey White
83ec1d0254 Rust: Add the new query sinks to the Stats.qll import, so that they're reported correctly. 2025-08-05 20:20:40 +01:00
Geoffrey White
0d4f8765a6 Merge pull request #20167 from geoffw0/mdlcleanup
Rust: Clean up some odds and ends
2025-08-05 19:25:46 +01:00
Tom Hvitved
a396f9345e Rust: Remove restriction in PathTypeMention 2025-08-05 15:05:43 +02:00
Tom Hvitved
11dcd90435 Shared: Use final aliases in ConcentsShared.qll 2025-08-05 14:53:52 +02:00
Anders Schack-Mulligen
1823355fae Merge pull request #20171 from aschackmull/java/nullness-fn
Java: document nullness false negative as qltest
2025-08-05 14:17:09 +02:00
Anders Schack-Mulligen
94274288d3 Merge pull request #20127 from aschackmull/java/joinorder3
Java: Improve a couple of join-orders
2025-08-05 14:15:42 +02:00
Anders Schack-Mulligen
c59d20a668 Merge pull request #20163 from aschackmull/java/postdom-normal
Java: Assume normal termination in post-dominance.
2025-08-05 14:01:04 +02:00
Anders Schack-Mulligen
23aac0ac51 Java: document nullness false negative as qltest 2025-08-05 13:49:51 +02:00
Geoffrey White
c8e9ed3eda Merge branch 'main' into cleartextstorage 2025-08-05 12:44:55 +01:00
Tom Hvitved
6e90823bd9 Merge pull request #20158 from hvitved/csharp/has-callable-constructor
C#: Include constructors in `ValueOrRefType.hasCallable`
2025-08-05 12:59:29 +02:00
Paolo Tranquilli
27650267a1 Merge branch 'main' into redsun82/cargo-upgrade-2 2025-08-05 11:18:56 +02:00
Anders Schack-Mulligen
273429d14a Java: Accept qltest output 2025-08-05 10:32:53 +02:00
Tom Hvitved
b426d84e1c Merge pull request #20164 from hvitved/rust/fix-bad-join
Rust: Fix bad join
2025-08-05 09:55:51 +02:00
Geoffrey White
dcda6db88b Rust: Lets not try to maintain this list. 2025-08-04 19:51:34 +01:00
Geoffrey White
0a49b65887 Rust: Make the rust/cleartext-transmission alert message more consistent with similar queries. 2025-08-04 19:47:33 +01:00
Chuan-kai Lin
e2b8d7b1ea Merge pull request #20166 from github/post-release-prep/codeql-cli-2.22.3
Post-release preparation for codeql-cli-2.22.3
2025-08-04 11:38:38 -07:00
Geoffrey White
6c024a5f9e Rust: Remove unnecessary pattern matching in cleartext logging query sinks (probably inherited from another query or language where it is used). 2025-08-04 19:28:40 +01:00
Geoffrey White
eab7481b97 Rust: Accept CWE-312 consistency check failures. 2025-08-04 18:26:09 +01:00
github-actions[bot]
fb4b0aac53 Post-release preparation for codeql-cli-2.22.3 2025-08-04 17:18:08 +00:00
Chuan-kai Lin
da3e5479df Merge pull request #20165 from github/release-prep/2.22.3
Release preparation for version 2.22.3
2025-08-04 09:19:35 -07:00
Geoffrey White
def655f994 Rust: Accept changes to the CWE-089 test (there are some duplicate results that an existing unmerged PR will address). 2025-08-04 17:15:48 +01:00
Chuan-kai Lin
4df1c12876 Minor CHANGELOG updates 2025-08-04 09:09:25 -07:00
Geoffrey White
b60faadf70 Rust: Change note. 2025-08-04 17:07:58 +01:00
github-actions[bot]
fd82aeb1f8 Release preparation for version 2.22.3 2025-08-04 15:47:57 +00:00
Geoffrey White
836f797def Rust: Accept suite changes. 2025-08-04 16:43:21 +01:00
Tom Hvitved
651e1624a6 Rust: Fix bad join
```
Evaluated relational algebra for predicate _Crate::Crate.getSourceFile/0#dispred#e7adf9d7_Crate::Generated::Crate.getName/0#dispred#f4d3b3bf_Pa__#join_rhs@5a04a7t0 with tuple counts:
        34471980   ~0%    {3} r1 = JOIN `PathResolution::isSourceFile/1#803de032` WITH `Crate::Crate.getSourceFile/0#dispred#e7adf9d7` CARTESIAN PRODUCT OUTPUT Rhs.0, Lhs.0, Rhs.1
        34471980  ~37%    {4}    | JOIN WITH `Crate::Generated::Crate.getName/0#dispred#f4d3b3bf` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Rhs.1, _
                          {3}    | REWRITE WITH NOT [Tmp.3 := "std", TEST InOut.2 != Tmp.3, Tmp.3 := "core", TEST InOut.2 != Tmp.3] KEEPING 3
           93420  ~91%    {3}    | SCAN OUTPUT In.1, _, In.0
           93420  ~87%    {3}    | REWRITE WITH Out.1 := "prelude"
                          return r1
```
2025-08-04 17:33:26 +02:00
Tom Hvitved
65bf76e3ed Merge pull request #20161 from hvitved/rust/fix-bad-joins
Rust: Fix two bad joins introduced by magic
2025-08-04 17:32:54 +02:00
Geoffrey White
a86479eba9 Rust: Accept consistency check failures. 2025-08-04 16:26:41 +01:00
Geoffrey White
8b5603cf71 Merge pull request #20160 from geoffw0/exec
Rust: Add type inference test cases resembling missing call targets in SQLx.
2025-08-04 16:03:12 +01:00
Geoffrey White
e368ee4b1b Rust: Accept that sql-injection sinks are sinks for this query, and that the existing sinks created for this query are also new sql-injection sinks. 2025-08-04 15:23:04 +01:00
Geoffrey White
989b48d576 Rust: Add tests for rusqlite. 2025-08-04 15:00:06 +01:00
Anders Schack-Mulligen
0a27a8c255 Java: Assume normal termination in post-dominance. 2025-08-04 15:08:26 +02:00
Geoffrey White
f1cb1a3f5a Rust: Add computed security-severity tag. 2025-08-04 13:41:16 +01:00
Geoffrey White
6925d4e564 Merge pull request #20129 from codeqlhelper/main
C++: Static variables are initialized to zero or null by compiler
2025-08-04 13:23:45 +01:00
Tom Hvitved
125a4b9b10 Rust: Fix two bad joins introduced by magic
```
Evaluated relational algebra for predicate TypeInference::closureParameterPath/2#9d0bf423#bbf@ba08cc1s with tuple counts:
           565067    ~172652%    {2} r1 = JOIN `Callable::Callable.getParam/1#dispred#ce0254b3_01#count_range` WITH `Callable::Generated::Callable.getNumberOfParams/0#dispred#abb45996` ON FIRST 1 OUTPUT Rhs.1, Lhs.1
            24684     ~11784%    {3}    | JOIN WITH Type::TTupleTypeParameter#5ca17706 ON FIRST 2 OUTPUT Rhs.2, Lhs.1, Lhs.0
             2970      ~1391%    {3}    | JOIN WITH `TypeInference::TypePath::singleton/1#ee45de3b` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Rhs.1
              664       ~242%    {4}    | JOIN WITH `Stdlib::FnOnceTrait.getTypeParam/0#dispred#93f20bbc` CARTESIAN PRODUCT OUTPUT Rhs.1, Lhs.0, Lhs.1, Lhs.2
              303        ~49%    {4}    | JOIN WITH Type::TDynTraitTypeParameter#e16268df ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.3
              198         ~0%    {8}    | JOIN WITH `TypeInference::TypePath::singleton/1#ee45de3b` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, _, _, Rhs.1, Lhs.3, _, _
                                 {4}    | REWRITE WITH Out.2 := (In.4 ++ In.5), Tmp.3 := (In.4 ++ In.5), Tmp.6 := "[0-9]+", Tmp.7 := "", Out.3 := regexpReplaceAll(Tmp.3,Tmp.6,Tmp.7) KEEPING 4
              198         ~0%    {6}    | SCAN OUTPUT In.0, In.1, In.2, _, In.3, _
                                 {4}    | REWRITE WITH Out.3 := length(In.4), Tmp.5 := 10, TEST Out.3 <= Tmp.5 KEEPING 4
              198         ~0%    {3}    | SCAN OUTPUT In.1, In.0, In.2

           877984   ~1444714%    {1} r2 = SCAN `CallExprBase::CallExprBase.getArg/1#dispred#d775f13d` OUTPUT In.1
           299888     ~83707%    {3}    | JOIN WITH Type::TTupleTypeParameter#5ca17706_102#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.0, Rhs.2
        515462762     ~59140%    {4}    | JOIN WITH `CallExprBase::Generated::CallExprBase.getNumberOfArgs/0#dispred#0975fe12_10#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.0, Lhs.2
          9429188  ~25728933%    {3}    | JOIN WITH TypeInference::InvokedClosureExpr#24e5dacb_1#join_rhs ON FIRST 1 OUTPUT Lhs.3, Lhs.1, Lhs.2
            53669    ~142315%    {3}    | JOIN WITH `TypeInference::TypePath::singleton/1#ee45de3b` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Rhs.1
             4003     ~10522%    {4}    | JOIN WITH `Stdlib::FnOnceTrait.getTypeParam/0#dispred#93f20bbc` CARTESIAN PRODUCT OUTPUT Rhs.1, Lhs.0, Lhs.1, Lhs.2
              370       ~910%    {4}    | JOIN WITH Type::TDynTraitTypeParameter#e16268df ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.3
              148       ~293%    {8}    | JOIN WITH `TypeInference::TypePath::singleton/1#ee45de3b` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, _, _, Rhs.1, Lhs.3, _, _
                                 {4}    | REWRITE WITH Out.2 := (In.4 ++ In.5), Tmp.3 := (In.4 ++ In.5), Tmp.6 := "[0-9]+", Tmp.7 := "", Out.3 := regexpReplaceAll(Tmp.3,Tmp.6,Tmp.7) KEEPING 4
              148       ~316%    {6}    | SCAN OUTPUT In.0, In.1, In.2, _, In.3, _
                                 {4}    | REWRITE WITH Out.3 := length(In.4), Tmp.5 := 10, TEST Out.3 <= Tmp.5 KEEPING 4
              148       ~293%    {3}    | SCAN OUTPUT In.1, In.0, In.2

              346        ~75%    {3} r3 = r1 UNION r2
                                 return r3
```

and

```
Evaluated relational algebra for predicate TypeInference::fnParameterPath/2#4dea2880#bbf@d56000vi with tuple counts:
                1         ~0%    {1} r1 = SCAN `Stdlib::FnOnceTrait.getTypeParam/0#dispred#93f20bbc` OUTPUT In.1
                1         ~0%    {1}    | JOIN WITH Type::TTypeParamTypeParameter#868c69a5 ON FIRST 1 OUTPUT Rhs.1
                1         ~0%    {1}    | JOIN WITH `TypeInference::TypePath::singleton/1#ee45de3b` ON FIRST 1 OUTPUT Rhs.1
           877984   ~1350201%    {2}    | JOIN WITH `ArgList::Generated::ArgList.getArg/1#dispred#b07adc80` CARTESIAN PRODUCT OUTPUT Rhs.1, Lhs.0
           321252     ~90755%    {4}    | JOIN WITH Type::TTupleTypeParameter#5ca17706_102#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.0, Rhs.2
        553043191     ~65412%    {5}    | JOIN WITH `CallExprBase::Generated::CallExprBase.getNumberOfArgs/0#dispred#0975fe12_10#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.0, Lhs.3
         10089088  ~26772053%    {4}    | JOIN WITH TypeInference::InvokedClosureExpr#24e5dacb_1#join_rhs ON FIRST 1 OUTPUT Lhs.4, Lhs.1, Lhs.2, Lhs.3
            57729    ~157423%    {8}    | JOIN WITH `TypeInference::TypePath::singleton/1#ee45de3b` ON FIRST 1 OUTPUT Lhs.2, Lhs.3, _, _, Lhs.1, Rhs.1, _, _
                                 {4}    | REWRITE WITH Out.2 := (In.4 ++ In.5), Tmp.3 := (In.4 ++ In.5), Tmp.6 := "[0-9]+", Tmp.7 := "", Out.3 := regexpReplaceAll(Tmp.3,Tmp.6,Tmp.7) KEEPING 4
            57729    ~157423%    {6}    | SCAN OUTPUT In.0, In.1, In.2, _, In.3, _
                                 {4}    | REWRITE WITH Out.3 := length(In.4), Tmp.5 := 10, TEST Out.3 <= Tmp.5 KEEPING 4
            57729    ~157423%    {3}    | SCAN OUTPUT In.1, In.0, In.2
                                 return r1
```
2025-08-04 14:22:50 +02:00
Simon Friis Vindum
3ba285c298 Rust: Implement certain type information for annotation and simple calls 2025-08-04 14:06:38 +02:00
Simon Friis Vindum
c3349bbb04 Rust: Add type inference example with cycle blowup 2025-08-04 14:06:37 +02:00
Tom Hvitved
361ef0f50d C#: Include constructors in ValueOrRefType.hasCallable 2025-08-04 13:51:17 +02:00
Geoffrey White
2ec6dafd18 Rust: Add a type inference test case resembling missing call targets in SQLx. 2025-08-04 10:21:59 +01:00
Simon Friis Vindum
9aebc58214 Merge pull request #20147 from paldepind/rust/type-limit-metric
Rust: Add metric for DCA and debug predicates for type that reach the length limit
2025-08-04 07:53:14 +02:00
Mathias Vorreiter Pedersen
65b1b7f63e C++: Add change note. 2025-08-03 12:17:37 +01:00
Mathias Vorreiter Pedersen
851c498b37 C++: Accept test changes. This is a FP that's been present since we put the IR into production in #2851. 2025-08-03 12:17:36 +01:00
Mathias Vorreiter Pedersen
b807ee4718 C++: Accept test changes. 2025-08-03 12:17:34 +01:00
Mathias Vorreiter Pedersen
c726285cac C++: Sync identical files. 2025-08-03 12:17:31 +01:00
Mathias Vorreiter Pedersen
0d9e298250 C++: Specifier-only converting instructions preserve GVNs. 2025-08-03 12:17:19 +01:00
Mathias Vorreiter Pedersen
fca49dde92 C++: Accept test changes. 2025-08-02 16:43:19 +01:00
Mathias Vorreiter Pedersen
73e4bfdd3e C++: Fix missing flow by also generating final global uses for functions that have a post-update node for the global variable. 2025-08-02 16:41:23 +01:00
Mathias Vorreiter Pedersen
34c1ec73c2 C++: Add tests with missing flow through globals. 2025-08-02 16:38:32 +01:00
Mathias Vorreiter Pedersen
1aa8adb472 C++: Add test. 2025-08-02 13:00:26 +01:00
Mathias Vorreiter Pedersen
14345a8288 C++: Accept test changes. 2025-08-01 16:09:44 +01:00
Mathias Vorreiter Pedersen
7561190bd1 C++: Fix type errors in C code. 2025-08-01 16:09:42 +01:00
Napalys Klicius
881ea7631e Added change note 2025-08-01 14:34:25 +02:00
Joe Farebrother
5e09c1d3d3 Merge remote-tracking branch 'origin/python-qual-subclass-shadow' into python-qual-subclass-shadow 2025-08-01 12:39:30 +01:00
Joe Farebrother
bc60914ed7 Update test output 2025-08-01 12:37:51 +01:00
Joe Farebrother
d8083add3e Doc updates 2025-08-01 12:35:01 +01:00
Napalys Klicius
ae4077db72 add taint flow for arg/command-line-args with custom argv option 2025-08-01 13:34:08 +02:00
Napalys Klicius
d6508f34b6 Add taint flow for Commander.js direct property access and action callbacks 2025-08-01 13:24:19 +02:00
Napalys Klicius
39170f327c Added couple more test cases for commander js 2025-08-01 13:14:39 +02:00
Napalys Klicius
6b4e34dd39 Added a step from parse to opts for commander js 2025-08-01 13:12:43 +02:00
Mathias Vorreiter Pedersen
1fab97b765 Merge pull request #20149 from MathiasVP/expose-definition-from-dataflow-ssa
C++: Expose SSA definitions from dataflow
2025-08-01 12:04:04 +01:00
Mathias Vorreiter Pedersen
0e9286dd34 C++: Fix QLDoc. 2025-08-01 11:37:12 +01:00
Mathias Vorreiter Pedersen
b70836e241 C++: Modify the API to not expose dataflow nodes. 2025-08-01 11:34:49 +01:00
Mathias Vorreiter Pedersen
33d05984c8 C++: Stick the exposed SSA classes into a public SSA module. 2025-08-01 11:34:47 +01:00
Mathias Vorreiter Pedersen
32e6d0934e C++: Drive-by fix: These files imported both the public dataflow files and the internal ones. Let's only import the internal ones. 2025-08-01 11:34:45 +01:00
Napalys Klicius
e980798ede Added step through yargs/yargs constructor and chained methods. 2025-08-01 12:01:30 +02:00
Mathias Vorreiter Pedersen
7ede3aa516 C++: Fix imports. 2025-08-01 10:35:34 +01:00
Mathias Vorreiter Pedersen
0d91622d18 C++: Rename SsaInternals to SsaImpl and SsaInternalsCommon to SsaImplCommon. 2025-08-01 10:34:14 +01:00
Napalys Klicius
e8eb9be3f6 Add command injection tests for CLI argument parsing libraries 2025-08-01 11:02:59 +02:00
Geoffrey White
01d24c4f83 Merge branch 'main' into sqlx 2025-07-31 16:02:36 +01:00
Mathias Vorreiter Pedersen
18289702ca C++: Add an example of double negation to the IR tests. 2025-07-31 15:49:05 +01:00
codeqlhelper
4323e6853f Update cpp/ql/src/change-notes/2025-07-27-avoid-reporting-static-global-variable.md
Co-authored-by: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
2025-07-31 21:17:29 +08:00
Mathias Vorreiter Pedersen
c8f4b287d1 C++: Add a comment on the old SSA library. 2025-07-31 14:07:38 +01:00
Mathias Vorreiter Pedersen
7e93b99ff9 C++: Add change note. 2025-07-31 13:57:19 +01:00
Mathias Vorreiter Pedersen
8691075aae Update cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-31 13:52:21 +01:00
Mathias Vorreiter Pedersen
5a91aa2105 C++: Expose SSA definitions from dataflow. 2025-07-31 13:45:03 +01:00
Geoffrey White
58680c94bc Rust: Repair BadCtorInitialization.ql's StdCall using getCanonicalPath. 2025-07-31 13:28:56 +01:00
Simon Friis Vindum
abc58ac8b3 Rust: Add metric and debug predicates for type that reach the length limit 2025-07-31 14:20:32 +02:00
Mathias Vorreiter Pedersen
1dae787605 C++: Drive-by fix suggested by Schack. This now matches the predicate in C#. 2025-07-31 12:58:05 +01:00
Napalys Klicius
3f9061abdb Added change note 2025-07-31 13:20:38 +02:00
Napalys Klicius
d28a6e6352 Added new test cases for regexp injection with enviromental variable threat model enabled 2025-07-31 13:20:37 +02:00
Napalys Klicius
8583257574 Created new folder for test with threat models disabled 2025-07-31 13:20:30 +02:00
Ian Lynagh
492e27b8e8 Merge pull request #20141 from igfoo/igfoo/kotlin-2.2.20-beta2
Kotlin: Support 2.2.20-beta2
2025-07-31 12:00:17 +01:00
Napalys Klicius
5f538209c9 Exlucde environmental variables from default detection in regexp injection 2025-07-31 12:09:30 +02:00
Joe Farebrother
79d1deb28d Update python/ql/src/Classes/SubclassShadowing/SubclassShadowing.ql
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-31 06:05:48 +01:00
Joe Farebrother
71a6b22815 Update python/ql/src/Classes/SubclassShadowing/examples/SubclassShadowingBad.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-31 06:05:25 +01:00
Geoffrey White
42ced8aa3d Rust: Add examples to tests. 2025-07-30 17:51:32 +01:00
Geoffrey White
b6e60e4087 Rust: Address small bugs in the test. 2025-07-30 17:51:31 +01:00
Geoffrey White
215fe7d0b3 Rust: Clean up the alert message. 2025-07-30 17:51:30 +01:00
Geoffrey White
e585e677c8 Rust: Add qhelp and examples. 2025-07-30 17:51:28 +01:00
Joe Farebrother
1efc09bbba Update integration tests 2025-07-30 15:54:39 +01:00
Joe Farebrother
63577f0cca Add extra example 2025-07-30 15:52:26 +01:00
Joe Farebrother
2516f9452e Move to subfolder 2025-07-30 15:17:19 +01:00
Ian Lynagh
e589019e04 Kotlin: Use 2.2.20-Beta2 rather than 2.2.20-Beta1 2025-07-30 14:14:14 +01:00
Ian Lynagh
4ea6133042 Kotlin: Add 2.2.20-Beta2 jars 2025-07-30 14:13:02 +01:00
Ian Lynagh
c78818d7dd Kotlin: Remove *2.2.20-Beta1* jars 2025-07-30 14:12:43 +01:00
Joe Farebrother
34317d2d4a Update documentation 2025-07-30 13:56:28 +01:00
Joe Farebrother
796a6060b2 Exclude setters and update tests 2025-07-30 13:56:05 +01:00
Joe Farebrother
af94ebe1fc Modernize attribute shadows subclass, Add cases for properties 2025-07-30 13:55:11 +01:00
Simon Friis Vindum
3bc1d47738 Merge pull request #20130 from paldepind/rust/type-inference-fn
Rust: Implement type inference for closures and calls to closures
2025-07-30 13:13:57 +02:00
codeqlhelper
ee3e7e34ba Merge pull request #1 from geoffw0/initnotrun .expected
CPP: Add .expected file for the InitialisationNotRun test
2025-07-30 18:36:29 +08:00
Geoffrey White
c0638a5fcb CPP: Update .expected for the changes here. 2025-07-30 11:24:57 +01:00
Anders Schack-Mulligen
5ca9c090a8 Merge pull request #20132 from aschackmull/ssa/guardvalue
SSA: Update data flow integration and BarrierGuard interface to use GuardValue.
2025-07-30 12:23:17 +02:00
Geoffrey White
d6fddde6e0 CPP: Add .expected (results before query changes here). 2025-07-30 11:22:56 +01:00
Geoffrey White
43bca84310 CPP: Convert test to use a stub rather than a library include. 2025-07-30 11:22:53 +01:00
Geoffrey White
a3110a9091 Rust: Implement query. 2025-07-29 18:19:52 +01:00
Simon Friis Vindum
5b152cfdec Rust: Fix typo in change note
Co-authored-by: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
2025-07-29 18:38:14 +02:00
Simon Friis Vindum
5540b9df71 Merge branch 'main' into rust/type-inference-fn 2025-07-29 16:43:17 +02:00
Idriss Riouak
6c00ceaec9 Merge pull request #20134 from github/idrissrio/java-dca-fix
Java: Move `extractorInformationSkipKey` predicate to library pack
2025-07-29 15:32:02 +01:00
idrissrio
ac52a1b123 Java: Move extractorInformationSkipKey predicate to library pack 2025-07-29 09:45:18 +02:00
Geoffrey White
5c64d4e9b7 Rust: Query framework. 2025-07-28 16:59:01 +01:00
Geoffrey White
897822dff5 Rust: The Cargo.lock file has changed as well. 2025-07-28 16:55:43 +01:00
Geoffrey White
9972aaf6a1 Rust: Add tests cases for cleartext storage. 2025-07-28 16:12:34 +01:00
Simon Friis Vindum
9d72fab287 Merge pull request #20119 from paldepind/rust/type-inference-assoc-type-tp
Rust: Type inference for impl trait types with type parameters
2025-07-28 11:38:17 +02:00
Anders Schack-Mulligen
3b8234ecec SSA: Update data flow integration and BarrierGuard interface to use GuardValue. 2025-07-28 11:29:12 +02:00
Simon Friis Vindum
92bce4e432 Rust: Split getFunctionReturnPos into two predicates 2025-07-28 10:45:59 +02:00
Simon Friis Vindum
9761580b7e Merge branch 'main' into rust/type-inference-assoc-type-tp 2025-07-28 10:39:00 +02:00
Simon Friis Vindum
8e474c946e Rust: Add change note for type inference for closures 2025-07-28 10:27:33 +02:00
Anders Schack-Mulligen
37b508bf43 Merge pull request #20128 from aschackmull/ccr/del-formatting-instruction
Copilot: Remove the formatting instructions, as they're confusing CCR.
2025-07-28 10:24:30 +02:00
Simon Friis Vindum
2c758a9842 Rust: Add type inference for closures and calls to first-class functions 2025-07-27 21:28:10 +02:00
Simon Friis Vindum
8c6c28d61f Rust: Add type inference tests for closures 2025-07-27 21:16:30 +02:00
codeqlhelper
75e545a67f Create 2025-07-27-avoid-reporting-static-global-variable.md 2025-07-28 00:00:41 +08:00
codeqlhelper
cf21997c0f Reduce false alarms raised by static variables
Static variables are initialized to zero or null by compiler, no need to get an initializer of them.
See https://stackoverflow.com/questions/13251083/the-initialization-of-static-variables-in-c
See 6.7.8/10 in the C99 Standard.

A relevant PR: https://github.com/github/codeql/pull/16527
2025-07-27 23:46:53 +08:00
codeqlhelper
89dcad48f4 Create InitialisationNotRun.qlref 2025-07-27 23:42:50 +08:00
codeqlhelper
c2d0a12e1e Create test for InitialisationNotRun 2025-07-27 23:40:00 +08:00
Simon Friis Vindum
13d9d8ad3f Merge pull request #20122 from paldepind/rust/type-inference-dyn-assoc
Rust: Fix type inference for trait objects for traits with associated types
2025-07-26 12:40:09 +02:00
Geoffrey White
4b947db0f8 Merge pull request #19804 from geoffw0/dotdot
Rust: Update DotDotCheck to use getCanonicalPath
2025-07-25 15:50:29 +01:00
Geoffrey White
2951ae9c7c Merge pull request #20124 from geoffw0/clone
Rust: Replace QL model for Clone with MaD
2025-07-25 15:46:44 +01:00
Simon Friis Vindum
b2ee625268 Rust: Expand doc and make predicate private 2025-07-25 15:22:10 +02:00
Geoffrey White
478f39a967 Rust: Accept (trivial) test changes. 2025-07-25 14:18:34 +01:00
Anders Schack-Mulligen
6511e21f81 Remove the formatting instructions, as they're confusing CCR. 2025-07-25 14:59:16 +02:00
Anders Schack-Mulligen
6c8275298b Java: Improve ObjFlow performance. 2025-07-25 14:41:06 +02:00
Joe Farebrother
c0da9c407e Fix typo in test dir name + update examples 2025-07-25 13:15:46 +01:00
Anders Schack-Mulligen
5ca35afb8c Java: Improve joinorder in getErasedRepr. 2025-07-25 13:34:11 +02:00
Anders Schack-Mulligen
e3021f4a65 Java: Untangle code a bit to improve join order. 2025-07-25 13:33:14 +02:00
Joe Farebrother
958fddb638 cleanup order and remove duplicates for arithmetic methods 2025-07-25 10:57:19 +01:00
Joe Farebrother
d7b855c4e3 qhelp fix 2025-07-25 10:24:58 +01:00
Joe Farebrother
9af2ab83dc Cleanups 2025-07-25 10:22:51 +01:00
Joe Farebrother
8bdf6801b3 Add qldoc 2025-07-25 10:05:09 +01:00
Joe Farebrother
3525e83ad2 Add changenote + some doc updates 2025-07-25 09:52:54 +01:00
Geoffrey White
2192ed04be Rust: Add clone MaD trait model. 2025-07-25 09:43:34 +01:00
Geoffrey White
4140579dd6 Rust: Remove QL model for clone. 2025-07-25 08:17:52 +01:00
Geoffrey White
7f659804e4 Rust: Fix the canonical path. 2025-07-24 17:24:29 +01:00
Geoffrey White
cfe25593ee Merge branch 'main' into dotdot 2025-07-24 16:32:36 +01:00
Joe Farebrother
871688f026 Update docs 2025-07-24 16:01:57 +01:00
Geoffrey White
67c170ffc1 Merge branch 'main' into sqlx 2025-07-24 15:25:35 +01:00
Simon Friis Vindum
466bf85a67 Rust: Fix type inference for trait objects for traits with associated types 2025-07-24 16:07:39 +02:00
Simon Friis Vindum
1b2f160b55 Rust: Add type inference tests for associated types 2025-07-24 16:07:37 +02:00
Joe Farebrother
362bfba049 Update unit tests 2025-07-24 14:50:36 +01:00
Joe Farebrother
b9f6657ade Remove use of toString. This does also reduce reaults from cases where the exception is not a simple identifier. 2025-07-24 13:50:27 +01:00
Joe Farebrother
b1ee795225 Merge pull request #20086 from joefarebrother/python-qual-raise-not-implemented
Python: Modernise raise-not-implemented query
2025-07-24 13:18:21 +01:00
Ian Lynagh
621b4833f3 Merge pull request #20114 from igfoo/igfoo/kotlin-2.2.20
Kotlin: Add Kotlin 2.2.20 support
2025-07-24 11:58:51 +01:00
Joe Farebrother
b9738066de try excluding set methods, add methods, update alert messages 2025-07-24 11:18:28 +01:00
Simon Friis Vindum
39f602c032 Rust: Create injective ids for impl trait type parameters 2025-07-24 12:07:11 +02:00
Simon Friis Vindum
bb56b0d45b Rust: Add type inference test with consistency issue 2025-07-24 11:55:23 +02:00
Simon Friis Vindum
9a0c5877ea Rust: Support impl trait types in return position with function type parameters 2025-07-24 11:00:01 +02:00
Joe Farebrother
97cf15affc Merge pull request #20052 from joefarebrother/python-qual-minor-doc-updates
Python: Minor documantation updates to several quality queries
2025-07-24 09:38:07 +01:00
Simon Friis Vindum
a20fed8ae5 Rust: Add type inference tests for impl trait types 2025-07-24 10:36:51 +02:00
Joe Farebrother
a8cc14493f Fix typo - add .
Co-authored-by: Napalys Klicius <napalys@github.com>
2025-07-24 09:35:05 +01:00
Simon Friis Vindum
82387461ee Merge pull request #20084 from paldepind/rust/type-inference-trait-object
Rust: Implement type inference for trait objects/`dyn` types
2025-07-24 10:17:23 +02:00
Simon Friis Vindum
b3dc6cba78 Rust: Use getATypeParam for consistency 2025-07-23 20:56:45 +02:00
Mathias Vorreiter Pedersen
5da7ae877b Merge pull request #20115 from MathiasVP/add-more-windows-memcpy-functions
C++: Add some more Windows specific memory copy models
2025-07-23 16:10:56 +01:00
Geoffrey White
199f2473e5 Merge pull request #20024 from geoffw0/moresensitive2
Shared: Improve sensitive data heuristics
2025-07-23 15:38:24 +01:00
Nora Dimitrijević
5f8c457295 Merge pull request #20081 from d10c/d10c/diff-informed-phase-3-rust
Rust: Diff-informed queries: phase 3 (non-trivial locations)
2025-07-23 16:31:23 +02:00
Geoffrey White
91ced7ea0c Merge pull request #20109 from github/copilot/fix-20108
Rust: Remove sourceModelDeprecated, summaryModelDeprecated and sinkModelDeprecated
2025-07-23 14:33:22 +01:00
Joe Farebrother
73d257e538 Port unexpected raise away from pointsto 2025-07-23 14:13:58 +01:00
Mathias Vorreiter Pedersen
cbe5561eb6 C++: Accept test changes. 2025-07-23 14:05:42 +01:00
Nora Dimitrijević
83fe9e0d51 [DIFF-INFORMED] Rust: AccessInvalidPointer 2025-07-23 14:52:44 +02:00
Nora Dimitrijević
31a73d466b [DIFF-INFORMED] Rust: AccessAfterLifetime 2025-07-23 14:52:32 +02:00
Nora Dimitrijević
56ae8684e1 [DIFF-INFORMED] Rust: UncontrolledAllocationSize 2025-07-23 14:52:14 +02:00
Nora Dimitrijević
fcc3800756 [DIFF-INFORMED] Rust: CleartextLogging 2025-07-23 14:52:07 +02:00
Nora Dimitrijević
091163bf8e [DIFF-INFORMED] Rust: CleartextTransmission 2025-07-23 14:52:00 +02:00
Nora Dimitrijević
78c40e209b [DIFF-INFORMED] Rust: SqlInjection 2025-07-23 14:51:52 +02:00
Nora Dimitrijević
574bb871e0 [DIFF-INFORMED] Rust: TaintedPath 2025-07-23 14:51:45 +02:00
Nora Dimitrijević
329fd803e2 [DIFF-INFORMED] Rust: RegexInjection 2025-07-23 14:51:33 +02:00
Mathias Vorreiter Pedersen
9d736723fb C++: Add more Windows specific models for memcpy-like tings. 2025-07-23 13:45:20 +01:00
Mathias Vorreiter Pedersen
50785f7f21 C++: Add tests with missing flow. 2025-07-23 13:37:32 +01:00
Mathias Vorreiter Pedersen
63e5c52d7e Merge pull request #20107 from MathiasVP/add-overrun-write-barriers
C++: Add more barriers to `cpp/overrun-write`
2025-07-23 13:30:07 +01:00
Simon Friis Vindum
f5605c94c5 Rust: Add change note for type inference of trait objects 2025-07-23 14:08:22 +02:00
Simon Friis Vindum
12942667bf Rust: Add type inference for dyn types 2025-07-23 14:08:15 +02:00
Simon Friis Vindum
605c8e201e Rust: Add type inference tests for dyn types 2025-07-23 14:03:53 +02:00
Ian Lynagh
604af65b02 Kotlin: Opt in to DeprecatedForRemovalCompilerApi
We'll need a proper fix for this, but this will keep things working in
the meantime.
2025-07-23 12:51:12 +01:00
Ian Lynagh
709c111522 Kotlin: Add getJvmModuleNameForDeserializedDescriptor wrapper
It has been removed in 2.2.20.
2025-07-23 12:51:12 +01:00
Mathias Vorreiter Pedersen
3a977b86d4 Update cpp/ql/lib/semmle/code/cpp/security/ProductFlowUtils/ProductFlowUtils.qll
Co-authored-by: Idriss Riouak <idrissrio@github.com>
2025-07-23 12:27:38 +01:00
Matt Schwager
d8b9d4d17a Add change-note 2025-07-23 07:03:26 -04:00
Mathias Vorreiter Pedersen
5d6c4a63bb Update cpp/ql/lib/semmle/code/cpp/security/ProductFlowUtils/ProductFlowUtils.qll
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-23 11:53:55 +01:00
Simon Friis Vindum
49ecc60c0f Merge pull request #20076 from paldepind/rust/type-inference-cleanup-join
Rust: Type inference refactor and improve join orders
2025-07-23 12:53:43 +02:00
Ian Lynagh
d1da041fcf Kotlin: Regenerate
Ran "../tools/bazel mod tidy"
2025-07-23 11:53:06 +01:00
Ian Lynagh
8432f6e42e Kotlin: Add 2.2.20-Beta1 version 2025-07-23 11:52:48 +01:00
Ian Lynagh
965f1fc547 Kotlin: Add 2.2.20 deps 2025-07-23 11:51:45 +01:00
Ian Lynagh
f148f434e1 Kotlin: Add a changenote for the addition of 2.2.2x support 2025-07-23 11:49:38 +01:00
Mathias Vorreiter Pedersen
019447b681 C++: Add change note. 2025-07-23 11:49:07 +01:00
Ian Lynagh
ad391df03f Kotlin: Support 2.2.20 2025-07-23 11:47:52 +01:00
copilot-swe-agent[bot]
defd4a1d08 Add change note for removal of deprecated dataflow predicates
Co-authored-by: geoffw0 <40627776+geoffw0@users.noreply.github.com>
2025-07-23 10:41:31 +00:00
copilot-swe-agent[bot]
f1df63657b Add CodeQL autoformatter instructions to copilot-instructions.md
Co-authored-by: geoffw0 <40627776+geoffw0@users.noreply.github.com>
2025-07-23 10:08:51 +00:00
Nick Rolfe
28d3a6b404 Merge pull request #20113 from github/post-release-prep/codeql-cli-2.22.2
Post-release preparation for codeql-cli-2.22.2
2025-07-23 06:05:34 -04:00
Nora Dimitrijević
766b0bf773 Merge pull request #20082 from d10c/d10c/diff-informed-phase-3-swift
Swift: Diff-informed queries: phase 3 (non-trivial locations)
2025-07-23 11:56:04 +02:00
github-actions[bot]
68a96a44d8 Post-release preparation for codeql-cli-2.22.2 2025-07-23 09:53:25 +00:00
copilot-swe-agent[bot]
2cc732e235 Apply QL autoformatter to ModelsAsData.qll
Co-authored-by: geoffw0 <40627776+geoffw0@users.noreply.github.com>
2025-07-23 09:38:10 +00:00
copilot-swe-agent[bot]
0245cd872c Remove deprecated Rust dataflow predicates and associated classes
Co-authored-by: geoffw0 <40627776+geoffw0@users.noreply.github.com>
2025-07-23 08:49:24 +00:00
copilot-swe-agent[bot]
69d50e103f Initial plan 2025-07-23 08:41:24 +00:00
Geoffrey White
68f0dfe046 Shared: Fix after merge. 2025-07-23 08:55:44 +01:00
Geoffrey White
4f6b698ca3 Merge branch 'main' into moresensitive2 2025-07-23 08:50:25 +01:00
Simon Friis Vindum
f432cf9c4d Merge pull request #20041 from paldepind/rust/type-inference-tuples
Rust: Type inference for tuples
2025-07-23 08:21:27 +02:00
Ian Lynagh
09dd708086 Merge pull request #20031 from igfoo/igfoo/kotlin-tests-2.2.0
Kotlin: Run the tests with 2.2.0
2025-07-22 22:20:40 +01:00
Mathias Vorreiter Pedersen
1189665970 C++: Add barriers to 'cpp/overrun-write'. 2025-07-22 18:35:56 +01:00
Mathias Vorreiter Pedersen
a502bb1ac2 C++: Add a copy of 'isSinkPairImpl' (named 'isSinkPairImpl0') with a few more columns that we'll need. 2025-07-22 18:35:50 +01:00
Mathias Vorreiter Pedersen
e0eadc75dd C++: Remove the ad-hoc code for keeping track of increments/decrements on pointers in the 'cpp/overrun-write' query. 2025-07-22 18:35:31 +01:00
Mathias Vorreiter Pedersen
a1f4246c5f C++: Extract the barriers from 'cpp/invalid-pointer-deref' into a library. 2025-07-22 18:35:29 +01:00
Mathias Vorreiter Pedersen
92a730c9ac C++: Add a false positive. 2025-07-22 18:35:21 +01:00
Ian Lynagh
cd3143f106 Kotlin: Disable the custom plugin test for now 2025-07-22 17:38:14 +01:00
Ian Lynagh
9a03f2eb26 Kotlin: Accept test changes in 2.2.0 2025-07-22 17:38:14 +01:00
Ian Lynagh
65bd1aff83 Kotlin: Update default version to 2.2.0
Changes the default version from 2.1.20 to 2.2.0 in the wrapper.py file.
2025-07-22 17:38:14 +01:00
Nick Rolfe
dd8d04bb94 Merge branch 'main' into post-release-prep/codeql-cli-2.22.2 2025-07-22 10:30:14 -04:00
github-actions[bot]
37cc78255a Post-release preparation for codeql-cli-2.22.2 2025-07-22 14:22:20 +00:00
Geoffrey White
6efc19daac Merge pull request #18943 from geoffw0/constcrypto
Rust: new query rust/hardcoded-crytographic-value
2025-07-22 13:36:14 +01:00
Geoffrey White
f7d822b19c Rust: Remove empty file. 2025-07-22 12:43:22 +01:00
Nick Rolfe
96a32c0179 Merge pull request #20103 from github/post-release-prep/codeql-cli-2.22.2
Post-release preparation for codeql-cli-2.22.2
2025-07-22 06:01:34 -04:00
github-actions[bot]
deb035cf4e Post-release preparation for codeql-cli-2.22.2 2025-07-22 09:36:07 +00:00
Simon Friis Vindum
6b366d8384 Merge branch 'main' into rust/type-inference-tuples 2025-07-22 10:45:41 +02:00
Simon Friis Vindum
79cc7318ba Merge pull request #20096 from paldepind/rust/path-resolution-associated-type-fix
Rust: Path resolution associated type fix
2025-07-22 10:12:07 +02:00
Geoffrey White
1945fb8258 Rust: Accept changes to query suites. 2025-07-21 21:09:42 +01:00
Geoffrey White
43ac82f6a3 Rust: Update consistency check .expected files. 2025-07-21 21:01:01 +01:00
Geoffrey White
d53dada67f Rust: Update barrier logic to use getCanonicalPath. 2025-07-21 20:56:48 +01:00
Geoffrey White
ec3ad85504 Rust: Add another test case for barriers (that still functions). 2025-07-21 20:53:37 +01:00
Matt Schwager
5192f3128a Update expected test output 2025-07-21 15:26:39 -04:00
Matt Schwager
9da94fb880 Fix #19294, Ruby NetHttpRequest improvements 2025-07-21 15:17:54 -04:00
Geoffrey White
796cb193fc Rust: Accept test regressions with new format MaD. 2025-07-21 17:24:19 +01:00
Geoffrey White
fc8a662f0d Rust: Update the models. 2025-07-21 17:24:07 +01:00
Geoffrey White
0ec10e5c30 Rust: Corrections after the merge. 2025-07-21 12:12:23 +01:00
Simon Friis Vindum
28850460b2 Rust: Accept test changes 2025-07-21 12:07:08 +02:00
Nora Dimitrijević
218fcbbec5 [DIFF-INFORMED] C#: HardcodedConnectionString 2025-07-21 11:28:55 +02:00
Nora Dimitrijević
b2fd58eea4 [DIFF-INFORMED] C#: ThreadUnsafeCryptoTransformLambda 2025-07-21 11:28:53 +02:00
Nora Dimitrijević
7f085e6bd9 [DIFF-INFORMED] C#: UnsafeDeserializationQuery
57c8b6e229/csharp/ql/src/Security%20Features/CWE-502/UnsafeDeserializationUntrustedInput.ql (L59)
2025-07-21 11:28:50 +02:00
Nora Dimitrijević
793f921291 [DIFF-INFORMED] C#: ConditionalBypass
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/csharp/ql/src/Security%20Features/CWE-807/ConditionalBypass.ql#L22
2025-07-21 11:28:48 +02:00
Simon Friis Vindum
8ebebf03c2 Rust: Add type inference test with associated type that collides with type parameter 2025-07-21 10:11:41 +02:00
Simon Friis Vindum
ac6715fb3a Rust: Avoid mixing up type parameters and associated types in path resolution 2025-07-21 10:07:41 +02:00
Simon Friis Vindum
71a5e410d7 Rust: Add path resolution test 2025-07-21 09:59:12 +02:00
Jami Cogswell
bca2c2da54 Java: Add 'previous-id' and adjust tags for 'java/garbage-collection' and 'java/do-not-use-finalizers' 2025-07-19 19:29:00 -04:00
Jami Cogswell
c9692a6d10 Java: fix test failures cause by alert msg change 2025-07-19 13:27:09 -04:00
Jami Cogswell
0dd33b2734 Java: remove version debugging from alert message 2025-07-19 13:01:00 -04:00
Jami Cogswell
7250265c1f Java: consider all endpoints except for health and info as sensitive to align with Spring docs 2025-07-18 17:50:18 -04:00
Jami Cogswell
685f68d9d3 Java: support 'management.endpoints.web.expose' property 2025-07-18 17:50:17 -04:00
Jami Cogswell
8decc136c4 Java: add change note 2025-07-18 17:50:14 -04:00
Jami Cogswell
70d51504a7 Java: rename to align with 'java/spring-boot-exposed-actuators' query 2025-07-18 17:50:12 -04:00
Jami Cogswell
ea529b047b Java: adjust metadata and alert msg 2025-07-18 17:50:10 -04:00
Jami Cogswell
7d5e939a86 Java: minor refactoring 2025-07-18 17:50:09 -04:00
Jami Cogswell
ea35fbbe3b Java: support version 3.x 2025-07-18 17:50:07 -04:00
Jami Cogswell
afa6610cb9 Java: update qhelp 2025-07-18 17:49:54 -04:00
Simon Friis Vindum
43b2977cb4 Shared, Rust: Reuse hasTypeConstraint in potentialInstantiationOf and factor out multipleConstraintImplementations 2025-07-18 15:33:17 +02:00
Simon Friis Vindum
bdcecdfc2c Shared, Rust: Ensure that the constraints in satisfiesConstraintType are in relevantConstraint 2025-07-18 15:33:16 +02:00
Simon Friis Vindum
475d872ffb Shared, Rust: Adjust type inference predicates to better match use sites 2025-07-18 15:32:42 +02:00
Joe Farebrother
8ccb2ed059 Merge remote-tracking branch 'origin/python-qual-raise-not-implemented' into python-qual-raise-not-implemented 2025-07-18 10:05:40 +01:00
Jami Cogswell
0d2a4222fd Java: add related location to alert message 2025-07-17 19:22:18 -04:00
Jami Cogswell
ae163a9f36 Java: add overlay annotations 2025-07-17 19:22:17 -04:00
Jami Cogswell
2bfc4b4ee2 Java: fix test case for version 1.4
Need the existence of an ApplicationProperties File, not an ApplicationProperties ConfigPair
2025-07-17 19:22:15 -04:00
Jami Cogswell
3823186dc6 Java: split tests by versions
splitting is required to properly test each scenario
2025-07-17 19:22:13 -04:00
Jami Cogswell
1b90a30d45 Java: move code to .qll file 2025-07-17 19:22:11 -04:00
Jami Cogswell
b479f5c8dc Java: fix integration tests 2025-07-17 19:22:10 -04:00
Jami Cogswell
ed8da5e151 Java: convert tests to inline expectations 2025-07-17 19:22:08 -04:00
Jami Cogswell
fc930d9184 Java: update tests for non-experimental directory 2025-07-17 19:22:06 -04:00
Jami Cogswell
38260e76bf Java: remove deprecation 2025-07-17 19:22:05 -04:00
Jami Cogswell
0dbddbdf0f Java: remove experimental files 2025-07-17 19:22:03 -04:00
Jami Cogswell
a39cb40177 Java: copy out of experimental 2025-07-17 19:22:01 -04:00
Joe Farebrother
6d33a7ec70 Update test output 2025-07-17 22:25:18 +01:00
Joe Farebrother
f2dd96ecf4 Update python/ql/src/Exceptions/NotImplementedIsNotAnException.qhelp
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-17 22:08:01 +01:00
Joe Farebrother
57f1d07b2b Undo module deprecation (used by another quality query) 2025-07-17 21:54:55 +01:00
Geoffrey White
c2ddf25f11 Merge branch 'main' into constcrypto 2025-07-17 16:13:58 +01:00
Nora Dimitrijević
4342b2b799 [DIFF-INFORMED] Swift: UnsafeWebViewFetch
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/swift/ql/src/queries/Security/CWE-079/UnsafeWebViewFetch.ql#L24
2025-07-17 14:59:09 +02:00
Nora Dimitrijević
b1e723991e [DIFF-INFORMED] Swift: InsecureTLS
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/swift/ql/src/queries/Security/CWE-757/InsecureTLS.ql#L18
2025-07-17 14:59:07 +02:00
Nora Dimitrijević
6dea73b081 [DIFF-INFORMED] Swift: CleartextStoragePreferences
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/swift/ql/src/queries/Security/CWE-312/CleartextStoragePreferences.ql#L32
2025-07-17 14:59:05 +02:00
Nora Dimitrijević
cd3fa64ee3 [DIFF-INFORMED] Swift: CleartextStorageDatabase
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/swift/ql/src/queries/Security/CWE-311/CleartextStorageDatabase.ql#L33
2025-07-17 14:59:03 +02:00
Nora Dimitrijević
4b6135c0f7 [DIFF-INFORMED] Ruby: MissingFullAnchor
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/ruby/ql/src/queries/security/cwe-020/MissingFullAnchor.ql#L18
2025-07-17 14:44:02 +02:00
Nora Dimitrijević
20030d56a5 [DIFF-INFORMED] Python: (Possible)TimingAttackAgainstHash 2025-07-17 14:40:31 +02:00
Nora Dimitrijević
9408a96ba5 [TEST] Python: TimingAttackAgainstHash: add qlref test to existing source (TODO: add source with true positive) 2025-07-17 14:40:29 +02:00
Geoffrey White
27bea33508 Rust: Accept consistency check change. 2025-07-17 12:44:31 +01:00
Geoffrey White
69064b7f7f Rust: Update the model. 2025-07-17 12:20:34 +01:00
Nora Dimitrijević
8824677e87 [DIFF-INFORMED] Go: BadRedirectCheck 2025-07-17 11:46:54 +02:00
Nora Dimitrijević
b4010ac2b4 [DIFF-INFORMED] Go: InsecureHostKeyCallback 2025-07-17 11:46:53 +02:00
Nora Dimitrijević
188fc0d933 [DIFF-INFORMED] Go: UnhandledCloseWritableHandle 2025-07-17 11:46:51 +02:00
Nora Dimitrijević
7b759f44f8 [DIFF-INFORMED] Go: AuthCookie
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnly.ql#L97
2025-07-17 11:46:49 +02:00
Nora Dimitrijević
a1fe72c423 [DIFF-INFORMED] Go: SSRF
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/experimental/CWE-918/SSRF.ql#L23
2025-07-17 11:46:47 +02:00
Nora Dimitrijević
7bd6703f19 [DIFF-INFORMED] Go: ConditionalBypass 2025-07-17 11:46:46 +02:00
Nora Dimitrijević
19b373aa90 [DIFF-INFORMED] Go: SensitiveConditionBypass
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/experimental/CWE-807/SensitiveConditionBypass.ql#L33
2025-07-17 11:46:44 +02:00
Nora Dimitrijević
d6ef585110 [DIFF-INFORMED] Go: RequestForgery, SafeUrlFlow
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/Security/CWE-918/RequestForgery.ql#L21
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/Security/CWE-601/OpenUrlRedirect.ql#L24
2025-07-17 11:46:42 +02:00
Nora Dimitrijević
8c8625d912 [DIFF-INFORMED] Go: ReflectedXss
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/Security/CWE-079/ReflectedXss.ql#L23
2025-07-17 11:46:40 +02:00
Nora Dimitrijević
4b473622bc [DIFF-INFORMED] Go: InsecureRandomness
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/Security/CWE-338/InsecureRandomness.ql#L19
2025-07-17 11:46:39 +02:00
Nora Dimitrijević
ce7eb9b16a [DIFF-INFORMED] Go: IncorrectIntegerConversion
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/Security/CWE-681/IncorrectIntegerConversionQuery.ql#L23
2025-07-17 11:46:37 +02:00
Nora Dimitrijević
f228818b1f [DIFF-INFORMED] Go: HardcodedCredentials
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/Security/CWE-798/HardcodedCredentials.ql#L62
2025-07-17 11:46:35 +02:00
Nora Dimitrijević
109f6ddc2d [DIFF-INFORMED] Go: ExternalAPIs
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/Security/CWE-020/UntrustedDataToExternalAPI.ql#L18
2025-07-17 11:46:33 +02:00
Nora Dimitrijević
89f760460b [DIFF-INFORMED] Go: CommandInjection
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/Security/CWE-078/CommandInjection.ql#L28
2025-07-17 11:46:30 +02:00
Nora Dimitrijević
e0d16a863b [DIFF-INFORMED] Go: AllocationSizeOverflow
https://github.com/d10c/codeql/blob/d10c/diff-informed-phase-3/go/ql/src/Security/CWE-190/AllocationSizeOverflow.ql#L24
2025-07-17 11:46:29 +02:00
Geoffrey White
944fd2aa11 Rust: Add explicit types in some (not all) of the test cases. 2025-07-17 10:45:40 +01:00
Joe Farebrother
680e31dc48 Modernize raise-not-implemented 2025-07-17 10:02:00 +01:00
Geoffrey White
62b7d84638 Rust: Add Sqlx as MaD sinks instead. 2025-07-16 16:36:42 +01:00
Geoffrey White
87deab861f Rust: Remove Sqlx.qll. 2025-07-16 16:23:50 +01:00
Geoffrey White
6f5e4ef5b9 Merge branch 'main' into sqlx 2025-07-16 15:59:42 +01:00
Simon Friis Vindum
7f8829ad8e Rust: Add additional inline expectation
Co-authored-by: Arthur Baars <aibaars@github.com>
2025-07-16 14:00:27 +02:00
Simon Friis Vindum
bbd7ed57ce Rust: Add inline expectation 2025-07-16 12:32:35 +02:00
Simon Friis Vindum
a508089df8 Rust: Improvements to tuple type inference based on PR feedback 2025-07-16 09:38:29 +02:00
Paolo Tranquilli
fd8ab05724 Merge branch 'main' into redsun82/cargo-upgrade-2 2025-07-15 17:25:40 +02:00
Paolo Tranquilli
e79938b597 Bazel: bump rust toolchain version to 1.88 2025-07-15 14:54:52 +02:00
Joe Farebrother
3a27758d85 Remove old py2-specific tests 2025-07-15 13:38:48 +01:00
Joe Farebrother
0f5be2d096 Update python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-15 13:33:57 +01:00
Paolo Tranquilli
c5afc65491 Rust: run codegen again 2025-07-15 14:32:13 +02:00
Joe Farebrother
909f57261c Minor doc updates; updating python 2 references to python 3 and updating grammar 2025-07-15 13:26:46 +01:00
Paolo Tranquilli
7b48cb2ce8 Bazel: regenerate cargo vendored files 2025-07-15 14:22:43 +02:00
Paolo Tranquilli
f0466ae9ca Cargo: upgrade dependencies 2025-07-15 14:14:39 +02:00
Napalys Klicius
ea93b392f7 Added change note for python 2025-07-15 13:43:08 +02:00
Napalys Klicius
638f6498f0 Removed lxml.etree.XMLParser from xml bomb sinks 2025-07-15 13:43:00 +02:00
Joe Farebrother
7a7db0efe8 Update unsupported format character documentaion, fix outdated reference link 2025-07-15 10:42:25 +01:00
Joe Farebrother
df5f76872f Update docs for duplicate-key-in-dict-literal to relate. to python 3 2025-07-15 10:18:29 +01:00
Joe Farebrother
15115f50c1 Remove old tests 2025-07-15 09:50:21 +01:00
Simon Friis Vindum
8858f213ff Rust: Add a change note 2025-07-15 10:23:30 +02:00
Simon Friis Vindum
97e77944eb Rust: Accept test changes 2025-07-15 10:21:53 +02:00
Simon Friis Vindum
7c04c9f969 Rust: Store arity in tuple type parameters
Type parameters are required to belong to a single type only. Since we store the arity for tuple types, we need to store the arity in tuple type parameters as well such that we can associate them to the tuple type of the same arity.
2025-07-15 09:50:15 +02:00
Napalys Klicius
887d80f49f Added change note 2025-07-15 09:37:34 +02:00
Napalys Klicius
1851deb929 Removed libxmljs from being marked as sink for xml-bomb. 2025-07-15 09:33:11 +02:00
Simon Friis Vindum
03a9a1688e Rust: Add type inference for tuples 2025-07-14 16:37:05 +02:00
Simon Friis Vindum
21c030fa46 Rust: Expand on type inference test for tuples 2025-07-14 16:24:11 +02:00
Joe Farebrother
0f04a8b2c0 Update integration test output 2025-07-14 14:35:12 +01:00
Joe Farebrother
f784bb0a35 Fix qldoc errors + typos 2025-07-14 14:26:49 +01:00
Geoffrey White
918700ff6f Merge branch 'main' into moresensitive2 2025-07-14 11:58:08 +01:00
Geoffrey White
da0742f3ec Rust: Update path resolution consistency .expected. 2025-07-14 11:45:45 +01:00
Geoffrey White
30c6082b5d Sync identical files. 2025-07-14 11:45:34 +01:00
Geoffrey White
e121579a85 Rust: Adjust the test labels slightly. 2025-07-14 11:19:31 +01:00
Geoffrey White
9f59a3501c Rust: Revert ipaddr and fingerprint terms (too many FPs). 2025-07-14 11:17:09 +01:00
Joe Farebrother
61af4e4514 Add changenote and update integraion test output 2025-07-14 11:00:05 +01:00
Joe Farebrother
ea48fcca8f Update doc for equalsNotEquals 2025-07-14 10:49:28 +01:00
Joe Farebrother
58f503de38 Update docs for incomplete ordering + inconsistent hashing 2025-07-11 23:08:50 +01:00
Geoffrey White
4778ef616a Rust: Add a test case for password_confirmation. 2025-07-11 15:43:31 +01:00
Joe Farebrother
843a6c8012 Remove total order check from equals not equals (doesn't make sense there; total order doesn't define eq or ne methods at all) 2025-07-11 15:12:59 +01:00
Joe Farebrother
083d258585 Add/update unit tests 2025-07-11 15:10:45 +01:00
Geoffrey White
8f6f9f4359 Add change notes. 2025-07-11 11:54:59 +01:00
Geoffrey White
123458fd21 Sync identical files. 2025-07-10 18:10:24 +01:00
Geoffrey White
a6b4a18d51 Rust: Add negative patterns. 2025-07-10 13:56:14 +01:00
Geoffrey White
8f95e26ed6 Rust: Combine regexs where possible (likely better performance). 2025-07-10 13:56:12 +01:00
Geoffrey White
99e62d66e5 Rust: Add sensitive data patterns. 2025-07-10 13:56:11 +01:00
Joe Farebrother
8fb9bdd0af move equals attr test to equals attr folder 2025-07-09 15:25:21 +01:00
Joe Farebrother
a687b60af9 Modernise equals-hash-mismatch 2025-07-09 14:14:38 +01:00
Joe Farebrother
eb1b5a35d7 Modernize inconsistent equality 2025-07-09 14:14:30 +01:00
Joe Farebrother
4c5c4e06c3 Move inconsistentEquality and equals-hash-mismatch to subfolder 2025-07-09 14:14:26 +01:00
Joe Farebrother
e71af8fd6d Move to subfolder 2025-07-09 14:14:22 +01:00
Joe Farebrother
fccdc30ac5 Modernize incomplete ordering query 2025-07-09 14:14:17 +01:00
Geoffrey White
f3b5cc79ff Merge branch 'main' into sqlx 2025-07-08 13:58:19 +01:00
Geoffrey White
898c569f1b Rust: Change note. 2025-06-24 11:37:54 +01:00
Geoffrey White
cd6975f7b7 Rust: Update DotDotCheck from getResolvedPath -> getCanonicalPath. 2025-06-17 17:07:39 +01:00
Geoffrey White
dc08274aa2 Rust: Update SqlxQuery, SqlxExecute from getResolvedPath -> getCanonicalPath. 2025-06-17 15:56:18 +01:00
Geoffrey White
07011f7460 Rust: Fix more after merge. 2025-03-17 12:22:09 +00:00
Geoffrey White
f5daec9da0 Rust: Fix after merge. 2025-03-17 12:10:59 +00:00
Geoffrey White
81edb4780d Merge branch 'main' into constcrypto 2025-03-17 12:05:51 +00:00
Geoffrey White
704b3850f4 Rust: Fix a mistake in the test. 2025-03-17 11:24:58 +00:00
Geoffrey White
a0f4fa28b2 Rust: hardcoded -> hard-coded. 2025-03-11 09:40:47 +00:00
Geoffrey White
e3beacbda2 Rust: Print models (temporary, to see how this differs on CI). 2025-03-10 19:38:36 +00:00
Geoffrey White
1ca5c593f9 Rust: Replace imports of internal.DataFlowImpl where possible. 2025-03-10 11:47:23 +00:00
Geoffrey White
9e54d53537 Rust: Add barrier. 2025-03-10 11:41:48 +00:00
Geoffrey White
a34f9bef2b Rust: Add a test case for getrandom. 2025-03-10 11:33:29 +00:00
Geoffrey White
e84a98bd97 Apply suggestions from code review
Co-authored-by: mc <42146119+mchammer01@users.noreply.github.com>
2025-03-10 11:15:23 +00:00
Geoffrey White
b4e710f459 Rust: Add missing models (for some platforms???). 2025-03-07 22:28:38 +00:00
Geoffrey White
fdb4362b6f Merge remote-tracking branch 'upstream/main' into constcrypto 2025-03-07 17:51:48 +00:00
Geoffrey White
3dc35f1fab Rust: Accept more test changes. 2025-03-07 17:02:26 +00:00
Geoffrey White
c63c1be11c Rust: Accept integration test .expected changes. 2025-03-07 16:12:31 +00:00
Geoffrey White
19416a9ee3 Rust: Correct test results. 2025-03-07 15:43:34 +00:00
Geoffrey White
b6c9be23c1 Merge branch 'main' into constcrypto 2025-03-07 09:11:10 +00:00
Geoffrey White
42e7d1e983 Rust: Fix typo. 2025-03-06 19:09:01 +00:00
Geoffrey White
9af2d0218b Rust: Add the new sinks to stats. 2025-03-06 18:50:11 +00:00
Geoffrey White
952e417d13 Rust: Tweak some wording. 2025-03-06 18:46:37 +00:00
Geoffrey White
e564c41043 Rust: Compute security-severity tag. 2025-03-06 18:36:55 +00:00
Geoffrey White
95be12ed80 Rust: Add qhelp and examples. 2025-03-06 17:48:47 +00:00
Geoffrey White
b4a6063e20 Rust: Add std::mem::zeroed as a source. 2025-03-06 17:48:45 +00:00
Geoffrey White
ac94ac6584 Rust: Model even more sinks + flows. 2025-03-06 17:48:44 +00:00
Geoffrey White
055baf2769 Rust: Improve results on arrays (less duplication). 2025-03-06 17:48:43 +00:00
Geoffrey White
aacbfc0fd8 Rust: Improve alert messages. 2025-03-06 17:48:41 +00:00
Geoffrey White
a6e106e025 Rust: Model more sinks + flows. 2025-03-06 17:48:40 +00:00
Geoffrey White
9fb00daeec Rust: Implement the query (with one source, one sink model). 2025-03-06 17:48:39 +00:00
Geoffrey White
bd75f0187b Rust: More test cases. 2025-03-06 17:48:37 +00:00
Geoffrey White
9a35febe80 Rust: Query framework and basic tests. 2025-03-06 13:24:05 +00:00
2h0ng
150debdd8d Fix the broken reference 2025-02-09 15:29:37 -05:00
Kristen Newbury
df18891a2f Fix changenote for query removal change 2024-10-03 17:36:42 -04:00
Kristen Newbury
e98db7fd20 Add changenote for query removal change 2024-10-03 17:28:59 -04:00
Kristen Newbury
d10a6b4ca0 Remove unnecessary query 2024-10-03 13:33:30 -04:00
Asger F
53dbfcb3aa C++: use in/out barriers with flow state 2023-09-28 11:08:30 +02:00
Moshe Kaplan
f0ca76102c Correct menu title name of "Open Workspace"
Correct menu title name of "Open Workspace" to "Open Workspace from File", as that is the current menu title on VS Code (at least as of 1.76.2)
2023-03-24 15:26:46 -04:00
1753 changed files with 96125 additions and 28473 deletions

View File

@@ -30,6 +30,9 @@ common --registry=https://bcr.bazel.build
common --@rules_dotnet//dotnet/settings:strict_deps=false
# we only configure a nightly toolchain
common --@rules_rust//rust/toolchain/channel=nightly
# Reduce this eventually to empty, once we've fixed all our usages of java, and https://github.com/bazel-contrib/rules_go/issues/4193 is fixed
common --incompatible_autoload_externally="+@rules_java,+@rules_shell"

View File

@@ -20,7 +20,7 @@ jobs:
os: [ubuntu-22.04, macos-13, windows-2022]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
repository: google/ripunzip
ref: ${{ inputs.ripunzip-version }}
@@ -28,7 +28,7 @@ jobs:
# see https://github.com/sfackler/rust-openssl/issues/183
- if: runner.os == 'Linux'
name: checkout openssl
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
repository: openssl/openssl
path: openssl

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Check bazel formatting
uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507
with:

View File

@@ -16,7 +16,7 @@ jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Check that implicit this warnings is enabled for all packs
shell: bash
run: |

View File

@@ -17,7 +17,7 @@ jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Check overlay annotations
run: python config/add-overlay-annotations.py --check java

View File

@@ -18,7 +18,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 2

View File

@@ -19,6 +19,6 @@ jobs:
name: Check query IDs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Check for duplicate query IDs
run: python3 misc/scripts/check-query-ids.py

View File

@@ -37,7 +37,7 @@ jobs:
dotnet-version: 9.0.100
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL

View File

@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest-xl
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
with:

View File

@@ -28,7 +28,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL

View File

@@ -39,7 +39,7 @@ jobs:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Setup dotnet
uses: actions/setup-dotnet@v4
with:
@@ -55,7 +55,7 @@ jobs:
stubgentest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: ./csharp/actions/create-extractor-pack
- name: Run stub generator tests
run: |

View File

@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
- name: Create empty database
@@ -51,7 +51,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
- name: Create empty database

View File

@@ -35,11 +35,11 @@ jobs:
GITHUB_CONTEXT: ${{ toJSON(github.event) }}
run: echo "$GITHUB_CONTEXT"
- name: Clone self (github/codeql) - MERGE
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
path: merge
- name: Clone self (github/codeql) - BASE
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
fetch-depth: 2
path: base

View File

@@ -24,7 +24,7 @@ jobs:
GITHUB_CONTEXT: ${{ toJSON(github.event) }}
run: echo "$GITHUB_CONTEXT"
- name: Clone self (github/codeql)
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Set up Python 3.8
uses: actions/setup-python@v4
with:

View File

@@ -12,11 +12,11 @@ jobs:
steps:
- name: Clone self (github/codeql)
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
path: script
- name: Clone self (github/codeql) for analysis
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
path: codeqlModels
fetch-depth: 0

View File

@@ -21,7 +21,7 @@ jobs:
GITHUB_CONTEXT: ${{ toJSON(github.event) }}
run: echo "$GITHUB_CONTEXT"
- name: Clone self (github/codeql)
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
path: ql
fetch-depth: 0

View File

@@ -16,11 +16,11 @@ jobs:
steps:
- name: Clone self (github/codeql)
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
path: script
- name: Clone self (github/codeql) for analysis
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
path: codeqlModels
ref: ${{ github.event.inputs.qlModelShaOverride || github.ref }}

View File

@@ -26,7 +26,7 @@ jobs:
exit 1
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Git config
shell: bash

View File

@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest-xl
steps:
- name: Check out code
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Run tests
uses: ./go/actions/test
with:

View File

@@ -20,7 +20,7 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- run: |
bazel query //java/kotlin-extractor/...
# only build the default version as a quick check that we can build from `codeql`

View File

@@ -28,12 +28,12 @@ jobs:
slug: ${{fromJson(github.event.inputs.projects || '["apache/commons-codec", "apache/commons-io", "apache/commons-beanutils", "apache/commons-logging", "apache/commons-fileupload", "apache/commons-lang", "apache/commons-validator", "apache/commons-csv", "apache/dubbo"]' )}}
steps:
- name: Clone github/codeql from PR
uses: actions/checkout@v4
uses: actions/checkout@v5
if: github.event.pull_request
with:
path: codeql-pr
- name: Clone github/codeql from main
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
path: codeql-main
ref: main

View File

@@ -30,11 +30,11 @@ jobs:
ref: "placeholder"
steps:
- name: Clone self (github/codeql)
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup CodeQL binaries
uses: ./.github/actions/fetch-codeql
- name: Clone repositories
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
path: repos/${{ matrix.ref }}
ref: ${{ matrix.ref }}

View File

@@ -21,7 +21,7 @@ jobs:
check-python-tooling:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: '3.12'

View File

@@ -43,7 +43,7 @@ jobs:
if-no-files-found: error
retention-days: 1
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 2
persist-credentials: false

View File

@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest-xl
steps:
### Build the queries ###
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Find codeql

View File

@@ -25,7 +25,7 @@ jobs:
- github/codeql
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Find codeql
id: find-codeql
@@ -46,7 +46,7 @@ jobs:
env:
CODEQL: ${{ steps.find-codeql.outputs.codeql-path }}
- name: Checkout ${{ matrix.repo }}
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
repository: ${{ matrix.repo }}
path: ${{ github.workspace }}/repo
@@ -75,7 +75,7 @@ jobs:
runs-on: ubuntu-latest
needs: measure
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/download-artifact@v4
with:
name: measurements

View File

@@ -24,7 +24,7 @@ jobs:
qltest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Find codeql
id: find-codeql
uses: github/codeql-action/init@main
@@ -64,7 +64,7 @@ jobs:
needs: [qltest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Install GNU tar
if: runner.os == 'macOS'
run: |

View File

@@ -23,7 +23,7 @@ jobs:
steps:
- name: Clone self (github/codeql)
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
path: codeql
- name: Set up Python 3.8

View File

@@ -47,7 +47,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Install GNU tar
if: runner.os == 'macOS'
run: |
@@ -113,7 +113,7 @@ jobs:
if: github.repository_owner == 'github'
runs-on: ubuntu-latest-xl
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Fetch CodeQL
uses: ./.github/actions/fetch-codeql
- name: Cache compilation cache
@@ -146,7 +146,7 @@ jobs:
runs-on: ubuntu-latest
needs: [build, compile-queries]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/download-artifact@v4
with:
name: ruby.dbscheme
@@ -209,7 +209,7 @@ jobs:
runs-on: ${{ matrix.os }}
needs: [package]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Fetch CodeQL
uses: ./.github/actions/fetch-codeql

View File

@@ -30,14 +30,14 @@ jobs:
repo: [rails/rails, discourse/discourse, spree/spree, ruby/ruby]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- uses: ./ruby/actions/create-extractor-pack
- name: Checkout ${{ matrix.repo }}
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
repository: ${{ matrix.repo }}
path: ${{ github.workspace }}/repo
@@ -62,7 +62,7 @@ jobs:
runs-on: ubuntu-latest
needs: measure
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/download-artifact@v4
with:
path: stats

View File

@@ -25,7 +25,7 @@ jobs:
strategy:
fail-fast: false
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- uses: ./ruby/actions/create-extractor-pack
- name: Cache compilation cache

View File

@@ -36,7 +36,7 @@ jobs:
qlupgrade:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- name: Check DB upgrade scripts
run: |
@@ -58,7 +58,7 @@ jobs:
strategy:
fail-fast: false
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- uses: ./ruby/actions/create-extractor-pack
- name: Cache compilation cache

View File

@@ -35,7 +35,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Query latest nightly CodeQL bundle
shell: bash

View File

@@ -30,7 +30,7 @@ jobs:
working-directory: rust/ast-generator
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Inject sources
shell: bash
run: |
@@ -53,7 +53,7 @@ jobs:
working-directory: rust/extractor
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Format
shell: bash
run: |
@@ -69,7 +69,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Install CodeQL
uses: ./.github/actions/fetch-codeql
- name: Code generation

View File

@@ -36,7 +36,7 @@ jobs:
fail-fast: false
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Setup (Linux)
if: runner.os == 'Linux'
run: |
@@ -53,7 +53,7 @@ jobs:
clang-format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507
name: Check that python code is properly formatted
with:
@@ -61,7 +61,7 @@ jobs:
codegen:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507
name: Check that QL generated code was checked in
@@ -77,6 +77,6 @@ jobs:
check-no-override:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Check that no override is present in load.bzl
run: bazel test ... --test_tag_filters=override --test_output=errors

View File

@@ -17,7 +17,7 @@ jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Check synchronized files
run: python config/sync-files.py
- name: Check dbscheme fragments

View File

@@ -30,7 +30,7 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Check formatting
run: cargo fmt -- --check
- name: Run tests
@@ -38,12 +38,12 @@ jobs:
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Check formatting
run: cargo fmt --check
clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Run clippy
run: cargo clippy -- --no-deps -D warnings -A clippy::new_without_default -A clippy::too_many_arguments

View File

@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql

View File

@@ -18,6 +18,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- run: |
bazel test //misc/bazel/internal/zipmerge:test --test_output=all

770
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -14,8 +14,8 @@ local_path_override(
# see https://registry.bazel.build/ for a list of available packages
bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "rules_go", version = "0.50.1")
bazel_dep(name = "platforms", version = "1.0.0")
bazel_dep(name = "rules_go", version = "0.56.1")
bazel_dep(name = "rules_pkg", version = "1.0.1")
bazel_dep(name = "rules_nodejs", version = "6.2.0-codeql.1")
bazel_dep(name = "rules_python", version = "0.40.0")
@@ -28,7 +28,7 @@ bazel_dep(name = "rules_kotlin", version = "2.1.3-codeql.1")
bazel_dep(name = "gazelle", version = "0.40.0")
bazel_dep(name = "rules_dotnet", version = "0.17.4")
bazel_dep(name = "googletest", version = "1.14.0.bcr.1")
bazel_dep(name = "rules_rust", version = "0.58.0")
bazel_dep(name = "rules_rust", version = "0.63.0")
bazel_dep(name = "zstd", version = "1.5.5.bcr.1")
bazel_dep(name = "buildifier_prebuilt", version = "6.4.0", dev_dependency = True)
@@ -38,7 +38,10 @@ bazel_dep(name = "buildifier_prebuilt", version = "6.4.0", dev_dependency = True
RUST_EDITION = "2024"
# run buildutils-internal/scripts/fill-rust-sha256s.py when updating (internal repo)
RUST_VERSION = "1.86.0"
# a nightly toolchain is required to enable experimental_use_cc_common_link, which we require internally
# we prefer to run the same version as internally, even if experimental_use_cc_common_link is not really
# required in this repo
RUST_VERSION = "nightly/2025-08-01"
rust = use_extension("@rules_rust//rust:extensions.bzl", "rust")
rust.toolchain(
@@ -50,26 +53,26 @@ rust.toolchain(
],
# generated by buildutils-internal/scripts/fill-rust-sha256s.py (internal repo)
sha256s = {
"rustc-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "4438b809ce4a083af31ed17aeeedcc8fc60ccffc0625bef1926620751b6989d7",
"rustc-1.86.0-x86_64-apple-darwin.tar.xz": "42b76253626febb7912541a30d3379f463dec89581aad4cb72c6c04fb5a71dc5",
"rustc-1.86.0-aarch64-apple-darwin.tar.xz": "23b8f52102249a47ab5bc859d54c9a3cb588a3259ba3f00f557d50edeca4fde9",
"rustc-1.86.0-x86_64-pc-windows-msvc.tar.xz": "fdde839fea274529a31e51eb85c6df1782cc8479c9d1bc24e2914d66a0de41ab",
"clippy-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "02aaff2c1407d2da8dba19aa4970dd873e311902b120a66cbcdbe51eb8836edf",
"clippy-1.86.0-x86_64-apple-darwin.tar.xz": "bb85efda7bbffaf124867f5ca36d50932b1e8f533c62ee923438afb32ff8fe9a",
"clippy-1.86.0-aarch64-apple-darwin.tar.xz": "239fa3a604b124f0312f2af08537874a1227dba63385484b468cca62e7c4f2f2",
"clippy-1.86.0-x86_64-pc-windows-msvc.tar.xz": "d00498f47d49219f032e2c5eeebdfc3d32317c0dc3d3fd7125327445bc482cb4",
"cargo-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "c5c1590f7e9246ad9f4f97cfe26ffa92707b52a769726596a9ef81565ebd908b",
"cargo-1.86.0-x86_64-apple-darwin.tar.xz": "af163eb02d1a178044d1b4f2375960efd47130f795f6e33d09e345454bb26f4e",
"cargo-1.86.0-aarch64-apple-darwin.tar.xz": "3cb13873d48c3e1e4cc684d42c245226a11fba52af6b047c3346ed654e7a05c0",
"cargo-1.86.0-x86_64-pc-windows-msvc.tar.xz": "e57a9d89619b5604899bac443e68927bdd371e40f2e03e18950b6ceb3eb67966",
"llvm-tools-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "282145ab7a63c98b625856f44b905b4dc726b497246b824632a5790debe95a78",
"llvm-tools-1.86.0-x86_64-apple-darwin.tar.xz": "b55706e92f7da989207c50c13c7add483a9fedd233bc431b106eca2a8f151ec9",
"llvm-tools-1.86.0-aarch64-apple-darwin.tar.xz": "04d3618c686845853585f036e3211eb9e18f2d290f4610a7a78bdc1fcce1ebd9",
"llvm-tools-1.86.0-x86_64-pc-windows-msvc.tar.xz": "721a17cc8dc219177e4277a3592253934ef08daa1e1b12eda669a67d15fad8dd",
"rust-std-1.86.0-x86_64-unknown-linux-gnu.tar.xz": "67be7184ea388d8ce0feaf7fdea46f1775cfc2970930264343b3089898501d37",
"rust-std-1.86.0-x86_64-apple-darwin.tar.xz": "3b1140d54870a080080e84700143f4a342fbd02a410a319b05d9c02e7dcf44cc",
"rust-std-1.86.0-aarch64-apple-darwin.tar.xz": "0fb121fb3b8fa9027d79ff598500a7e5cd086ddbc3557482ed3fdda00832c61b",
"rust-std-1.86.0-x86_64-pc-windows-msvc.tar.xz": "3d5354b7b9cb950b58bff3fce18a652aa374bb30c8f70caebd3bd0b43cb41a33",
"2025-08-01/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz": "9bbeaf5d3fc7247d31463a9083aa251c995cc50662c8219e7a2254d76a72a9a4",
"2025-08-01/rustc-nightly-x86_64-apple-darwin.tar.xz": "c9ea539a8eff0d5d162701f99f9e1aabe14dd0dfb420d62362817a5d09219de7",
"2025-08-01/rustc-nightly-aarch64-apple-darwin.tar.xz": "ae83feebbc39cfd982e4ecc8297731fe79c185173aee138467b334c5404b3773",
"2025-08-01/rustc-nightly-x86_64-pc-windows-msvc.tar.xz": "9f170c30d802a349be60cf52ec46260802093cb1013ad667fc0d528b7b10152f",
"2025-08-01/clippy-nightly-x86_64-unknown-linux-gnu.tar.xz": "9ae5f3cd8f557c4f6df522597c69d14398cf604cfaed2b83e767c4b77a7eaaf6",
"2025-08-01/clippy-nightly-x86_64-apple-darwin.tar.xz": "983cb9ee0b6b968188e04ab2d33743d54764b2681ce565e1b3f2b9135c696a3e",
"2025-08-01/clippy-nightly-aarch64-apple-darwin.tar.xz": "ed2219dbc49d088225e1b7c5c4390fa295066e071fddaa2714018f6bb39ddbf0",
"2025-08-01/clippy-nightly-x86_64-pc-windows-msvc.tar.xz": "911f40ab5cbdd686f40e00965271fe47c4805513a308ed01f30eafb25b448a50",
"2025-08-01/cargo-nightly-x86_64-unknown-linux-gnu.tar.xz": "106463c284e48e4904c717471eeec2be5cc83a9d2cae8d6e948b52438cad2e69",
"2025-08-01/cargo-nightly-x86_64-apple-darwin.tar.xz": "6ad35c40efc41a8c531ea43235058347b6902d98a9693bf0aed7fc16d5590cef",
"2025-08-01/cargo-nightly-aarch64-apple-darwin.tar.xz": "dd28c365e9d298abc3154c797720ad36a0058f131265c9978b4c8e4e37012c8a",
"2025-08-01/cargo-nightly-x86_64-pc-windows-msvc.tar.xz": "7b431286e12d6b3834b038f078389a00cac73f351e8c3152b2504a3c06420b3b",
"2025-08-01/llvm-tools-nightly-x86_64-unknown-linux-gnu.tar.xz": "e342e305d7927cc288d386983b2bc253cfad3776b113386e903d0b302648ef47",
"2025-08-01/llvm-tools-nightly-x86_64-apple-darwin.tar.xz": "e44dd3506524d85c37b3a54bcc91d01378fd2c590b2db5c5974d12f05c1b84d1",
"2025-08-01/llvm-tools-nightly-aarch64-apple-darwin.tar.xz": "0c1b5f46dd81be4a9227b10283a0fcaa39c14fea7e81aea6fd6d9887ff6cdc41",
"2025-08-01/llvm-tools-nightly-x86_64-pc-windows-msvc.tar.xz": "423e5fd11406adccbc31b8456ceb7375ce055cdf45e90d2c3babeb2d7f58383f",
"2025-08-01/rust-std-nightly-x86_64-unknown-linux-gnu.tar.xz": "3c0ceb46a252647a1d4c7116d9ccae684fa5e42aaf3296419febd2c962c3b41d",
"2025-08-01/rust-std-nightly-x86_64-apple-darwin.tar.xz": "3be416003cab10f767390a753d1d16ae4d26c7421c03c98992cf1943e5b0efe8",
"2025-08-01/rust-std-nightly-aarch64-apple-darwin.tar.xz": "4046ac0ef951cb056b5028a399124f60999fa37792eab69d008d8d7965f389b4",
"2025-08-01/rust-std-nightly-x86_64-pc-windows-msvc.tar.xz": "191ed9d8603c3a4fe5a7bbbc2feb72049078dae2df3d3b7d5dedf3abbf823e6e",
},
versions = [RUST_VERSION],
)
@@ -95,49 +98,49 @@ use_repo(
tree_sitter_extractors_deps = use_extension("//misc/bazel/3rdparty:tree_sitter_extractors_extension.bzl", "r")
use_repo(
tree_sitter_extractors_deps,
"vendor_ts__anyhow-1.0.98",
"vendor_ts__anyhow-1.0.99",
"vendor_ts__argfile-0.2.1",
"vendor_ts__chalk-ir-0.103.0",
"vendor_ts__chalk-ir-0.104.0",
"vendor_ts__chrono-0.4.41",
"vendor_ts__clap-4.5.40",
"vendor_ts__clap-4.5.44",
"vendor_ts__dunce-1.0.5",
"vendor_ts__either-1.15.0",
"vendor_ts__encoding-0.2.33",
"vendor_ts__figment-0.10.19",
"vendor_ts__flate2-1.1.0",
"vendor_ts__glob-0.3.2",
"vendor_ts__glob-0.3.3",
"vendor_ts__globset-0.4.15",
"vendor_ts__itertools-0.14.0",
"vendor_ts__lazy_static-1.5.0",
"vendor_ts__mustache-0.9.0",
"vendor_ts__num-traits-0.2.19",
"vendor_ts__num_cpus-1.17.0",
"vendor_ts__proc-macro2-1.0.95",
"vendor_ts__proc-macro2-1.0.97",
"vendor_ts__quote-1.0.40",
"vendor_ts__ra_ap_base_db-0.0.288",
"vendor_ts__ra_ap_cfg-0.0.288",
"vendor_ts__ra_ap_hir-0.0.288",
"vendor_ts__ra_ap_hir_def-0.0.288",
"vendor_ts__ra_ap_hir_expand-0.0.288",
"vendor_ts__ra_ap_hir_ty-0.0.288",
"vendor_ts__ra_ap_ide_db-0.0.288",
"vendor_ts__ra_ap_intern-0.0.288",
"vendor_ts__ra_ap_load-cargo-0.0.288",
"vendor_ts__ra_ap_parser-0.0.288",
"vendor_ts__ra_ap_paths-0.0.288",
"vendor_ts__ra_ap_project_model-0.0.288",
"vendor_ts__ra_ap_span-0.0.288",
"vendor_ts__ra_ap_stdx-0.0.288",
"vendor_ts__ra_ap_syntax-0.0.288",
"vendor_ts__ra_ap_vfs-0.0.288",
"vendor_ts__rand-0.9.1",
"vendor_ts__ra_ap_base_db-0.0.300",
"vendor_ts__ra_ap_cfg-0.0.300",
"vendor_ts__ra_ap_hir-0.0.300",
"vendor_ts__ra_ap_hir_def-0.0.300",
"vendor_ts__ra_ap_hir_expand-0.0.300",
"vendor_ts__ra_ap_hir_ty-0.0.300",
"vendor_ts__ra_ap_ide_db-0.0.300",
"vendor_ts__ra_ap_intern-0.0.300",
"vendor_ts__ra_ap_load-cargo-0.0.300",
"vendor_ts__ra_ap_parser-0.0.300",
"vendor_ts__ra_ap_paths-0.0.300",
"vendor_ts__ra_ap_project_model-0.0.300",
"vendor_ts__ra_ap_span-0.0.300",
"vendor_ts__ra_ap_stdx-0.0.300",
"vendor_ts__ra_ap_syntax-0.0.300",
"vendor_ts__ra_ap_vfs-0.0.300",
"vendor_ts__rand-0.9.2",
"vendor_ts__rayon-1.10.0",
"vendor_ts__regex-1.11.1",
"vendor_ts__serde-1.0.219",
"vendor_ts__serde_json-1.0.140",
"vendor_ts__serde_with-3.13.0",
"vendor_ts__syn-2.0.103",
"vendor_ts__toml-0.8.23",
"vendor_ts__serde_json-1.0.142",
"vendor_ts__serde_with-3.14.0",
"vendor_ts__syn-2.0.104",
"vendor_ts__toml-0.9.5",
"vendor_ts__tracing-0.1.41",
"vendor_ts__tracing-flame-0.2.0",
"vendor_ts__tracing-subscriber-0.3.19",
@@ -230,6 +233,7 @@ use_repo(
"kotlin-compiler-2.1.0-Beta1",
"kotlin-compiler-2.1.20-Beta1",
"kotlin-compiler-2.2.0-Beta1",
"kotlin-compiler-2.2.20-Beta2",
"kotlin-compiler-embeddable-1.6.0",
"kotlin-compiler-embeddable-1.6.20",
"kotlin-compiler-embeddable-1.7.0",
@@ -242,6 +246,7 @@ use_repo(
"kotlin-compiler-embeddable-2.1.0-Beta1",
"kotlin-compiler-embeddable-2.1.20-Beta1",
"kotlin-compiler-embeddable-2.2.0-Beta1",
"kotlin-compiler-embeddable-2.2.20-Beta2",
"kotlin-stdlib-1.6.0",
"kotlin-stdlib-1.6.20",
"kotlin-stdlib-1.7.0",
@@ -254,10 +259,11 @@ use_repo(
"kotlin-stdlib-2.1.0-Beta1",
"kotlin-stdlib-2.1.20-Beta1",
"kotlin-stdlib-2.2.0-Beta1",
"kotlin-stdlib-2.2.20-Beta2",
)
go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk")
go_sdk.download(version = "1.24.0")
go_sdk.download(version = "1.25.0")
go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//go/extractor:go.mod")

View File

@@ -6,6 +6,8 @@ column_kind: "utf16"
unicode_newlines: true
build_modes:
- none
default_queries:
- codeql/actions-queries
file_coverage_languages: []
github_api_languages: []
scc_languages: []

View File

@@ -1,3 +1,15 @@
## 0.4.16
No user-facing changes.
## 0.4.15
No user-facing changes.
## 0.4.14
No user-facing changes.
## 0.4.13
### Bug Fixes

View File

@@ -0,0 +1,3 @@
## 0.4.14
No user-facing changes.

View File

@@ -0,0 +1,3 @@
## 0.4.15
No user-facing changes.

View File

@@ -0,0 +1,3 @@
## 0.4.16
No user-facing changes.

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 0.4.13
lastReleaseVersion: 0.4.16

View File

@@ -1,6 +1,7 @@
private import actions
private import codeql.actions.TaintTracking
private import codeql.actions.dataflow.ExternalFlow
private import codeql.actions.security.ControlChecks
import codeql.actions.dataflow.FlowSources
import codeql.actions.DataFlow
@@ -65,6 +66,16 @@ class ArgumentInjectionFromMaDSink extends ArgumentInjectionSink {
override string getCommand() { result = "unknown" }
}
/**
* Gets the event that is relevant for the given node in the context of argument injection.
*
* This is used to highlight the event in the query results when an alert is raised.
*/
Event getRelevantEventInPrivilegedContext(DataFlow::Node node) {
inPrivilegedContext(node.asExpr(), result) and
not exists(ControlCheck check | check.protects(node.asExpr(), result, "argument-injection"))
}
/**
* A taint-tracking configuration for unsafe user input
* that is used to construct and evaluate a code script.
@@ -88,6 +99,16 @@ private module ArgumentInjectionConfig implements DataFlow::ConfigSig {
run.getScript().getAnEnvReachingArgumentInjectionSink(var, _, _)
)
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or
result = getRelevantEventInPrivilegedContext(sink).getLocation()
}
}
/** Tracks flow of unsafe user input that is used to construct and evaluate a code script. */

View File

@@ -4,6 +4,7 @@ import codeql.actions.DataFlow
import codeql.actions.dataflow.FlowSources
import codeql.actions.security.PoisonableSteps
import codeql.actions.security.UntrustedCheckoutQuery
import codeql.actions.security.ControlChecks
string unzipRegexp() { result = "(unzip|tar)\\s+.*" }
@@ -292,6 +293,16 @@ class ArtifactPoisoningSink extends DataFlow::Node {
string getPath() { result = download.getPath() }
}
/**
* Gets the event that is relevant for the given node in the context of artifact poisoning.
*
* This is used to highlight the event in the query results when an alert is raised.
*/
Event getRelevantEventInPrivilegedContext(DataFlow::Node node) {
inPrivilegedContext(node.asExpr(), result) and
not exists(ControlCheck check | check.protects(node.asExpr(), result, "artifact-poisoning"))
}
/**
* A taint-tracking configuration for unsafe artifacts
* that is used may lead to artifact poisoning
@@ -318,6 +329,16 @@ private module ArtifactPoisoningConfig implements DataFlow::ConfigSig {
exists(run.getScript().getAFileReadCommand())
)
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or
result = getRelevantEventInPrivilegedContext(sink).getLocation()
}
}
/** Tracks flow of unsafe artifacts that is used in an insecure way. */

View File

@@ -3,6 +3,8 @@ private import codeql.actions.TaintTracking
private import codeql.actions.dataflow.ExternalFlow
import codeql.actions.dataflow.FlowSources
import codeql.actions.DataFlow
import codeql.actions.security.ControlChecks
import codeql.actions.security.CachePoisoningQuery
class CodeInjectionSink extends DataFlow::Node {
CodeInjectionSink() {
@@ -11,6 +13,46 @@ class CodeInjectionSink extends DataFlow::Node {
}
}
/**
* Get the relevant event for the sink in CodeInjectionCritical.ql.
*/
Event getRelevantCriticalEventForSink(DataFlow::Node sink) {
inPrivilegedContext(sink.asExpr(), result) and
not exists(ControlCheck check | check.protects(sink.asExpr(), result, "code-injection")) and
// exclude cases where the sink is a JS script and the expression uses toJson
not exists(UsesStep script |
script.getCallee() = "actions/github-script" and
script.getArgumentExpr("script") = sink.asExpr() and
exists(getAToJsonReferenceExpression(sink.asExpr().(Expression).getExpression(), _))
)
}
/**
* Get the relevant event for the sink in CachePoisoningViaCodeInjection.ql.
*/
Event getRelevantCachePoisoningEventForSink(DataFlow::Node sink) {
exists(LocalJob job |
job = sink.asExpr().getEnclosingJob() and
job.getATriggerEvent() = result and
// job can be triggered by an external user
result.isExternallyTriggerable() and
// excluding privileged workflows since they can be exploited in easier circumstances
// which is covered by `actions/code-injection/critical`
not job.isPrivilegedExternallyTriggerable(result) and
(
// the workflow runs in the context of the default branch
runsOnDefaultBranch(result)
or
// the workflow caller runs in the context of the default branch
result.getName() = "workflow_call" and
exists(ExternalJob caller |
caller.getCallee() = job.getLocation().getFile().getRelativePath() and
runsOnDefaultBranch(caller.getATriggerEvent())
)
)
)
}
/**
* A taint-tracking configuration for unsafe user input
* that is used to construct and evaluate a code script.
@@ -35,6 +77,18 @@ private module CodeInjectionConfig implements DataFlow::ConfigSig {
exists(run.getScript().getAFileReadCommand())
)
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or
result = getRelevantCriticalEventForSink(sink).getLocation()
or
result = getRelevantCachePoisoningEventForSink(sink).getLocation()
}
}
/** Tracks flow of unsafe user input that is used to construct and evaluate a code script. */

View File

@@ -3,11 +3,20 @@ private import codeql.actions.TaintTracking
private import codeql.actions.dataflow.ExternalFlow
import codeql.actions.dataflow.FlowSources
import codeql.actions.DataFlow
import codeql.actions.security.ControlChecks
private class CommandInjectionSink extends DataFlow::Node {
CommandInjectionSink() { madSink(this, "command-injection") }
}
/** Get the relevant event for the sink in CommandInjectionCritical.ql. */
Event getRelevantEventInPrivilegedContext(DataFlow::Node sink) {
inPrivilegedContext(sink.asExpr(), result) and
not exists(ControlCheck check |
check.protects(sink.asExpr(), result, ["command-injection", "code-injection"])
)
}
/**
* A taint-tracking configuration for unsafe user input
* that is used to construct and evaluate a system command.
@@ -16,6 +25,16 @@ private module CommandInjectionConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
predicate isSink(DataFlow::Node sink) { sink instanceof CommandInjectionSink }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or
result = getRelevantEventInPrivilegedContext(sink).getLocation()
}
}
/** Tracks flow of unsafe user input that is used to construct and evaluate a system command. */

View File

@@ -72,6 +72,25 @@ class EnvPathInjectionFromMaDSink extends EnvPathInjectionSink {
EnvPathInjectionFromMaDSink() { madSink(this, "envpath-injection") }
}
/**
* Get the relevant event for a sink in EnvPathInjectionCritical.ql where the source type is "artifact".
*/
Event getRelevantArtifactEventInPrivilegedContext(DataFlow::Node sink) {
inPrivilegedContext(sink.asExpr(), result) and
not exists(ControlCheck check |
check.protects(sink.asExpr(), result, ["untrusted-checkout", "artifact-poisoning"])
) and
sink instanceof EnvPathInjectionFromFileReadSink
}
/**
* Get the relevant event for a sink in EnvPathInjectionCritical.ql where the source type is not "artifact".
*/
Event getRelevantNonArtifactEventInPrivilegedContext(DataFlow::Node sink) {
inPrivilegedContext(sink.asExpr(), result) and
not exists(ControlCheck check | check.protects(sink.asExpr(), result, "code-injection"))
}
/**
* A taint-tracking configuration for unsafe user input
* that is used to construct and evaluate an environment variable.
@@ -108,6 +127,18 @@ private module EnvPathInjectionConfig implements DataFlow::ConfigSig {
exists(run.getScript().getAFileReadCommand())
)
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or
result = getRelevantArtifactEventInPrivilegedContext(sink).getLocation()
or
result = getRelevantNonArtifactEventInPrivilegedContext(sink).getLocation()
}
}
/** Tracks flow of unsafe user input that is used to construct and evaluate the PATH environment variable. */

View File

@@ -126,6 +126,32 @@ class EnvVarInjectionFromMaDSink extends EnvVarInjectionSink {
EnvVarInjectionFromMaDSink() { madSink(this, "envvar-injection") }
}
/**
* Get the relevant event for a sink in EnvVarInjectionCritical.ql where the source type is "artifact".
*/
Event getRelevantArtifactEventInPrivilegedContext(DataFlow::Node sink) {
inPrivilegedContext(sink.asExpr(), result) and
not exists(ControlCheck check |
check
.protects(sink.asExpr(), result,
["envvar-injection", "untrusted-checkout", "artifact-poisoning"])
) and
(
sink instanceof EnvVarInjectionFromFileReadSink or
madSink(sink, "envvar-injection")
)
}
/**
* Get the relevant event for a sink in EnvVarInjectionCritical.ql where the source type is not "artifact".
*/
Event getRelevantNonArtifactEventInPrivilegedContext(DataFlow::Node sink) {
inPrivilegedContext(sink.asExpr(), result) and
not exists(ControlCheck check |
check.protects(sink.asExpr(), result, ["envvar-injection", "code-injection"])
)
}
/**
* A taint-tracking configuration for unsafe user input
* that is used to construct and evaluate an environment variable.
@@ -163,6 +189,18 @@ private module EnvVarInjectionConfig implements DataFlow::ConfigSig {
exists(run.getScript().getAFileReadCommand())
)
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or
result = getRelevantArtifactEventInPrivilegedContext(sink).getLocation()
or
result = getRelevantNonArtifactEventInPrivilegedContext(sink).getLocation()
}
}
/** Tracks flow of unsafe user input that is used to construct and evaluate an environment variable. */

View File

@@ -1,5 +1,5 @@
name: codeql/actions-all
version: 0.4.13
version: 0.4.16
library: true
warnOnImplicitThis: true
dependencies:

View File

@@ -1,3 +1,15 @@
## 0.6.8
No user-facing changes.
## 0.6.7
No user-facing changes.
## 0.6.6
No user-facing changes.
## 0.6.5
No user-facing changes.

View File

@@ -21,18 +21,12 @@ import codeql.actions.security.ControlChecks
from EnvPathInjectionFlow::PathNode source, EnvPathInjectionFlow::PathNode sink, Event event
where
EnvPathInjectionFlow::flowPath(source, sink) and
inPrivilegedContext(sink.getNode().asExpr(), event) and
(
not source.getNode().(RemoteFlowSource).getSourceType() = "artifact" and
not exists(ControlCheck check |
check.protects(sink.getNode().asExpr(), event, "code-injection")
)
event = getRelevantNonArtifactEventInPrivilegedContext(sink.getNode())
or
source.getNode().(RemoteFlowSource).getSourceType() = "artifact" and
not exists(ControlCheck check |
check.protects(sink.getNode().asExpr(), event, ["untrusted-checkout", "artifact-poisoning"])
) and
sink.getNode() instanceof EnvPathInjectionFromFileReadSink
event = getRelevantArtifactEventInPrivilegedContext(sink.getNode())
)
select sink.getNode(), source, sink,
"Potential PATH environment variable injection in $@, which may be controlled by an external user ($@).",

View File

@@ -22,26 +22,15 @@ import codeql.actions.security.ControlChecks
from EnvVarInjectionFlow::PathNode source, EnvVarInjectionFlow::PathNode sink, Event event
where
EnvVarInjectionFlow::flowPath(source, sink) and
inPrivilegedContext(sink.getNode().asExpr(), event) and
// exclude paths to file read sinks from non-artifact sources
(
// source is text
not source.getNode().(RemoteFlowSource).getSourceType() = "artifact" and
not exists(ControlCheck check |
check.protects(sink.getNode().asExpr(), event, ["envvar-injection", "code-injection"])
)
event = getRelevantNonArtifactEventInPrivilegedContext(sink.getNode())
or
// source is an artifact or a file from an untrusted checkout
source.getNode().(RemoteFlowSource).getSourceType() = "artifact" and
not exists(ControlCheck check |
check
.protects(sink.getNode().asExpr(), event,
["envvar-injection", "untrusted-checkout", "artifact-poisoning"])
) and
(
sink.getNode() instanceof EnvVarInjectionFromFileReadSink or
madSink(sink.getNode(), "envvar-injection")
)
event = getRelevantArtifactEventInPrivilegedContext(sink.getNode())
)
select sink.getNode(), source, sink,
"Potential environment variable injection in $@, which may be controlled by an external user ($@).",

View File

@@ -22,15 +22,8 @@ import codeql.actions.security.ControlChecks
from CodeInjectionFlow::PathNode source, CodeInjectionFlow::PathNode sink, Event event
where
CodeInjectionFlow::flowPath(source, sink) and
inPrivilegedContext(sink.getNode().asExpr(), event) and
source.getNode().(RemoteFlowSource).getEventName() = event.getName() and
not exists(ControlCheck check | check.protects(sink.getNode().asExpr(), event, "code-injection")) and
// exclude cases where the sink is a JS script and the expression uses toJson
not exists(UsesStep script |
script.getCallee() = "actions/github-script" and
script.getArgumentExpr("script") = sink.getNode().asExpr() and
exists(getAToJsonReferenceExpression(sink.getNode().asExpr().(Expression).getExpression(), _))
)
event = getRelevantCriticalEventForSink(sink.getNode()) and
source.getNode().(RemoteFlowSource).getEventName() = event.getName()
select sink.getNode(), source, sink,
"Potential code injection in $@, which may be controlled by an external user ($@).", sink,
sink.getNode().asExpr().(Expression).getRawExpression(), event, event.getName()

View File

@@ -18,30 +18,13 @@ import codeql.actions.security.CachePoisoningQuery
import CodeInjectionFlow::PathGraph
import codeql.actions.security.ControlChecks
from CodeInjectionFlow::PathNode source, CodeInjectionFlow::PathNode sink, LocalJob job, Event event
from CodeInjectionFlow::PathNode source, CodeInjectionFlow::PathNode sink, Event event
where
CodeInjectionFlow::flowPath(source, sink) and
job = sink.getNode().asExpr().getEnclosingJob() and
job.getATriggerEvent() = event and
// job can be triggered by an external user
event.isExternallyTriggerable() and
event = getRelevantCachePoisoningEventForSink(sink.getNode()) and
// the checkout is not controlled by an access check
not exists(ControlCheck check |
check.protects(source.getNode().asExpr(), event, "code-injection")
) and
// excluding privileged workflows since they can be exploited in easier circumstances
// which is covered by `actions/code-injection/critical`
not job.isPrivilegedExternallyTriggerable(event) and
(
// the workflow runs in the context of the default branch
runsOnDefaultBranch(event)
or
// the workflow caller runs in the context of the default branch
event.getName() = "workflow_call" and
exists(ExternalJob caller |
caller.getCallee() = job.getLocation().getFile().getRelativePath() and
runsOnDefaultBranch(caller.getATriggerEvent())
)
)
select sink.getNode(), source, sink,
"Unprivileged code injection in $@, which may lead to cache poisoning ($@).", sink,

View File

@@ -19,10 +19,7 @@ import codeql.actions.security.ControlChecks
from ArtifactPoisoningFlow::PathNode source, ArtifactPoisoningFlow::PathNode sink, Event event
where
ArtifactPoisoningFlow::flowPath(source, sink) and
inPrivilegedContext(sink.getNode().asExpr(), event) and
not exists(ControlCheck check |
check.protects(sink.getNode().asExpr(), event, "artifact-poisoning")
)
event = getRelevantEventInPrivilegedContext(sink.getNode())
select sink.getNode(), source, sink,
"Potential artifact poisoning in $@, which may be controlled by an external user ($@).", sink,
sink.getNode().toString(), event, event.getName()

View File

@@ -1,6 +1,6 @@
## Overview
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed in a privileged job.
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed (e.g., due to a modified build script) in a privileged job.
## Recommendation
@@ -32,7 +32,7 @@ jobs:
- uses: actions/setup-node@v1
- run: |
npm install
npm install # scripts in package.json from PR would be executed here
npm build
- uses: completely/fakeaction@v2

View File

@@ -1,6 +1,6 @@
## Overview
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed in a privileged job.
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed (e.g., due to a modified build script) in a privileged job.
## Recommendation
@@ -32,7 +32,7 @@ jobs:
- uses: actions/setup-node@v1
- run: |
npm install
npm install # scripts in package.json from PR would be executed here
npm build
- uses: completely/fakeaction@v2

View File

@@ -1,6 +1,6 @@
## Overview
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed in a privileged job.
GitHub workflows can be triggered through various repository events, including incoming pull requests (PRs) or comments on Issues/PRs. A potentially dangerous misuse of the triggers such as `pull_request_target` or `issue_comment` followed by an explicit checkout of untrusted code (Pull Request HEAD) may lead to repository compromise if untrusted code gets executed (e.g., due to a modified build script) in a privileged job.
## Recommendation
@@ -32,7 +32,7 @@ jobs:
- uses: actions/setup-node@v1
- run: |
npm install
npm install # scripts in package.json from PR would be executed here
npm build
- uses: completely/fakeaction@v2

View File

@@ -0,0 +1,3 @@
## 0.6.6
No user-facing changes.

View File

@@ -0,0 +1,3 @@
## 0.6.7
No user-facing changes.

View File

@@ -0,0 +1,3 @@
## 0.6.8
No user-facing changes.

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 0.6.5
lastReleaseVersion: 0.6.8

View File

@@ -21,10 +21,7 @@ import codeql.actions.security.ControlChecks
from CommandInjectionFlow::PathNode source, CommandInjectionFlow::PathNode sink, Event event
where
CommandInjectionFlow::flowPath(source, sink) and
inPrivilegedContext(sink.getNode().asExpr(), event) and
not exists(ControlCheck check |
check.protects(sink.getNode().asExpr(), event, ["command-injection", "code-injection"])
)
event = getRelevantEventInPrivilegedContext(sink.getNode())
select sink.getNode(), source, sink,
"Potential command injection in $@, which may be controlled by an external user ($@).", sink,
sink.getNode().asExpr().(Expression).getRawExpression(), event, event.getName()

View File

@@ -20,10 +20,7 @@ import codeql.actions.security.ControlChecks
from ArgumentInjectionFlow::PathNode source, ArgumentInjectionFlow::PathNode sink, Event event
where
ArgumentInjectionFlow::flowPath(source, sink) and
inPrivilegedContext(sink.getNode().asExpr(), event) and
not exists(ControlCheck check |
check.protects(sink.getNode().asExpr(), event, "argument-injection")
)
event = getRelevantEventInPrivilegedContext(sink.getNode())
select sink.getNode(), source, sink,
"Potential argument injection in $@ command, which may be controlled by an external user ($@).",
sink, sink.getNode().(ArgumentInjectionSink).getCommand(), event, event.getName()

View File

@@ -1,5 +1,5 @@
name: codeql/actions-queries
version: 0.6.5
version: 0.6.8
library: false
warnOnImplicitThis: true
groups: [actions, queries]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,4 @@
description: Link PCH creations and uses
compatibility: full
pch_uses.rel: delete
pch_creations.rel: delete

View File

@@ -1,3 +1,32 @@
## 5.5.0
### New Features
* Added a new class `PchFile` representing precompiled header (PCH) files used during project compilation.
### Minor Analysis Improvements
* Added flow summaries for the `Microsoft::WRL::ComPtr` member functions.
* The new dataflow/taint-tracking library (`semmle.code.cpp.dataflow.new.DataFlow` and `semmle.code.cpp.dataflow.new.TaintTracking`) now resolves virtual function calls more precisely. This results in fewer false positives when running dataflow/taint-tracking queries on C++ projects.
## 5.4.1
### Minor Analysis Improvements
* The guards libraries (`semmle.code.cpp.controlflow.Guards` and `semmle.code.cpp.controlflow.IRGuards`) have been improved to recognize more guards.
* Improved dataflow through global variables in the new dataflow library (`semmle.code.cpp.dataflow.new.DataFlow` and `semmle.code.cpp.dataflow.new.TaintTracking`). Queries based on these libraries will produce more results on codebases with many global variables.
* The global value numbering library (`semmle.code.cpp.valuenumbering.GlobalValueNumbering` and `semmle.code.cpp.ir.ValueNumbering`) has been improved so more expressions are assigned the same value number.
## 5.4.0
### New Features
* Exposed various SSA-related classes (`Definition`, `PhiNode`, `ExplicitDefinition`, `DirectExplicitDefinition`, and `IndirectExplicitDefinition`) which were previously only usable inside the internal dataflow directory.
### Minor Analysis Improvements
* The `cpp/overrun-write` query now recognizes more bound checks and thus produces fewer false positives.
## 5.3.0
### Deprecated APIs

View File

@@ -0,0 +1,11 @@
/**
* Contains customizations to the standard library.
*
* This module is imported by `cpp.qll`, so any customizations defined here automatically
* apply to all queries.
*
* Typical examples of customizations include adding new subclasses of abstract classes such as
* the `RemoteFlowSource` class to model frameworks that are not covered by the standard library.
*/
import cpp

View File

@@ -0,0 +1,9 @@
## 5.4.0
### New Features
* Exposed various SSA-related classes (`Definition`, `PhiNode`, `ExplicitDefinition`, `DirectExplicitDefinition`, and `IndirectExplicitDefinition`) which were previously only usable inside the internal dataflow directory.
### Minor Analysis Improvements
* The `cpp/overrun-write` query now recognizes more bound checks and thus produces fewer false positives.

View File

@@ -0,0 +1,7 @@
## 5.4.1
### Minor Analysis Improvements
* The guards libraries (`semmle.code.cpp.controlflow.Guards` and `semmle.code.cpp.controlflow.IRGuards`) have been improved to recognize more guards.
* Improved dataflow through global variables in the new dataflow library (`semmle.code.cpp.dataflow.new.DataFlow` and `semmle.code.cpp.dataflow.new.TaintTracking`). Queries based on these libraries will produce more results on codebases with many global variables.
* The global value numbering library (`semmle.code.cpp.valuenumbering.GlobalValueNumbering` and `semmle.code.cpp.ir.ValueNumbering`) has been improved so more expressions are assigned the same value number.

View File

@@ -0,0 +1,10 @@
## 5.5.0
### New Features
* Added a new class `PchFile` representing precompiled header (PCH) files used during project compilation.
### Minor Analysis Improvements
* Added flow summaries for the `Microsoft::WRL::ComPtr` member functions.
* The new dataflow/taint-tracking library (`semmle.code.cpp.dataflow.new.DataFlow` and `semmle.code.cpp.dataflow.new.TaintTracking`) now resolves virtual function calls more precisely. This results in fewer false positives when running dataflow/taint-tracking queries on C++ projects.

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 5.3.0
lastReleaseVersion: 5.5.0

View File

@@ -13,7 +13,9 @@
* https://github.com/cplusplus/draft/raw/master/papers/n4140.pdf
*/
import Customizations
import semmle.code.cpp.File
import semmle.code.cpp.PchFile
import semmle.code.cpp.Linkage
import semmle.code.cpp.Location
import semmle.code.cpp.Compilation

View File

@@ -0,0 +1,31 @@
extensions:
- addsTo:
pack: codeql/cpp-all
extensible: summaryModel
data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance
- ["Microsoft::WRL", "ComPtr", True, "ComPtr<T>", "(T *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "ComPtr", "(const ComPtr &)", "", "Argument[*0].Element[@]", "Argument[-1].Element[@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "ComPtr", "(ComPtr &&)", "", "Argument[*0].Element[@]", "Argument[-1].Element[@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "As", "", "", "Argument[-1]", "Argument[*0]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "AsIID", "", "", "Argument[-1]", "Argument[*1]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "AsWeak", "", "", "Argument[-1]", "Argument[*0]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "Attach", "", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr<T>", True, "CopyTo", "(T **)", "", "Argument[-1].Element[@]", "Argument[**@0]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "CopyTo<T>", "(T **)", "", "Argument[-1].Element[@]", "Argument[**@0]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "CopyTo", "(REFIID,void **)", "", "Argument[-1].Element[@]", "Argument[**@1]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "Detach", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "Get", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "GetAddressOf", "", "", "Argument[-1].Element[@]", "ReturnValue[**@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "ReleaseAndGetAddressOf", "", "", "Argument[-1].Element[@]", "ReturnValue[**@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "Swap", "", "", "Argument[-1]", "Argument[*0]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "Swap", "", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "operator&", "", "", "Argument[-1]", "ReturnValue.Element", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "operator->", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr<T>", True, "operator=", "(T *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr<T>", True, "operator=", "(T *)", "", "Argument[*@0]", "ReturnValue[*].Element[@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "operator=<U>", "(U *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "operator=<U>", "(U *)", "", "Argument[*@0]", "ReturnValue[*].Element[@]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "operator=", "(const ComPtr &)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "operator=", "(const ComPtr &)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "operator=", "(ComPtr &&)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
- ["Microsoft::WRL", "ComPtr", True, "operator=", "(ComPtr &&)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]

View File

@@ -0,0 +1,12 @@
extensions:
- addsTo:
pack: codeql/cpp-all
extensible: summaryModel
data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance
- ["Microsoft::WRL::Details", "ComPtrRef", True, "ComPtrRef", "", "", "Argument[*0]", "Argument[-1].Element[@]", "value", "manual"]
- ["Microsoft::WRL::Details", "ComPtrRef", True, "GetAddressOf", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
# TODO: We cannot yet model https://learn.microsoft.com/en-us/cpp/cppcx/wrl/comptrref-class?view=msvc-170#operator-interfacetype-star-star
- ["Microsoft::WRL::Details", "ComPtrRef", True, "operator*", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
# TODO: We cannot yet model https://learn.microsoft.com/en-us/cpp/cppcx/wrl/comptrref-class?view=msvc-170#operator-t-star
- ["Microsoft::WRL::Details", "ComPtrRef", True, "operator void**", "", "", "Argument[-1].Element[@]", "ReturnValue[**@]", "value", "manual"]
- ["Microsoft::WRL::Details", "ComPtrRef", True, "ReleaseAndGetAddressOf", "", "", "Argument[-1].Element[@]", "ReturnValue[**@]", "value", "manual"]

View File

@@ -36,4 +36,14 @@ extensions:
# processthreadsapi.h
- ["", "", False, "CreateThread", "", "", "Argument[@3]", "Argument[2].Parameter[@0]", "value", "manual"]
- ["", "", False, "CreateRemoteThread", "", "", "Argument[@4]", "Argument[3].Parameter[@0]", "value", "manual"]
- ["", "", False, "CreateRemoteThreadEx", "", "", "Argument[@4]", "Argument[3].Parameter[@0]", "value", "manual"]
- ["", "", False, "CreateRemoteThreadEx", "", "", "Argument[@4]", "Argument[3].Parameter[@0]", "value", "manual"]
# wdm.h
- ["", "", False, "RtlCopyVolatileMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"]
- ["", "", False, "RtlCopyDeviceMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"]
- ["", "", False, "RtlCopyMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"]
- ["", "", False, "RtlCopyMemoryNonTemporal", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"]
- ["", "", False, "RtlCopyUnicodeString", "", "", "Argument[*1].Field[*Buffer]", "Argument[*0].Field[*Buffer]", "value", "manual"]
- ["", "", False, "RtlMoveMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"]
- ["", "", False, "RtlMoveVolatileMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"]
# winternl.h
- ["", "", False, "RtlInitUnicodeString", "", "", "Argument[*1]", "Argument[*0].Field[*Buffer]", "value", "manual"]

View File

@@ -1,5 +1,5 @@
name: codeql/cpp-all
version: 5.3.0
version: 5.5.0
groups: cpp
dbscheme: semmlecode.cpp.dbscheme
extractor: cpp

View File

@@ -0,0 +1,26 @@
/**
* Provides the `PchFile` class representing precompiled header (PCH) files created and
* used during the build process.
*/
import semmle.code.cpp.File
/**
* A precompiled header (PCH) file created during the build process.
*/
class PchFile extends @pch {
/**
* Gets a textual representation of this element.
*/
string toString() { result = "PCH for " + this.getHeaderFile() }
/**
* Gets the header file from which the PCH file was created.
*/
File getHeaderFile() { pch_creations(this, _, result) }
/**
* Gets a source file that includes the PCH.
*/
File getAUse() { pch_uses(this, _, result) }
}

View File

@@ -57,6 +57,18 @@ private Class getRootType(FieldAccess fa) {
)
}
/**
* Gets the size of `v`. This predicate does not have a result when the
* unspecified type of `v` is a `ReferenceType`.
*/
private int getVariableSize(Variable v) {
exists(Type t |
t = v.getUnspecifiedType() and
not t instanceof ReferenceType and
result = t.getSize()
)
}
/**
* Gets the size of the buffer access at `va`.
*/
@@ -64,12 +76,8 @@ private int getSize(VariableAccess va) {
exists(Variable v | va.getTarget() = v |
// If `v` is not a field then the size of the buffer is just
// the size of the type of `v`.
exists(Type t |
t = v.getUnspecifiedType() and
not v instanceof Field and
not t instanceof ReferenceType and
result = t.getSize()
)
not v instanceof Field and
result = getVariableSize(v)
or
exists(Class c, int trueSize |
// Otherwise, we find the "outermost" object and compute the size
@@ -92,7 +100,7 @@ private int getSize(VariableAccess va) {
// buffer is `12 - 4 = 8`.
c = getRootType(va) and
// we calculate the size based on the last field, to avoid including any padding after it
trueSize = max(Field f | | f.getOffsetInClass(c) + f.getUnspecifiedType().getSize()) and
trueSize = max(Field f | | f.getOffsetInClass(c) + getVariableSize(f)) and
result = trueSize - v.(Field).getOffsetInClass(c)
)
)

View File

@@ -936,6 +936,77 @@ private module Cached {
ValueNumber getUnary() { result.getAnInstruction() = instr.getUnary() }
}
signature predicate sinkSig(Instruction instr);
private module BooleanInstruction<sinkSig/1 isSink> {
/**
* Holds if `i1` flows to `i2` in a single step and `i2` is not an
* instruction that produces a value of Boolean type.
*/
private predicate stepToNonBoolean(Instruction i1, Instruction i2) {
not i2.getResultIRType() instanceof IRBooleanType and
(
i2.(CopyInstruction).getSourceValue() = i1
or
i2.(ConvertInstruction).getUnary() = i1
or
i2.(BuiltinExpectCallInstruction).getArgument(0) = i1
)
}
private predicate rev(Instruction instr) {
isSink(instr)
or
exists(Instruction instr1 |
rev(instr1) and
stepToNonBoolean(instr, instr1)
)
}
private predicate hasBooleanType(Instruction instr) {
instr.getResultIRType() instanceof IRBooleanType
}
private predicate fwd(Instruction instr) {
rev(instr) and
(
hasBooleanType(instr)
or
exists(Instruction instr0 |
fwd(instr0) and
stepToNonBoolean(instr0, instr)
)
)
}
private predicate prunedStep(Instruction i1, Instruction i2) {
fwd(i1) and
fwd(i2) and
stepToNonBoolean(i1, i2)
}
private predicate stepsPlus(Instruction i1, Instruction i2) =
doublyBoundedFastTC(prunedStep/2, hasBooleanType/1, isSink/1)(i1, i2)
/**
* Gets the Boolean-typed instruction that defines `instr` before any
* integer conversions are applied, if any.
*/
Instruction get(Instruction instr) {
isSink(instr) and
(
result = instr
or
stepsPlus(result, instr)
) and
hasBooleanType(result)
}
}
private predicate isUnaryComparesEqLeft(Instruction instr) {
unary_compares_eq(_, instr.getAUse(), 0, _, _)
}
/**
* Holds if `left == right + k` is `areEqual` given that test is `testIsTrue`.
*
@@ -966,14 +1037,19 @@ private module Cached {
)
or
compares_eq(test.(BuiltinExpectCallValueNumber).getCondition(), left, right, k, areEqual, value)
}
private predicate isConvertedBool(Instruction instr) {
instr.getResultIRType() instanceof IRBooleanType
or
isConvertedBool(instr.(ConvertInstruction).getUnary())
or
isConvertedBool(instr.(BuiltinExpectCallInstruction).getCondition())
exists(Operand l, BooleanValue bv |
// 1. test = value -> int(l) = 0 is !bv
unary_compares_eq(test, l, 0, bv.getValue().booleanNot(), value) and
// 2. l = bv -> left + right is areEqual
compares_eq(valueNumber(BooleanInstruction<isUnaryComparesEqLeft/1>::get(l.getDef())), left,
right, k, areEqual, bv)
// We want this to hold:
// `test = value -> left + right is areEqual`
// Applying 2 we need to show:
// `test = value -> l = bv`
// And `l = bv` holds by `int(l) = 0 is !bv`
)
}
/**
@@ -1006,19 +1082,11 @@ private module Cached {
k = k1 + k2
)
or
exists(CompareValueNumber cmp, Operand left, Operand right, AbstractValue v |
test = cmp and
pragma[only_bind_into](cmp)
.hasOperands(pragma[only_bind_into](left), pragma[only_bind_into](right)) and
isConvertedBool(left.getDef()) and
int_value(right.getDef()) = 0 and
unary_compares_eq(valueNumberOfOperand(left), op, k, areEqual, v)
|
cmp instanceof CompareNEValueNumber and
v = value
or
cmp instanceof CompareEQValueNumber and
v.getDualValue() = value
// See argument for why this is correct in compares_eq
exists(Operand l, BooleanValue bv |
unary_compares_eq(test, l, 0, bv.getValue().booleanNot(), value) and
unary_compares_eq(valueNumber(BooleanInstruction<isUnaryComparesEqLeft/1>::get(l.getDef())),
op, k, areEqual, bv)
)
or
unary_compares_eq(test.(BuiltinExpectCallValueNumber).getCondition(), op, k, areEqual, value)
@@ -1116,70 +1184,26 @@ private module Cached {
)
}
private predicate isBuiltInExpectArg(Instruction instr) {
instr = any(BuiltinExpectCallInstruction buildinExpect).getArgument(0)
}
/** A call to the builtin operation `__builtin_expect`. */
private class BuiltinExpectCallInstruction extends CallInstruction {
BuiltinExpectCallInstruction() { this.getStaticCallTarget().hasName("__builtin_expect") }
/** Gets the condition of this call. */
Instruction getCondition() { result = this.getConditionOperand().getDef() }
Operand getConditionOperand() {
// The first parameter of `__builtin_expect` has type `long`. So we skip
// the conversion when inferring guards.
result = this.getArgument(0).(ConvertInstruction).getUnaryOperand()
Instruction getCondition() {
result = BooleanInstruction<isBuiltInExpectArg/1>::get(this.getArgument(0))
}
}
/**
* Holds if `left == right + k` is `areEqual` if `cmp` evaluates to `value`,
* and `cmp` is an instruction that compares the value of
* `__builtin_expect(left == right + k, _)` to `0`.
*/
private predicate builtin_expect_eq(
CompareValueNumber cmp, Operand left, Operand right, int k, boolean areEqual,
AbstractValue value
) {
exists(BuiltinExpectCallValueNumber call, Instruction const, AbstractValue innerValue |
int_value(const) = 0 and
cmp.hasOperands(call.getAUse(), const.getAUse()) and
compares_eq(call.getCondition(), left, right, k, areEqual, innerValue)
|
cmp instanceof CompareNEValueNumber and
value = innerValue
or
cmp instanceof CompareEQValueNumber and
value.getDualValue() = innerValue
)
}
private predicate complex_eq(
ValueNumber cmp, Operand left, Operand right, int k, boolean areEqual, AbstractValue value
) {
sub_eq(cmp, left, right, k, areEqual, value)
or
add_eq(cmp, left, right, k, areEqual, value)
or
builtin_expect_eq(cmp, left, right, k, areEqual, value)
}
/**
* Holds if `op == k` is `areEqual` if `cmp` evaluates to `value`, and `cmp` is
* an instruction that compares the value of `__builtin_expect(op == k, _)` to `0`.
*/
private predicate unary_builtin_expect_eq(
CompareValueNumber cmp, Operand op, int k, boolean areEqual, AbstractValue value
) {
exists(BuiltinExpectCallValueNumber call, Instruction const, AbstractValue innerValue |
int_value(const) = 0 and
cmp.hasOperands(call.getAUse(), const.getAUse()) and
unary_compares_eq(call.getCondition(), op, k, areEqual, innerValue)
|
cmp instanceof CompareNEValueNumber and
value = innerValue
or
cmp instanceof CompareEQValueNumber and
value.getDualValue() = innerValue
)
}
private predicate unary_complex_eq(
@@ -1188,8 +1212,6 @@ private module Cached {
unary_sub_eq(test, op, k, areEqual, value)
or
unary_add_eq(test, op, k, areEqual, value)
or
unary_builtin_expect_eq(test, op, k, areEqual, value)
}
/*
@@ -1215,6 +1237,15 @@ private module Cached {
exists(AbstractValue dual | value = dual.getDualValue() |
compares_lt(test.(LogicalNotValueNumber).getUnary(), left, right, k, isLt, dual)
)
or
compares_lt(test.(BuiltinExpectCallValueNumber).getCondition(), left, right, k, isLt, value)
or
// See argument for why this is correct in compares_eq
exists(Operand l, BooleanValue bv |
unary_compares_eq(test, l, 0, bv.getValue().booleanNot(), value) and
compares_lt(valueNumber(BooleanInstruction<isUnaryComparesEqLeft/1>::get(l.getDef())), left,
right, k, isLt, bv)
)
}
/** Holds if `op < k` evaluates to `isLt` given that `test` evaluates to `value`. */
@@ -1234,6 +1265,15 @@ private module Cached {
int_value(const) = k1 and
k = k1 + k2
)
or
compares_lt(test.(BuiltinExpectCallValueNumber).getCondition(), op, k, isLt, value)
or
// See argument for why this is correct in compares_eq
exists(Operand l, BooleanValue bv |
unary_compares_eq(test, l, 0, bv.getValue().booleanNot(), value) and
compares_lt(valueNumber(BooleanInstruction<isUnaryComparesEqLeft/1>::get(l.getDef())), op, k,
isLt, bv)
)
}
/** `(a < b + k) => (b > a - k) => (b >= a + (1-k))` */

View File

@@ -15,6 +15,13 @@ class StandardSsa extends SsaHelper {
}
/**
* NOTE: If possible, prefer the SSA classes exposed by the new dataflow
* library:
* ```
* import semmle.code.cpp.dataflow.new.DataFlow
* // use `DataFlow::Ssa::Definition`
* ```
*
* A definition of one or more SSA variables, including phi node definitions.
* An _SSA variable_, as defined in the literature, is effectively the pair of
* an `SsaDefinition d` and a `StackVariable v`, written `(d, v)` in this

View File

@@ -1,223 +1,21 @@
private import cpp
private import semmle.code.cpp.ir.IR
private import semmle.code.cpp.ir.dataflow.DataFlow
private import DataFlowPrivate
private import DataFlowPrivate as DataFlowPrivate
private import DataFlowUtil
private import DataFlowImplCommon as DataFlowImplCommon
private import codeql.typetracking.TypeTracking
private import SsaImpl as SsaImpl
/**
* Gets a function that might be called by `call`.
*
* This predicate does not take additional call targets
* from `AdditionalCallTarget` into account.
* Holds if `f` has name `qualifiedName` and `nparams` parameter count. This is
* an approximation of its signature for the purpose of matching functions that
* might be the same across link targets.
*/
cached
DataFlowCallable defaultViableCallable(DataFlowCall call) {
DataFlowImplCommon::forceCachingInSameStage() and
result = call.getStaticCallTarget()
or
// If the target of the call does not have a body in the snapshot, it might
// be because the target is just a header declaration, and the real target
// will be determined at run time when the caller and callee are linked
// together by the operating system's dynamic linker. In case a _unique_
// function with the right signature is present in the database, we return
// that as a potential callee.
exists(string qualifiedName, int nparams |
callSignatureWithoutBody(qualifiedName, nparams, call.asCallInstruction()) and
functionSignatureWithBody(qualifiedName, nparams, result.getUnderlyingCallable()) and
strictcount(Function other | functionSignatureWithBody(qualifiedName, nparams, other)) = 1
)
or
// Virtual dispatch
result.asSourceCallable() = call.(VirtualDispatch::DataSensitiveCall).resolve()
}
/**
* Gets a function that might be called by `call`.
*/
cached
DataFlowCallable viableCallable(DataFlowCall call) {
result = defaultViableCallable(call)
or
// Additional call targets
result.getUnderlyingCallable() =
any(AdditionalCallTarget additional)
.viableTarget(call.asCallInstruction().getUnconvertedResultExpression())
}
/**
* Provides virtual dispatch support compatible with the original
* implementation of `semmle.code.cpp.security.TaintTracking`.
*/
private module VirtualDispatch {
/** A call that may dispatch differently depending on the qualifier value. */
abstract class DataSensitiveCall extends DataFlowCall {
/**
* Gets the node whose value determines the target of this call. This node
* could be the qualifier of a virtual dispatch or the function-pointer
* expression in a call to a function pointer. What they have in common is
* that we need to find out which data flows there, and then it's up to the
* `resolve` predicate to stitch that information together and resolve the
* call.
*/
abstract DataFlow::Node getDispatchValue();
/** Gets a candidate target for this call. */
abstract Function resolve();
/**
* Whether `src` can flow to this call.
*
* Searches backwards from `getDispatchValue()` to `src`. The `allowFromArg`
* parameter is true when the search is allowed to continue backwards into
* a parameter; non-recursive callers should pass `_` for `allowFromArg`.
*/
predicate flowsFrom(DataFlow::Node src, boolean allowFromArg) {
src = this.getDispatchValue() and allowFromArg = true
or
exists(DataFlow::Node other, boolean allowOtherFromArg |
this.flowsFrom(other, allowOtherFromArg)
|
// Call argument
exists(DataFlowCall call, Position i |
other
.(DataFlow::ParameterNode)
.isParameterOf(pragma[only_bind_into](call).getStaticCallTarget(), i) and
src.(ArgumentNode).argumentOf(call, pragma[only_bind_into](pragma[only_bind_out](i)))
) and
allowOtherFromArg = true and
allowFromArg = true
or
// Call return
exists(DataFlowCall call, ReturnKind returnKind |
other = getAnOutNode(call, returnKind) and
returnNodeWithKindAndEnclosingCallable(src, returnKind, call.getStaticCallTarget())
) and
allowFromArg = false
or
// Local flow
DataFlow::localFlowStep(src, other) and
allowFromArg = allowOtherFromArg
or
// Flow from global variable to load.
exists(LoadInstruction load, GlobalOrNamespaceVariable var |
var = src.asVariable() and
other.asInstruction() = load and
addressOfGlobal(load.getSourceAddress(), var) and
// The `allowFromArg` concept doesn't play a role when `src` is a
// global variable, so we just set it to a single arbitrary value for
// performance.
allowFromArg = true
)
or
// Flow from store to global variable.
exists(StoreInstruction store, GlobalOrNamespaceVariable var |
var = other.asVariable() and
store = src.asInstruction() and
storeIntoGlobal(store, var) and
// Setting `allowFromArg` to `true` like in the base case means we
// treat a store to a global variable like the dispatch itself: flow
// may come from anywhere.
allowFromArg = true
)
)
}
}
pragma[noinline]
private predicate storeIntoGlobal(StoreInstruction store, GlobalOrNamespaceVariable var) {
addressOfGlobal(store.getDestinationAddress(), var)
}
/** Holds if `addressInstr` is an instruction that produces the address of `var`. */
private predicate addressOfGlobal(Instruction addressInstr, GlobalOrNamespaceVariable var) {
// Access directly to the global variable
addressInstr.(VariableAddressInstruction).getAstVariable() = var
or
// Access to a field on a global union
exists(FieldAddressInstruction fa |
fa = addressInstr and
fa.getObjectAddress().(VariableAddressInstruction).getAstVariable() = var and
fa.getField().getDeclaringType() instanceof Union
)
}
/**
* A ReturnNode with its ReturnKind and its enclosing callable.
*
* Used to fix a join ordering issue in flowsFrom.
*/
pragma[noinline]
private predicate returnNodeWithKindAndEnclosingCallable(
ReturnNode node, ReturnKind kind, DataFlowCallable callable
) {
node.getKind() = kind and
node.getFunction() = callable.getUnderlyingCallable()
}
/** Call through a function pointer. */
private class DataSensitiveExprCall extends DataSensitiveCall {
DataSensitiveExprCall() { not exists(this.getStaticCallTarget()) }
override DataFlow::Node getDispatchValue() { result.asOperand() = this.getCallTargetOperand() }
override Function resolve() {
exists(FunctionInstruction fi |
this.flowsFrom(DataFlow::instructionNode(fi), _) and
result = fi.getFunctionSymbol()
) and
(
this.getNumberOfArguments() <= result.getEffectiveNumberOfParameters() and
this.getNumberOfArguments() >= result.getEffectiveNumberOfParameters()
or
result.isVarargs()
)
}
}
/** Call to a virtual function. */
private class DataSensitiveOverriddenFunctionCall extends DataSensitiveCall {
DataSensitiveOverriddenFunctionCall() {
exists(
this.getStaticCallTarget()
.getUnderlyingCallable()
.(VirtualFunction)
.getAnOverridingFunction()
)
}
override DataFlow::Node getDispatchValue() { result.asInstruction() = this.getArgument(-1) }
override MemberFunction resolve() {
exists(Class overridingClass |
this.overrideMayAffectCall(overridingClass, result) and
this.hasFlowFromCastFrom(overridingClass)
)
}
/**
* Holds if `this` is a virtual function call whose static target is
* overridden by `overridingFunction` in `overridingClass`.
*/
pragma[noinline]
private predicate overrideMayAffectCall(Class overridingClass, MemberFunction overridingFunction) {
overridingFunction.getAnOverriddenFunction+() =
this.getStaticCallTarget().getUnderlyingCallable().(VirtualFunction) and
overridingFunction.getDeclaringType() = overridingClass
}
/**
* Holds if the qualifier of `this` has flow from an upcast from
* `derivedClass`.
*/
pragma[noinline]
private predicate hasFlowFromCastFrom(Class derivedClass) {
exists(ConvertToBaseInstruction toBase |
this.flowsFrom(DataFlow::instructionNode(toBase), _) and
derivedClass = toBase.getDerivedClass()
)
}
}
private predicate functionSignature(Function f, string qualifiedName, int nparams) {
qualifiedName = f.getQualifiedName() and
nparams = f.getNumberOfParameters() and
not f.isStatic()
}
/**
@@ -243,34 +41,319 @@ private predicate callSignatureWithoutBody(string qualifiedName, int nparams, Ca
}
/**
* Holds if `f` has name `qualifiedName` and `nparams` parameter count. This is
* an approximation of its signature for the purpose of matching functions that
* might be the same across link targets.
* Gets a function that might be called by `call`.
*
* This predicate does not take additional call targets
* from `AdditionalCallTarget` into account.
*/
private predicate functionSignature(Function f, string qualifiedName, int nparams) {
qualifiedName = f.getQualifiedName() and
nparams = f.getNumberOfParameters() and
not f.isStatic()
cached
DataFlowPrivate::DataFlowCallable defaultViableCallable(DataFlowPrivate::DataFlowCall call) {
result = defaultViableCallableWithoutLambda(call)
or
result = DataFlowImplCommon::viableCallableLambda(call, _)
}
private DataFlowPrivate::DataFlowCallable defaultViableCallableWithoutLambda(
DataFlowPrivate::DataFlowCall call
) {
DataFlowImplCommon::forceCachingInSameStage() and
result = call.getStaticCallTarget()
or
// If the target of the call does not have a body in the snapshot, it might
// be because the target is just a header declaration, and the real target
// will be determined at run time when the caller and callee are linked
// together by the operating system's dynamic linker. In case a _unique_
// function with the right signature is present in the database, we return
// that as a potential callee.
exists(string qualifiedName, int nparams |
callSignatureWithoutBody(qualifiedName, nparams, call.asCallInstruction()) and
functionSignatureWithBody(qualifiedName, nparams, result.getUnderlyingCallable()) and
strictcount(Function other | functionSignatureWithBody(qualifiedName, nparams, other)) = 1
)
}
/**
* Gets a function that might be called by `call`.
*/
private DataFlowPrivate::DataFlowCallable nonVirtualDispatch(DataFlowPrivate::DataFlowCall call) {
result = defaultViableCallableWithoutLambda(call)
or
// Additional call targets
result.getUnderlyingCallable() =
any(AdditionalCallTarget additional)
.viableTarget(call.asCallInstruction().getUnconvertedResultExpression())
}
private class RelevantNode extends Node {
RelevantNode() { this.getType().stripType() instanceof Class }
}
private signature DataFlowPrivate::DataFlowCallable methodDispatchSig(
DataFlowPrivate::DataFlowCall c
);
private predicate ignoreConstructor(Expr e) {
e instanceof ConstructorDirectInit or
e instanceof ConstructorVirtualInit or
e instanceof ConstructorDelegationInit or
exists(ConstructorFieldInit init | init.getExpr() = e)
}
/**
* Holds if `n` is either:
* - the post-update node of a qualifier after a call to a constructor which
* constructs an object containing at least one virtual function.
* - a node which represents a derived-to-base instruction that converts from `c`.
*/
private predicate qualifierSourceImpl(RelevantNode n, Class c) {
// Object construction
exists(CallInstruction call, ThisArgumentOperand qualifier, Call e |
qualifier = call.getThisArgumentOperand() and
n.(PostUpdateNode).getPreUpdateNode().asOperand() = qualifier and
call.getStaticCallTarget() instanceof Constructor and
qualifier.getType().stripType() = c and
c.getABaseClass*().getAMemberFunction().isVirtual() and
e = call.getUnconvertedResultExpression() and
not ignoreConstructor(e)
|
exists(c.getABaseClass())
or
exists(c.getADerivedClass())
)
or
// Conversion to a base class
exists(ConvertToBaseInstruction convert |
// Only keep the most specific cast
not convert.getUnary() instanceof ConvertToBaseInstruction and
n.asInstruction() = convert and
convert.getDerivedClass() = c and
c.getABaseClass*().getAMemberFunction().isVirtual()
)
}
private module TrackVirtualDispatch<methodDispatchSig/1 virtualDispatch0> {
/**
* Gets a possible runtime target of `c` using both static call-target
* information, and call-target resolution from `virtualDispatch0`.
*/
private DataFlowPrivate::DataFlowCallable dispatch(DataFlowPrivate::DataFlowCall c) {
result = nonVirtualDispatch(c) or
result = virtualDispatch0(c)
}
private module TtInput implements TypeTrackingInput<Location> {
final class Node = RelevantNode;
class LocalSourceNode extends Node {
LocalSourceNode() {
this instanceof ParameterNode
or
this instanceof DataFlowPrivate::OutNode
or
DataFlowPrivate::readStep(_, _, this)
or
DataFlowPrivate::storeStep(_, _, this)
or
DataFlowPrivate::jumpStep(_, this)
or
qualifierSourceImpl(this, _)
}
}
final private class ContentSetFinal = ContentSet;
class Content extends ContentSetFinal {
Content() {
exists(DataFlow::Content c |
this.isSingleton(c) and
c.getIndirectionIndex() = 1
)
}
}
class ContentFilter extends Content {
Content getAMatchingContent() { result = this }
}
predicate compatibleContents(Content storeContents, Content loadContents) {
storeContents = loadContents
}
predicate simpleLocalSmallStep(Node nodeFrom, Node nodeTo) {
nodeFrom.getFunction() instanceof Function and
simpleLocalFlowStep(nodeFrom, nodeTo, _)
}
predicate levelStepNoCall(Node n1, LocalSourceNode n2) { none() }
predicate levelStepCall(Node n1, LocalSourceNode n2) { none() }
predicate storeStep(Node n1, Node n2, Content f) { DataFlowPrivate::storeStep(n1, f, n2) }
predicate callStep(Node n1, LocalSourceNode n2) {
exists(DataFlowPrivate::DataFlowCall call, DataFlowPrivate::Position pos |
n1.(DataFlowPrivate::ArgumentNode).argumentOf(call, pos) and
n2.(ParameterNode).isParameterOf(dispatch(call), pos)
)
}
predicate returnStep(Node n1, LocalSourceNode n2) {
exists(DataFlowPrivate::DataFlowCallable callable, DataFlowPrivate::DataFlowCall call |
n1.(DataFlowPrivate::ReturnNode).getEnclosingCallable() = callable and
callable = dispatch(call) and
n2 = DataFlowPrivate::getAnOutNode(call, n1.(DataFlowPrivate::ReturnNode).getKind())
)
}
predicate loadStep(Node n1, LocalSourceNode n2, Content f) {
DataFlowPrivate::readStep(n1, f, n2)
}
predicate loadStoreStep(Node nodeFrom, Node nodeTo, Content f1, Content f2) { none() }
predicate withContentStep(Node nodeFrom, LocalSourceNode nodeTo, ContentFilter f) { none() }
predicate withoutContentStep(Node nodeFrom, LocalSourceNode nodeTo, ContentFilter f) { none() }
predicate jumpStep(Node n1, LocalSourceNode n2) { DataFlowPrivate::jumpStep(n1, n2) }
predicate hasFeatureBacktrackStoreTarget() { none() }
}
private predicate qualifierSource(RelevantNode n) { qualifierSourceImpl(n, _) }
/**
* Holds if `n` is the qualifier of `call` which targets the virtual member
* function `mf`.
*/
private predicate qualifierOfVirtualCallImpl(
RelevantNode n, CallInstruction call, MemberFunction mf
) {
n.asOperand() = call.getThisArgumentOperand() and
call.getStaticCallTarget() = mf and
mf.isVirtual()
}
private predicate qualifierOfVirtualCall(RelevantNode n) { qualifierOfVirtualCallImpl(n, _, _) }
private import TypeTracking<Location, TtInput>::TypeTrack<qualifierSource/1>::Graph<qualifierOfVirtualCall/1>
private predicate edgePlus(PathNode n1, PathNode n2) = fastTC(edges/2)(n1, n2)
/**
* Gets the most specific implementation of `mf` that may be called when the
* qualifier has runtime type `c`.
*/
private MemberFunction mostSpecific(MemberFunction mf, Class c) {
qualifierOfVirtualCallImpl(_, _, mf) and
mf.getAnOverridingFunction*() = result and
(
result.getDeclaringType() = c
or
not c.getAMemberFunction().getAnOverriddenFunction*() = mf and
result = mostSpecific(mf, c.getABaseClass())
)
}
/**
* Gets a possible pair of end-points `(p1, p2)` where:
* - `p1` is a derived-to-base conversion that converts from some
* class `derived`, and
* - `p2` is the qualifier of a call to a virtual function that may
* target `callable`, and
* - `callable` is the most specific implementation that may be called when
* the qualifier has type `derived`.
*/
private predicate pairCand(
PathNode p1, PathNode p2, DataFlowPrivate::DataFlowCallable callable,
DataFlowPrivate::DataFlowCall call
) {
exists(Class derived, MemberFunction mf |
qualifierSourceImpl(p1.getNode(), derived) and
qualifierOfVirtualCallImpl(p2.getNode(), call.asCallInstruction(), mf) and
p1.isSource() and
p2.isSink() and
callable.asSourceCallable() = mostSpecific(mf, derived)
)
}
/** Gets a possible run-time target of `call`. */
DataFlowPrivate::DataFlowCallable virtualDispatch(DataFlowPrivate::DataFlowCall call) {
exists(PathNode p1, PathNode p2 | p1 = p2 or edgePlus(p1, p2) | pairCand(p1, p2, result, call))
}
}
private DataFlowPrivate::DataFlowCallable noDisp(DataFlowPrivate::DataFlowCall call) { none() }
pragma[nomagic]
private DataFlowPrivate::DataFlowCallable d1(DataFlowPrivate::DataFlowCall call) {
result = TrackVirtualDispatch<noDisp/1>::virtualDispatch(call)
}
pragma[nomagic]
private DataFlowPrivate::DataFlowCallable d2(DataFlowPrivate::DataFlowCall call) {
result = TrackVirtualDispatch<d1/1>::virtualDispatch(call)
}
pragma[nomagic]
private DataFlowPrivate::DataFlowCallable d3(DataFlowPrivate::DataFlowCall call) {
result = TrackVirtualDispatch<d2/1>::virtualDispatch(call)
}
pragma[nomagic]
private DataFlowPrivate::DataFlowCallable d4(DataFlowPrivate::DataFlowCall call) {
result = TrackVirtualDispatch<d3/1>::virtualDispatch(call)
}
pragma[nomagic]
private DataFlowPrivate::DataFlowCallable d5(DataFlowPrivate::DataFlowCall call) {
result = TrackVirtualDispatch<d4/1>::virtualDispatch(call)
}
pragma[nomagic]
private DataFlowPrivate::DataFlowCallable d6(DataFlowPrivate::DataFlowCall call) {
result = TrackVirtualDispatch<d5/1>::virtualDispatch(call)
}
/** Gets a function that might be called by `call`. */
cached
DataFlowPrivate::DataFlowCallable viableCallable(DataFlowPrivate::DataFlowCall call) {
not exists(d6(call)) and
result = nonVirtualDispatch(call)
or
result = d6(call)
}
/**
* Holds if the set of viable implementations that can be called by `call`
* might be improved by knowing the call context.
*/
predicate mayBenefitFromCallContext(DataFlowCall call) { mayBenefitFromCallContext(call, _, _) }
predicate mayBenefitFromCallContext(DataFlowPrivate::DataFlowCall call) {
mayBenefitFromCallContext(call, _, _)
}
private predicate localLambdaFlowStep(Node nodeFrom, Node nodeTo) {
localFlowStep(nodeFrom, nodeTo)
or
DataFlowPrivate::additionalLambdaFlowStep(nodeFrom, nodeTo, _)
}
/**
* Holds if `call` is a call through a function pointer, and the pointer
* value is given as the `arg`'th argument to `f`.
*/
private predicate mayBenefitFromCallContext(
VirtualDispatch::DataSensitiveCall call, DataFlowCallable f, int arg
DataFlowPrivate::DataFlowCall call, DataFlowPrivate::DataFlowCallable f, int arg
) {
f = pragma[only_bind_out](call).getEnclosingCallable() and
exists(InitializeParameterInstruction init |
not exists(call.getStaticCallTarget()) and
not exists(call.getStaticCallTarget())
or
exists(call.getStaticCallSourceTarget().(VirtualFunction).getAnOverridingFunction())
|
init.getEnclosingFunction() = f.getUnderlyingCallable() and
call.flowsFrom(DataFlow::instructionNode(init), _) and
localLambdaFlowStep+(instructionNode(init),
operandNode(call.asCallInstruction().getCallTargetOperand())) and
init.getParameter().getIndex() = arg
)
}
@@ -279,9 +362,11 @@ private predicate mayBenefitFromCallContext(
* Gets a viable dispatch target of `call` in the context `ctx`. This is
* restricted to those `call`s for which a context might make a difference.
*/
DataFlowCallable viableImplInCallContext(DataFlowCall call, DataFlowCall ctx) {
DataFlowPrivate::DataFlowCallable viableImplInCallContext(
DataFlowPrivate::DataFlowCall call, DataFlowPrivate::DataFlowCall ctx
) {
result = viableCallable(call) and
exists(int i, DataFlowCallable f |
exists(int i, DataFlowPrivate::DataFlowCallable f |
mayBenefitFromCallContext(pragma[only_bind_into](call), f, i) and
f = ctx.getStaticCallTarget() and
result.asSourceCallable() =
@@ -291,4 +376,8 @@ DataFlowCallable viableImplInCallContext(DataFlowCall call, DataFlowCall ctx) {
/** Holds if arguments at position `apos` match parameters at position `ppos`. */
pragma[inline]
predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { ppos = apos }
predicate parameterMatch(
DataFlowPrivate::ParameterPosition ppos, DataFlowPrivate::ArgumentPosition apos
) {
ppos = apos
}

View File

@@ -4,7 +4,7 @@ private import semmle.code.cpp.ir.IR
private import DataFlowDispatch
private import semmle.code.cpp.ir.internal.IRCppLanguage
private import semmle.code.cpp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl
private import SsaInternals as Ssa
private import SsaImpl as Ssa
private import DataFlowImplCommon as DataFlowImplCommon
private import codeql.util.Unit
private import Node0ToString
@@ -332,6 +332,13 @@ private module IndirectInstructions {
import IndirectInstructions
predicate isPostUpdateNodeImpl(Operand operand, int indirectionIndex) {
operand = any(FieldAddress fa).getObjectAddressOperand() and
indirectionIndex = [0 .. Ssa::countIndirectionsForCppType(Ssa::getLanguageType(operand))]
or
Ssa::isModifiableByCall(operand, indirectionIndex)
}
/** Gets the callable in which this node occurs. */
DataFlowCallable nodeGetEnclosingCallable(Node n) { result = n.getEnclosingCallable() }
@@ -1485,7 +1492,14 @@ predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) {
}
/** Extra data-flow steps needed for lambda flow analysis. */
predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preservesValue) { none() }
predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preservesValue) {
preservesValue = false and
exists(ContentSet cs | cs.isSingleton(any(UnionContent uc)) |
storeStep(nodeFrom, cs, nodeTo)
or
readStep(nodeFrom, cs, nodeTo)
)
}
predicate knownSourceModel(Node source, string model) { External::sourceNode(source, _, model) }
@@ -1866,9 +1880,7 @@ module IteratorFlow {
}
}
private module SsaInput implements SsaImpl::InputSig<Location> {
import Ssa::InputSigCommon
private module SsaInput implements SsaImpl::InputSig<Location, IRCfg::BasicBlock> {
class SourceVariable = IteratorFlow::SourceVariable;
/** A call to function that dereferences an iterator. */
@@ -1946,7 +1958,7 @@ module IteratorFlow {
* Holds if `(bb, i)` contains a write to an iterator that may have been obtained
* by calling `begin` (or related functions) on the variable `v`.
*/
predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) {
predicate variableWrite(IRCfg::BasicBlock bb, int i, SourceVariable v, boolean certain) {
certain = false and
exists(GetsIteratorCall beginCall, Instruction writeToDeref, IRBlock bbQual, int iQual |
isIteratorStoreInstruction(beginCall, writeToDeref) and
@@ -1957,12 +1969,12 @@ module IteratorFlow {
}
/** Holds if `(bb, i)` reads the container variable `v`. */
predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
predicate variableRead(IRCfg::BasicBlock bb, int i, SourceVariable v, boolean certain) {
Ssa::variableRead(bb, i, v, certain)
}
}
private module IteratorSsa = SsaImpl::Make<Location, SsaInput>;
private module IteratorSsa = SsaImpl::Make<Location, IRCfg, SsaInput>;
private module DataFlowIntegrationInput implements IteratorSsa::DataFlowIntegrationInputSig {
private import codeql.util.Void
@@ -1975,26 +1987,26 @@ module IteratorFlow {
)
}
predicate hasCfgNode(SsaInput::BasicBlock bb, int i) { bb.getInstruction(i) = this }
predicate hasCfgNode(IRCfg::BasicBlock bb, int i) { bb.getInstruction(i) = this }
}
predicate ssaDefHasSource(IteratorSsa::WriteDefinition def) { none() }
predicate allowFlowIntoUncertainDef(IteratorSsa::UncertainWriteDefinition def) { any() }
class GuardValue = Void;
class Guard extends Void {
predicate hasBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) {
predicate hasValueBranchEdge(IRCfg::BasicBlock bb1, IRCfg::BasicBlock bb2, GuardValue val) {
none()
}
predicate controlsBranchEdge(
SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch
) {
predicate valueControlsBranchEdge(IRCfg::BasicBlock bb1, IRCfg::BasicBlock bb2, GuardValue val) {
none()
}
}
predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) {
predicate guardDirectlyControlsBlock(Guard guard, IRCfg::BasicBlock bb, GuardValue val) {
none()
}

View File

@@ -13,7 +13,7 @@ private import semmle.code.cpp.models.interfaces.DataFlow
private import semmle.code.cpp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl
private import DataFlowPrivate
private import ModelUtil
private import SsaInternals as Ssa
private import SsaImpl as SsaImpl
private import DataFlowImplCommon as DataFlowImplCommon
private import codeql.util.Unit
private import Node0ToString
@@ -39,38 +39,35 @@ private newtype TIRDataFlowNode =
TNode0(Node0Impl node) { DataFlowImplCommon::forceCachingInSameStage() } or
TGlobalLikeVariableNode(GlobalLikeVariable var, int indirectionIndex) {
indirectionIndex =
[getMinIndirectionsForType(var.getUnspecifiedType()) .. Ssa::getMaxIndirectionsForType(var.getUnspecifiedType())]
[getMinIndirectionsForType(var.getUnspecifiedType()) .. SsaImpl::getMaxIndirectionsForType(var.getUnspecifiedType())]
} or
TPostUpdateNodeImpl(Operand operand, int indirectionIndex) {
operand = any(FieldAddress fa).getObjectAddressOperand() and
indirectionIndex = [0 .. Ssa::countIndirectionsForCppType(Ssa::getLanguageType(operand))]
or
Ssa::isModifiableByCall(operand, indirectionIndex)
isPostUpdateNodeImpl(operand, indirectionIndex)
} or
TSsaSynthNode(Ssa::SynthNode n) or
TSsaSynthNode(SsaImpl::SynthNode n) or
TSsaIteratorNode(IteratorFlow::IteratorFlowNode n) or
TRawIndirectOperand0(Node0Impl node, int indirectionIndex) {
Ssa::hasRawIndirectOperand(node.asOperand(), indirectionIndex)
SsaImpl::hasRawIndirectOperand(node.asOperand(), indirectionIndex)
} or
TRawIndirectInstruction0(Node0Impl node, int indirectionIndex) {
not exists(node.asOperand()) and
Ssa::hasRawIndirectInstruction(node.asInstruction(), indirectionIndex)
SsaImpl::hasRawIndirectInstruction(node.asInstruction(), indirectionIndex)
} or
TFinalParameterNode(Parameter p, int indirectionIndex) {
exists(Ssa::FinalParameterUse use |
exists(SsaImpl::FinalParameterUse use |
use.getParameter() = p and
use.getIndirectionIndex() = indirectionIndex
)
} or
TFinalGlobalValue(Ssa::GlobalUse globalUse) or
TInitialGlobalValue(Ssa::GlobalDef globalUse) or
TFinalGlobalValue(SsaImpl::GlobalUse globalUse) or
TInitialGlobalValue(SsaImpl::GlobalDef globalUse) or
TBodyLessParameterNodeImpl(Parameter p, int indirectionIndex) {
// Rule out parameters of catch blocks.
not exists(p.getCatchBlock()) and
// We subtract one because `getMaxIndirectionsForType` returns the maximum
// indirection for a glvalue of a given type, and this doesn't apply to
// parameters.
indirectionIndex = [0 .. Ssa::getMaxIndirectionsForType(p.getUnspecifiedType()) - 1] and
indirectionIndex = [0 .. SsaImpl::getMaxIndirectionsForType(p.getUnspecifiedType()) - 1] and
not any(InitializeParameterInstruction init).getParameter() = p
} or
TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn)
@@ -81,7 +78,7 @@ private newtype TIRDataFlowNode =
class FieldAddress extends Operand {
FieldAddressInstruction fai;
FieldAddress() { fai = this.getDef() and not Ssa::ignoreOperand(this) }
FieldAddress() { fai = this.getDef() and not SsaImpl::ignoreOperand(this) }
/** Gets the field associated with this instruction. */
Field getField() { result = fai.getField() }
@@ -126,7 +123,7 @@ predicate conversionFlow(
)
or
additional = true and
Ssa::isAdditionalConversionFlow(opFrom, instrTo)
SsaImpl::isAdditionalConversionFlow(opFrom, instrTo)
)
or
isPointerArith = true and
@@ -183,7 +180,7 @@ class Node extends TIRDataFlowNode {
or
this.asOperand().getUse() = block.getInstruction(i)
or
exists(Ssa::SynthNode ssaNode |
exists(SsaImpl::SynthNode ssaNode |
this.(SsaSynthNode).getSynthNode() = ssaNode and
ssaNode.getBasicBlock() = block and
ssaNode.getIndex() = i
@@ -364,10 +361,10 @@ class Node extends TIRDataFlowNode {
* pointed to by `p`.
*/
Expr asDefinition(boolean uncertain) {
exists(StoreInstruction store, Ssa::Definition def |
exists(StoreInstruction store, SsaImpl::Definition def |
store = this.asInstruction() and
result = asDefinitionImpl(store) and
Ssa::defToNode(this, def, _) and
SsaImpl::defToNode(this, def, _) and
if def.isCertain() then uncertain = false else uncertain = true
)
}
@@ -627,7 +624,7 @@ class OperandNode extends Node, Node0 {
* For example, `stripPointers(int*&)` is `int*` and `stripPointers(int*)` is `int`.
*/
Type stripPointer(Type t) {
result = any(Ssa::Indirection ind | ind.getType() = t).getBaseType()
result = any(SsaImpl::Indirection ind | ind.getType() = t).getBaseType()
or
result = t.(PointerToMemberType).getBaseType()
or
@@ -694,12 +691,12 @@ class PostFieldUpdateNode extends PostUpdateNodeImpl {
* in a data flow graph.
*/
class SsaSynthNode extends Node, TSsaSynthNode {
Ssa::SynthNode node;
SsaImpl::SynthNode node;
SsaSynthNode() { this = TSsaSynthNode(node) }
/** Gets the synthesized SSA node associated with this node. */
Ssa::SynthNode getSynthNode() { result = node }
SsaImpl::SynthNode getSynthNode() { result = node }
override DataFlowCallable getEnclosingCallable() {
result.asSourceCallable() = this.getFunction()
@@ -782,12 +779,12 @@ class SideEffectOperandNode extends Node instanceof IndirectOperand {
* from a function body.
*/
class FinalGlobalValue extends Node, TFinalGlobalValue {
Ssa::GlobalUse globalUse;
SsaImpl::GlobalUse globalUse;
FinalGlobalValue() { this = TFinalGlobalValue(globalUse) }
/** Gets the underlying SSA use. */
Ssa::GlobalUse getGlobalUse() { result = globalUse }
SsaImpl::GlobalUse getGlobalUse() { result = globalUse }
override DataFlowCallable getEnclosingCallable() {
result.asSourceCallable() = this.getFunction()
@@ -798,7 +795,7 @@ class FinalGlobalValue extends Node, TFinalGlobalValue {
override DataFlowType getType() {
exists(int indirectionIndex |
indirectionIndex = globalUse.getIndirectionIndex() and
result = getTypeImpl(globalUse.getUnderlyingType(), indirectionIndex - 1)
result = getTypeImpl(globalUse.getUnderlyingType(), indirectionIndex)
)
}
@@ -814,12 +811,12 @@ class FinalGlobalValue extends Node, TFinalGlobalValue {
* a function body.
*/
class InitialGlobalValue extends Node, TInitialGlobalValue {
Ssa::GlobalDef globalDef;
SsaImpl::GlobalDef globalDef;
InitialGlobalValue() { this = TInitialGlobalValue(globalDef) }
/** Gets the underlying SSA definition. */
Ssa::GlobalDef getGlobalDef() { result = globalDef }
SsaImpl::GlobalDef getGlobalDef() { result = globalDef }
override DataFlowCallable getEnclosingCallable() {
result.asSourceCallable() = this.getFunction()
@@ -1288,11 +1285,11 @@ class UninitializedNode extends Node {
LocalVariable v;
UninitializedNode() {
exists(Ssa::Definition def, Ssa::SourceVariable sv |
exists(SsaImpl::Definition def, SsaImpl::SourceVariable sv |
def.getIndirectionIndex() = 0 and
def.getValue().asInstruction() instanceof UninitializedInstruction and
Ssa::defToNode(this, def, sv) and
v = sv.getBaseVariable().(Ssa::BaseIRVariable).getIRVariable().getAst()
SsaImpl::defToNode(this, def, sv) and
v = sv.getBaseVariable().(SsaImpl::BaseIRVariable).getIRVariable().getAst()
)
}
@@ -1722,7 +1719,7 @@ private module Cached {
cached
predicate flowsToBackEdge(Node n) {
exists(Node succ, IRBlock bb1, IRBlock bb2 |
Ssa::ssaFlow(n, succ) and
SsaImpl::ssaFlow(n, succ) and
bb1 = n.getBasicBlock() and
bb2 = succ.getBasicBlock() and
bb1 != bb2 and
@@ -1820,7 +1817,7 @@ private module Cached {
predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo, string model) {
(
// Def-use/Use-use flow
Ssa::ssaFlow(nodeFrom, nodeTo)
SsaImpl::ssaFlow(nodeFrom, nodeTo)
or
IteratorFlow::localFlowStep(nodeFrom, nodeTo)
or
@@ -1833,7 +1830,7 @@ private module Cached {
|
simpleOperandLocalFlowStep(iFrom, opTo) and
// Omit when the instruction node also represents the operand.
not iFrom = Ssa::getIRRepresentationOfOperand(opTo)
not iFrom = SsaImpl::getIRRepresentationOfOperand(opTo)
)
or
// Indirect operand -> (indirect) instruction flow
@@ -1906,7 +1903,7 @@ private module Cached {
// We also want a write coming out of an `OutNode` to flow `nodeTo`.
// This is different from `reverseFlowInstruction` since `nodeFrom` can never
// be an `OutNode` when it's defined by an instruction.
Ssa::outNodeHasAddressAndIndex(nodeFrom, address, indirectionIndex)
SsaImpl::outNodeHasAddressAndIndex(nodeFrom, address, indirectionIndex)
)
}
@@ -2099,7 +2096,7 @@ private newtype TContent =
TFieldContent(Field f, int indirectionIndex) {
// the indirection index for field content starts at 1 (because `TFieldContent` is thought of as
// the address of the field, `FieldAddress` in the IR).
indirectionIndex = [1 .. Ssa::getMaxIndirectionsForType(f.getUnspecifiedType())] and
indirectionIndex = [1 .. SsaImpl::getMaxIndirectionsForType(f.getUnspecifiedType())] and
// Reads and writes of union fields are tracked using `UnionContent`.
not f.getDeclaringType() instanceof Union
} or
@@ -2111,7 +2108,9 @@ private newtype TContent =
// field can be read by any read of the union's fields. Again, the indirection index
// is 1-based (because 0 is considered the address).
indirectionIndex =
[1 .. max(Ssa::getMaxIndirectionsForType(getAFieldWithSize(u, bytes).getUnspecifiedType()))]
[1 .. max(SsaImpl::getMaxIndirectionsForType(getAFieldWithSize(u, bytes)
.getUnspecifiedType())
)]
)
} or
TElementContent(int indirectionIndex) {
@@ -2354,7 +2353,7 @@ module BarrierGuard<guardChecksSig/3 guardChecks> {
controls(g, result, edge)
)
or
result = Ssa::BarrierGuard<guardChecksNode/3>::getABarrierNode()
result = SsaImpl::BarrierGuard<guardChecksNode/3>::getABarrierNode()
}
/**
@@ -2453,7 +2452,7 @@ module BarrierGuard<guardChecksSig/3 guardChecks> {
)
or
result =
Ssa::BarrierGuardWithIntParam<guardChecksIndirectNode/4>::getABarrierNode(indirectionIndex)
SsaImpl::BarrierGuardWithIntParam<guardChecksIndirectNode/4>::getABarrierNode(indirectionIndex)
}
}
@@ -2490,7 +2489,7 @@ module InstructionBarrierGuard<instructionGuardChecksSig/3 instructionGuardCheck
controls(g, result, edge)
)
or
result = Ssa::BarrierGuard<guardChecksNode/3>::getABarrierNode()
result = SsaImpl::BarrierGuard<guardChecksNode/3>::getABarrierNode()
}
bindingset[value, n]
@@ -2520,7 +2519,7 @@ module InstructionBarrierGuard<instructionGuardChecksSig/3 instructionGuardCheck
)
or
result =
Ssa::BarrierGuardWithIntParam<guardChecksIndirectNode/4>::getABarrierNode(indirectionIndex)
SsaImpl::BarrierGuardWithIntParam<guardChecksIndirectNode/4>::getABarrierNode(indirectionIndex)
}
}
@@ -2576,3 +2575,16 @@ Function getARuntimeTarget(Call call) {
result = DataFlowImplCommon::viableCallableLambda(dfCall, _).asSourceCallable()
)
}
/** A module that provides static single assignment (SSA) information. */
module Ssa {
class Definition = SsaImpl::Definition;
class ExplicitDefinition = SsaImpl::ExplicitDefinition;
class DirectExplicitDefinition = SsaImpl::DirectExplicitDefinition;
class IndirectExplicitDefinition = SsaImpl::IndirectExplicitDefinition;
class PhiNode = SsaImpl::PhiNode;
}

View File

@@ -4,15 +4,15 @@
*/
private import semmle.code.cpp.ir.IR
private import semmle.code.cpp.ir.dataflow.DataFlow
private import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs
private import DataFlowUtil
private import DataFlowPrivate
private import SsaInternals as Ssa
private import SsaImpl as Ssa
/**
* Gets the instruction that goes into `input` for `call`.
*/
DataFlow::Node callInput(CallInstruction call, FunctionInput input) {
Node callInput(CallInstruction call, FunctionInput input) {
// An argument or qualifier
exists(int index |
result.asOperand() = call.getArgumentOperand(index) and
@@ -62,8 +62,8 @@ Node callOutput(CallInstruction call, FunctionOutput output) {
result = callOutputWithIndirectionIndex(call, output, _)
}
DataFlow::Node callInput(CallInstruction call, FunctionInput input, int d) {
exists(DataFlow::Node n | n = callInput(call, input) and d > 0 |
Node callInput(CallInstruction call, FunctionInput input, int d) {
exists(Node n | n = callInput(call, input) and d > 0 |
// An argument or qualifier
hasOperandAndIndex(result, n.asOperand(), d)
or
@@ -85,7 +85,7 @@ private IndirectReturnOutNode getIndirectReturnOutNode(CallInstruction call, int
*/
bindingset[d]
Node callOutput(CallInstruction call, FunctionOutput output, int d) {
exists(DataFlow::Node n, int indirectionIndex |
exists(Node n, int indirectionIndex |
n = callOutputWithIndirectionIndex(call, output, indirectionIndex) and d > 0
|
// The return value

View File

@@ -1,6 +1,6 @@
private import cpp
private import semmle.code.cpp.ir.IR
private import SsaInternals as Ssa
private import SsaImpl as Ssa
/**
* A property provider that hides all instructions and operands that are not relevant for IR dataflow.

View File

@@ -2,7 +2,7 @@ private import cpp
private import semmle.code.cpp.ir.IR
private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil
private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate
private import SsaInternals as Ssa
private import SsaImpl as Ssa
private import PrintIRUtilities
/**

View File

@@ -1,4 +1,4 @@
private import codeql.ssa.Ssa as SsaImplCommon
private import codeql.ssa.Ssa as Ssa
private import semmle.code.cpp.ir.IR
private import DataFlowUtil
private import DataFlowImplCommon as DataFlowImplCommon
@@ -12,7 +12,7 @@ private import semmle.code.cpp.ir.internal.IRCppLanguage
private import semmle.code.cpp.ir.dataflow.internal.ModelUtil
private import semmle.code.cpp.ir.implementation.raw.internal.TranslatedInitialization
private import DataFlowPrivate
import SsaInternalsCommon
import SsaImplCommon
private module SourceVariables {
cached
@@ -143,7 +143,14 @@ private predicate isGlobalUse(
min(int cand, VariableAddressInstruction vai |
vai.getEnclosingIRFunction() = f and
vai.getAstVariable() = v and
isDef(_, _, _, vai, cand, indirectionIndex)
(
isDef(_, _, _, vai, cand, indirectionIndex)
or
exists(Operand operand |
isUse(_, operand, vai, cand, indirectionIndex) and
isPostUpdateNodeImpl(operand, indirectionIndex)
)
)
|
cand
)
@@ -749,9 +756,9 @@ private predicate modeledFlowBarrier(Node n) {
partialFlowFunc = call.getStaticCallTarget() and
not partialFlowFunc.isPartialWrite(output)
|
call.getStaticCallTarget().(DataFlow::DataFlowFunction).hasDataFlow(_, output)
partialFlowFunc.(DataFlow::DataFlowFunction).hasDataFlow(_, output)
or
call.getStaticCallTarget().(Taint::TaintFunction).hasTaintFlow(_, output)
partialFlowFunc.(Taint::TaintFunction).hasTaintFlow(_, output)
)
or
exists(Operand operand, Instruction instr, Node n0, int indirectionIndex |
@@ -884,15 +891,14 @@ private predicate baseSourceVariableIsGlobal(
)
}
private module SsaInput implements SsaImplCommon::InputSig<Location> {
import InputSigCommon
private module SsaInput implements Ssa::InputSig<Location, IRCfg::BasicBlock> {
import SourceVariables
/**
* Holds if the `i`'th write in block `bb` writes to the variable `v`.
* `certain` is `true` if the write is guaranteed to overwrite the entire variable.
*/
predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) {
predicate variableWrite(IRCfg::BasicBlock bb, int i, SourceVariable v, boolean certain) {
DataFlowImplCommon::forceCachingInSameStage() and
(
exists(DefImpl def | def.hasIndexInBlock(v, bb, i) |
@@ -910,7 +916,7 @@ private module SsaInput implements SsaImplCommon::InputSig<Location> {
* Holds if the `i`'th read in block `bb` reads to the variable `v`.
* `certain` is `true` if the read is guaranteed. For C++, this is always the case.
*/
predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
predicate variableRead(IRCfg::BasicBlock bb, int i, SourceVariable v, boolean certain) {
exists(UseImpl use | use.hasIndexInBlock(bb, i, v) |
if use.isCertain() then certain = true else certain = false
)
@@ -958,9 +964,11 @@ class GlobalDef extends Definition {
GlobalLikeVariable getVariable() { result = impl.getVariable() }
}
private module SsaImpl = SsaImplCommon::Make<Location, SsaInput>;
private module SsaImpl = Ssa::Make<Location, IRCfg, SsaInput>;
private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationInputSig {
private import codeql.util.Boolean
class Expr extends Instruction {
Expr() {
exists(IRBlock bb, int i |
@@ -969,7 +977,7 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
)
}
predicate hasCfgNode(SsaInput::BasicBlock bb, int i) { bb.getInstruction(i) = this }
predicate hasCfgNode(IRCfg::BasicBlock bb, int i) { bb.getInstruction(i) = this }
}
Expr getARead(SsaImpl::Definition def) {
@@ -992,10 +1000,12 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
result instanceof FalseEdge
}
class GuardValue = Boolean;
class Guard instanceof IRGuards::IRGuardCondition {
string toString() { result = super.toString() }
predicate hasBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) {
predicate hasValueBranchEdge(IRCfg::BasicBlock bb1, IRCfg::BasicBlock bb2, GuardValue branch) {
exists(EdgeKind kind |
super.getBlock() = bb1 and
kind = getConditionalEdge(branch) and
@@ -1003,12 +1013,14 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
)
}
predicate controlsBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) {
this.hasBranchEdge(bb1, bb2, branch)
predicate valueControlsBranchEdge(
IRCfg::BasicBlock bb1, IRCfg::BasicBlock bb2, GuardValue branch
) {
this.hasValueBranchEdge(bb1, bb2, branch)
}
}
predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) {
predicate guardDirectlyControlsBlock(Guard guard, IRCfg::BasicBlock bb, GuardValue branch) {
guard.(IRGuards::IRGuardCondition).controls(bb, branch)
}
@@ -1037,7 +1049,8 @@ module BarrierGuardWithIntParam<guardChecksNodeSig/4 guardChecksNode> {
}
private predicate guardChecks(
DataFlowIntegrationInput::Guard g, SsaImpl::Definition def, boolean branch, int indirectionIndex
DataFlowIntegrationInput::Guard g, SsaImpl::Definition def,
DataFlowIntegrationInput::GuardValue branch, int indirectionIndex
) {
exists(UseImpl use |
guardChecksNode(g, use.getNode(), branch, indirectionIndex) and
@@ -1116,9 +1129,11 @@ class PhiNode extends Definition instanceof SsaImpl::PhiNode {
/** An static single assignment (SSA) definition. */
class Definition extends SsaImpl::Definition {
// TODO: Include prior definitions of uncertain writes or rename predicate
// i.e. the disjunct `SsaImpl::uncertainWriteDefinitionInput(this, result)`
private Definition getAPhiInputOrPriorDefinition() { result = this.(PhiNode).getAnInput() }
private Definition getAPhiInputOrPriorDefinition() {
result = this.(PhiNode).getAnInput()
or
SsaImpl::uncertainWriteDefinitionInput(this, result)
}
/**
* Gets a definition that ultimately defines this SSA definition and is
@@ -1129,6 +1144,36 @@ class Definition extends SsaImpl::Definition {
not result instanceof PhiNode
}
/** Gets an `Operand` that represents a use of this definition. */
Operand getAUse() {
exists(SourceVariable sv, IRBlock bb, int i, UseImpl use |
ssaDefReachesRead(sv, this, bb, i) and
use.hasIndexInBlock(bb, i, sv) and
result = use.getNode().asOperand()
)
}
/**
* Gets an `Operand` that represents an indirect use of this definition.
*
* The use is indirect because the operand represents a pointer that points
* to the value written by this definition. For example in:
* ```cpp
* 1. int x = 42;
* 2. int* p = &x;
* ```
* There is an `ExplicitDefinition` corresponding to `x = 42` on line 1 and
* the definition has an indirect use on line 2 because `&x` points to the
* value that was defined by the definition.
*/
Operand getAnIndirectUse(int indirectionIndex) {
exists(SourceVariable sv, IRBlock bb, int i, UseImpl use |
ssaDefReachesRead(sv, this, bb, i) and
use.hasIndexInBlock(bb, i, sv) and
result = use.getNode().asIndirectOperand(indirectionIndex)
)
}
/**
* INTERNAL: Do not use.
*/
@@ -1161,4 +1206,63 @@ class Definition extends SsaImpl::Definition {
Type getUnspecifiedType() { result = this.getUnderlyingType().getUnspecifiedType() }
}
/**
* An SSA definition that corresponds to an explicit definition.
*/
class ExplicitDefinition extends Definition, SsaImpl::WriteDefinition {
DefImpl def;
ExplicitDefinition() {
exists(IRBlock bb, int i, SourceVariable sv |
this.definesAt(sv, bb, i) and
def.hasIndexInBlock(sv, bb, i)
)
}
/**
* Gets the `Instruction` computing the value that is written to the
* associated SSA variable by this SSA definition.
*
* If `this.getIndirectionIndex() = 0` (i.e., if `this` is an instance of
* `DirectExplicitDefinition`) then the SSA variable is present in the source
* code.
* However, if `this.getIndirectionIndex() > 0` (i.e., if `this` is an
* instance of `IndirectExplicitDefinition`) then the SSA variable associated
* with this definition represents the memory pointed to by a variable in the
* source code.
*/
Instruction getAssignedInstruction() { result = def.getValue().asInstruction() }
}
/**
* An explicit SSA definition that writes an indirect value to a pointer.
*
* For example in:
* ```cpp
* int x = 42; // (1)
* int* p = &x; // (2)
* ```
* There are three `ExplicitDefinition`:
* 1. A `DirectExplicitDefinition` at (1) which writes `42` to the SSA variable
* corresponding to `x`.
* 2. A `DirectExplicitDefinition` at (2) which writes `&x` to the SSA variable
* corresponding to `p`.
* 3. A `IndirectExplicitDefinition` at (2) which writes `*&x` (i.e., `x`) to
* the SSA variable corresponding to `*p`.
*/
class IndirectExplicitDefinition extends ExplicitDefinition {
IndirectExplicitDefinition() { this.getIndirectionIndex() > 0 }
}
/**
* An SSA definition that corresponds to an explicit definition.
*
* Unlike `ExplicitDefinition` this class does not include indirect
* explicit definition. See `IndirectExplicitDefinition` if you want to include
* those.
*/
class DirectExplicitDefinition extends ExplicitDefinition {
DirectExplicitDefinition() { this.getIndirectionIndex() = 0 }
}
import SsaCached

View File

@@ -768,21 +768,3 @@ private module Cached {
}
import Cached
/**
* Inputs to the shared SSA library's parameterized module that is shared
* between the SSA pruning stage, and the final SSA stage.
*/
module InputSigCommon {
class BasicBlock extends IRBlock {
ControlFlowNode getNode(int i) { result = this.getInstruction(i) }
int length() { result = this.getInstructionCount() }
}
class ControlFlowNode = Instruction;
BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result.immediatelyDominates(bb) }
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
}

View File

@@ -5,7 +5,7 @@ private import semmle.code.cpp.models.interfaces.DataFlow
private import semmle.code.cpp.models.interfaces.SideEffect
private import DataFlowUtil
private import DataFlowPrivate
private import SsaInternals as Ssa
private import SsaImpl as Ssa
private import semmle.code.cpp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl
private import semmle.code.cpp.ir.dataflow.FlowSteps

View File

@@ -7,6 +7,7 @@ import Instruction
private import internal.IRBlockImports as Imports
import Imports::EdgeKind
private import Cached
private import codeql.controlflow.BasicBlock as BB
/**
* Holds if `block` is a block in `func` and `sortOverride`, `sortKey1`, and `sortKey2` are the
@@ -263,6 +264,49 @@ private predicate isEntryBlock(TIRBlock block) {
block = MkIRBlock(any(EnterFunctionInstruction enter))
}
module IRCfg implements BB::CfgSig<Language::Location> {
class ControlFlowNode = Instruction;
class SuccessorType = EdgeKind;
final private class FinalIRBlock = IRBlock;
class BasicBlock extends FinalIRBlock {
ControlFlowNode getNode(int i) { result = this.getInstruction(i) }
ControlFlowNode getLastNode() { result = super.getLastInstruction() }
int length() { result = this.getInstructionCount() }
BasicBlock getASuccessor() { result = super.getASuccessor() }
BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
predicate dominates(BasicBlock bb) { super.dominates(bb) }
BasicBlock getImmediateDominator() { result.immediatelyDominates(this) }
predicate inDominanceFrontier(BasicBlock df) { super.dominanceFrontier() = df }
predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
}
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { isEntryBlock(this) }
}
pragma[nomagic]
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
bb1.getASuccessor() = bb2 and
bb1 = bb2.getImmediateDominator() and
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
}
}
cached
private module Cached {
cached

View File

@@ -43,6 +43,23 @@ newtype TValueNumber =
} or
TUniqueValueNumber(IRFunction irFunc, Instruction instr) { uniqueValueNumber(instr, irFunc) }
/**
* A `ConvertInstruction` which converts data of type `T` to data of type `U`
* where `T` and `U` only differ in specifiers. For example, if `T` is `int`
* and `U` is `const T` this is a conversion from a non-const integer to a
* const integer.
*
* Generally, the value number of a converted value is different from the value
* number of an unconverted value, but conversions which only modify specifiers
* leave the resulting value bitwise identical to the old value.
*/
class TypePreservingConvertInstruction extends ConvertInstruction {
TypePreservingConvertInstruction() {
pragma[only_bind_out](this.getResultType().getUnspecifiedType()) =
pragma[only_bind_out](this.getUnary().getResultType().getUnspecifiedType())
}
}
/**
* A `CopyInstruction` whose source operand's value is congruent to the definition of that source
* operand.
@@ -216,6 +233,7 @@ private predicate unaryValueNumber(
not instr instanceof InheritanceConversionInstruction and
not instr instanceof CopyInstruction and
not instr instanceof FieldAddressInstruction and
not instr instanceof TypePreservingConvertInstruction and
instr.getOpcode() = opcode and
tvalueNumber(instr.getUnary()) = operand
}
@@ -351,6 +369,10 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
or
// The value number of a copy is just the value number of its source value.
result = tvalueNumber(instr.(CongruentCopyInstruction).getSourceValue())
or
// The value number of a type-preserving conversion is just the value
// number of the unconverted value.
result = tvalueNumber(instr.(TypePreservingConvertInstruction).getUnary())
)
)
}

View File

@@ -7,6 +7,7 @@ import Instruction
private import internal.IRBlockImports as Imports
import Imports::EdgeKind
private import Cached
private import codeql.controlflow.BasicBlock as BB
/**
* Holds if `block` is a block in `func` and `sortOverride`, `sortKey1`, and `sortKey2` are the
@@ -263,6 +264,49 @@ private predicate isEntryBlock(TIRBlock block) {
block = MkIRBlock(any(EnterFunctionInstruction enter))
}
module IRCfg implements BB::CfgSig<Language::Location> {
class ControlFlowNode = Instruction;
class SuccessorType = EdgeKind;
final private class FinalIRBlock = IRBlock;
class BasicBlock extends FinalIRBlock {
ControlFlowNode getNode(int i) { result = this.getInstruction(i) }
ControlFlowNode getLastNode() { result = super.getLastInstruction() }
int length() { result = this.getInstructionCount() }
BasicBlock getASuccessor() { result = super.getASuccessor() }
BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
predicate dominates(BasicBlock bb) { super.dominates(bb) }
BasicBlock getImmediateDominator() { result.immediatelyDominates(this) }
predicate inDominanceFrontier(BasicBlock df) { super.dominanceFrontier() = df }
predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
}
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { isEntryBlock(this) }
}
pragma[nomagic]
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
bb1.getASuccessor() = bb2 and
bb1 = bb2.getImmediateDominator() and
forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
}
}
cached
private module Cached {
cached

Some files were not shown because too many files have changed in this diff Show More