From 3a885eaf9f64b190e89d420f4443e23ccb115951 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Mon, 20 May 2024 11:58:55 +0100 Subject: [PATCH 01/70] Insecure Helmet middle configuration - frameguard or CSP to 'false' --- .../src/Security/CWE-693/InsecureHelmet.qhelp | 71 +++++++++++++++++++ .../ql/src/Security/CWE-693/InsecureHelmet.ql | 36 ++++++++++ 2 files changed, 107 insertions(+) create mode 100644 javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp create mode 100644 javascript/ql/src/Security/CWE-693/InsecureHelmet.ql diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp new file mode 100644 index 000000000000..f2b4deeefc1e --- /dev/null +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -0,0 +1,71 @@ +<!DOCTYPE qhelp SYSTEM "qhelp.dtd"> +<qhelp> + <overview> + <p> + <a href="https://helmetjs.github.io/">Helmet</a> is a collection of middleware functions for securing Express apps. It sets various HTTP headers to guard against common web vulnerabilities. + + This query detects Helmet misconfigurations that can lead to security vulnerabilities, specifically: + + <ul> + <li>Disabling frame protection</li> + <li>Disabling Content Security Policy</li> + </ul> + + Content Security Policy (CSP) helps spot and prevent injection attacks such as Cross-Site Scripting (XSS). + + Removing frame protections exposes an application to attacks such as clickjacking, where an attacker can trick a user into clicking on a button or link on a targeted page when they intended to click on the page carrying out the attack. + </p> + </overview> + <recommendation> + <p> + To help mitigate these vulnerabilities, ensure that the following Helmet functions are not disabled, and are configured appropriately to your application: + <ul> + <li><code>frameguard</code></li> + <li><code>contentSecurityPolicy</code></li> + </ul> + </p> + </recommendation> + <example> + <p> + The following code snippet demonstrates Helmet configured in an insecure manner: + <code class="language-javascript"> + const helmet = require('helmet'); + app.use(helmet({ + frameguard: false, + contentSecurityPolicy: false + })); + </code> + </p> + <p> + In this example, the defaults are used, which enables frame protection and a default Content Security Policy. + + <code class="language-javascript"> + app.use(helmet()); + </code> + + You can also enable a custom Content Security Policy by passing an object to the <code>contentSecurityPolicy</code> key. For example, taken from the <a href="https://helmetjs.github.io/#content-security-policy">Helmet docs: + + <code class="language-javascript"> + app.use( + helmet({ + contentSecurityPolicy: { + directives: { + "script-src": ["'self'", "example.com"], + "style-src": null, + }, + }, + }) + ); + <code> + <p> + + </p> + </example> + <references> + <ul> + <li> + <a href="https://helmetjs.github.io/">helmet.js website</a> + </li> + </ul> + </references> +</qhelp> \ No newline at end of file diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql new file mode 100644 index 000000000000..f059b37e783d --- /dev/null +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -0,0 +1,36 @@ +/** + * @name Insecure configuration of Helmet security middleware + * @description The Helmet middleware is used to set security-related HTTP headers in Express applications. This query finds instances where the middleware is configured with important security features disabled. + * @kind problem + * @problem.severity error + * @security-severity 5.0 + * @precision high + * @id javascript/insecure-helmet-configuration + * @tags security + * cwe-693 + * cwe-1021 + */ + +import semmle.javascript.frameworks.ExpressModules + +class HelmetProperty extends Property { + HelmetProperty() { + exists(ExpressLibraries::HelmetRouteHandler helmet | + helmet.(DataFlow::CallNode).getAnArgument().asExpr().(ObjectExpr).getAProperty() = this + ) + } + + predicate isFalse() { this.getInit().(BooleanLiteral).getBoolValue() = false } + + predicate isImportantSecuritySetting() { + this.getName() in ["frameguard", "contentSecurityPolicy"] + // read from data extensions to allow enforcing other settings + // TODO + } +} + +from HelmetProperty helmetSetting +where + helmetSetting.isFalse() and + helmetSetting.isImportantSecuritySetting() +select helmetSetting, "Helmet route handler, called with $@ set to 'false'", helmetSetting, helmetSetting.getName() From 8300aeb0a0a9189f717ac2bdee4ae1374c3b4ef0 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Mon, 20 May 2024 12:05:42 +0100 Subject: [PATCH 02/70] Tests for InsecureHelmet --- .../Security/CWE-693/InsecureHelment.expected | 2 ++ .../Security/CWE-693/InsecureHelment.qlref | 1 + .../Security/CWE-693/InsecureHelmetBad.js | 17 +++++++++++++++++ .../Security/CWE-693/InsecureHelmetGood.js | 14 ++++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.expected create mode 100644 javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.qlref create mode 100644 javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmetBad.js create mode 100644 javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmetGood.js diff --git a/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.expected b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.expected new file mode 100644 index 000000000000..7368d96f3d43 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.expected @@ -0,0 +1,2 @@ +| InsecureHelmetBad.js:7:5:7:32 | content ... : false | Helmet route handler, called with $@ set to 'false' | InsecureHelmetBad.js:7:5:7:32 | content ... : false | contentSecurityPolicy | +| InsecureHelmetBad.js:8:5:8:21 | frameguard: false | Helmet route handler, called with $@ set to 'false' | InsecureHelmetBad.js:8:5:8:21 | frameguard: false | frameguard | diff --git a/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.qlref b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.qlref new file mode 100644 index 000000000000..9212b2674fcf --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.qlref @@ -0,0 +1 @@ +Security/CWE-693/InsecureHelmet.ql \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmetBad.js b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmetBad.js new file mode 100644 index 000000000000..d9257999ef0b --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmetBad.js @@ -0,0 +1,17 @@ +const express = require("express"); +const helmet = require("helmet"); + +const app = express(); + +app.use(helmet({ + contentSecurityPolicy: false, // BAD: switch off default CSP + frameguard: false // BAD: switch off default frameguard +})); + +app.get("/", (req, res) => { + res.send("Hello, world!"); +}); + +app.listen(3000, () => { + console.log("App is listening on port 3000"); +}); diff --git a/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmetGood.js b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmetGood.js new file mode 100644 index 000000000000..609c1fc2763c --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmetGood.js @@ -0,0 +1,14 @@ +const express = require("express"); +const helmet = require("helmet"); + +const app = express(); + +app.use(helmet()); // GOOD: use the defaults + +app.get("/", (req, res) => { + res.send("Hello, world!"); +}); + +app.listen(3000, () => { + console.log("App is listening on port 3000"); +}); From 83037b11951d65294f07934ad509fadfd8874456 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Tue, 21 May 2024 13:51:13 +0100 Subject: [PATCH 03/70] Adjust structure to avoid warnings about message --- .../ql/src/Security/CWE-693/InsecureHelmet.ql | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index f059b37e783d..ca27b717f186 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -14,12 +14,14 @@ import semmle.javascript.frameworks.ExpressModules class HelmetProperty extends Property { + ExpressLibraries::HelmetRouteHandler helmet; + HelmetProperty() { - exists(ExpressLibraries::HelmetRouteHandler helmet | - helmet.(DataFlow::CallNode).getAnArgument().asExpr().(ObjectExpr).getAProperty() = this - ) + helmet.(DataFlow::CallNode).getAnArgument().asExpr().(ObjectExpr).getAProperty() = this } + ExpressLibraries::HelmetRouteHandler getHelmet() { result = helmet } + predicate isFalse() { this.getInit().(BooleanLiteral).getBoolValue() = false } predicate isImportantSecuritySetting() { @@ -29,8 +31,10 @@ class HelmetProperty extends Property { } } -from HelmetProperty helmetSetting +from HelmetProperty helmetSetting, ExpressLibraries::HelmetRouteHandler helmet where helmetSetting.isFalse() and - helmetSetting.isImportantSecuritySetting() -select helmetSetting, "Helmet route handler, called with $@ set to 'false'", helmetSetting, helmetSetting.getName() + helmetSetting.isImportantSecuritySetting() and + helmetSetting.getHelmet() = helmet +select helmet, "Helmet route handler, called with $@ set to 'false'.", helmetSetting, + helmetSetting.getName() From bda794fde762e8e915b0baa6e4887e149c99fe8e Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Tue, 21 May 2024 14:34:58 +0100 Subject: [PATCH 04/70] Fixed wrong filenames in the InsecureHelmet tests --- .../CWE-693/{InsecureHelment.expected => InsecureHelmet.expected} | 0 .../CWE-693/{InsecureHelment.qlref => InsecureHelmet.qlref} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename javascript/ql/test/query-tests/Security/CWE-693/{InsecureHelment.expected => InsecureHelmet.expected} (100%) rename javascript/ql/test/query-tests/Security/CWE-693/{InsecureHelment.qlref => InsecureHelmet.qlref} (100%) diff --git a/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.expected b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmet.expected similarity index 100% rename from javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.expected rename to javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmet.expected diff --git a/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.qlref b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmet.qlref similarity index 100% rename from javascript/ql/test/query-tests/Security/CWE-693/InsecureHelment.qlref rename to javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmet.qlref From 68e21a594aad539c936ed19bdbecdafc9cc84bdb Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Tue, 21 May 2024 14:35:18 +0100 Subject: [PATCH 05/70] Fixed query help formatting issues --- .../src/Security/CWE-693/InsecureHelmet.qhelp | 80 ++++++++++--------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index f2b4deeefc1e..b54047ba4ae4 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -5,12 +5,14 @@ <a href="https://helmetjs.github.io/">Helmet</a> is a collection of middleware functions for securing Express apps. It sets various HTTP headers to guard against common web vulnerabilities. This query detects Helmet misconfigurations that can lead to security vulnerabilities, specifically: + </p> - <ul> - <li>Disabling frame protection</li> - <li>Disabling Content Security Policy</li> - </ul> + <ul> + <li>Disabling frame protection</li> + <li>Disabling Content Security Policy</li> + </ul> + <p> Content Security Policy (CSP) helps spot and prevent injection attacks such as Cross-Site Scripting (XSS). Removing frame protections exposes an application to attacks such as clickjacking, where an attacker can trick a user into clicking on a button or link on a targeted page when they intended to click on the page carrying out the attack. @@ -19,53 +21,55 @@ <recommendation> <p> To help mitigate these vulnerabilities, ensure that the following Helmet functions are not disabled, and are configured appropriately to your application: - <ul> - <li><code>frameguard</code></li> - <li><code>contentSecurityPolicy</code></li> - </ul> </p> + + <ul> + <li><code>frameguard</code></li> + <li><code>contentSecurityPolicy</code></li> + </ul> </recommendation> <example> <p> The following code snippet demonstrates Helmet configured in an insecure manner: - <code class="language-javascript"> - const helmet = require('helmet'); - app.use(helmet({ - frameguard: false, - contentSecurityPolicy: false - })); - </code> </p> + + <pre> + const helmet = require('helmet'); + app.use(helmet({ + frameguard: false, + contentSecurityPolicy: false + })); + </pre> + <p> In this example, the defaults are used, which enables frame protection and a default Content Security Policy. + </p> - <code class="language-javascript"> - app.use(helmet()); - </code> - - You can also enable a custom Content Security Policy by passing an object to the <code>contentSecurityPolicy</code> key. For example, taken from the <a href="https://helmetjs.github.io/#content-security-policy">Helmet docs: + <pre> + app.use(helmet()); + </pre> - <code class="language-javascript"> - app.use( - helmet({ - contentSecurityPolicy: { - directives: { - "script-src": ["'self'", "example.com"], - "style-src": null, - }, - }, - }) - ); - <code> <p> - + You can also enable a custom Content Security Policy by passing an object to the <code>contentSecurityPolicy</code> key. For example, taken from the <a href="https://helmetjs.github.io/#content-security-policy">Helmet docs</a>: </p> + + <pre> + app.use( + helmet({ + contentSecurityPolicy: { + directives: { + "script-src": ["'self'", "example.com"], + "style-src": null, + }, + }, + }) + ); + </pre> + </example> <references> - <ul> - <li> - <a href="https://helmetjs.github.io/">helmet.js website</a> - </li> - </ul> + <li> + <a href="https://helmetjs.github.io/">helmet.js website</a> + </li> </references> </qhelp> \ No newline at end of file From f5d465f08adb6077abf5508838f2025d5623eebb Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:32:11 +0100 Subject: [PATCH 06/70] Added data extension to allow setting extra required Helmet features --- .../src/Security/CWE-693/InsecureHelmet.qhelp | 22 +++++++++++++++++-- .../ql/src/Security/CWE-693/InsecureHelmet.ql | 19 +++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index b54047ba4ae4..d0550823ab6e 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -2,7 +2,7 @@ <qhelp> <overview> <p> - <a href="https://helmetjs.github.io/">Helmet</a> is a collection of middleware functions for securing Express apps. It sets various HTTP headers to guard against common web vulnerabilities. + <a href="https://helmetjs.github.io/">Helmet</a> is a collection of middleware functions for securing Express apps. It sets various HTTP headers to guard against common web vulnerabilities.<br> This query detects Helmet misconfigurations that can lead to security vulnerabilities, specifically: </p> @@ -13,10 +13,28 @@ </ul> <p> - Content Security Policy (CSP) helps spot and prevent injection attacks such as Cross-Site Scripting (XSS). + Content Security Policy (CSP) helps spot and prevent injection attacks such as Cross-Site Scripting (XSS).<br> Removing frame protections exposes an application to attacks such as clickjacking, where an attacker can trick a user into clicking on a button or link on a targeted page when they intended to click on the page carrying out the attack. </p> + + <p> + Users of the query can extend the set of required Helmet features by adding additional checks for them, using CodeQL <a href="https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/">data extensions</a>. + </p> + + <pre> + extensions: + - addsTo: + pack: codeql/javascript-all + extensible: requiredHelmetSecuritySetting + data: + - name: "frameguard" + </pre> + + <p> + Note: <code>frameguard</code> is an example: the query already enforces this setting, so it is not necessary to add it to the data extension. + </p> + </overview> <recommendation> <p> diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index ca27b717f186..b8e3bb08131b 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -27,10 +27,27 @@ class HelmetProperty extends Property { predicate isImportantSecuritySetting() { this.getName() in ["frameguard", "contentSecurityPolicy"] // read from data extensions to allow enforcing other settings - // TODO + or requiredHelmetSecuritySetting(this.getName()) } } +/* + * Extend the required Helmet security settings using data extensions. + * Docs: https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/ + * For example: + +extensions: + - addsTo: + pack: codeql/javascript-all + extensible: requiredHelmetSecuritySetting + data: + - name: "frameguard" + + * Note: `frameguard` is an example: the query already enforces this setting, so it is not necessary to add it to the data extension. + + */ +extensible predicate requiredHelmetSecuritySetting(string name); + from HelmetProperty helmetSetting, ExpressLibraries::HelmetRouteHandler helmet where helmetSetting.isFalse() and From 465d64a810a1d77cccfd6f1d63335530e9967959 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:34:45 +0100 Subject: [PATCH 07/70] Removed br tags --- javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index d0550823ab6e..8c0484d8a9e9 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -2,7 +2,7 @@ <qhelp> <overview> <p> - <a href="https://helmetjs.github.io/">Helmet</a> is a collection of middleware functions for securing Express apps. It sets various HTTP headers to guard against common web vulnerabilities.<br> + <a href="https://helmetjs.github.io/">Helmet</a> is a collection of middleware functions for securing Express apps. It sets various HTTP headers to guard against common web vulnerabilities. This query detects Helmet misconfigurations that can lead to security vulnerabilities, specifically: </p> @@ -13,7 +13,7 @@ </ul> <p> - Content Security Policy (CSP) helps spot and prevent injection attacks such as Cross-Site Scripting (XSS).<br> + Content Security Policy (CSP) helps spot and prevent injection attacks such as Cross-Site Scripting (XSS). Removing frame protections exposes an application to attacks such as clickjacking, where an attacker can trick a user into clicking on a button or link on a targeted page when they intended to click on the page carrying out the attack. </p> From 7136763c37c4f993fde037df7c44bc9c1133fec5 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:36:39 +0100 Subject: [PATCH 08/70] Formatting --- .../ql/src/Security/CWE-693/InsecureHelmet.ql | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index b8e3bb08131b..70d4b41e096c 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -26,8 +26,9 @@ class HelmetProperty extends Property { predicate isImportantSecuritySetting() { this.getName() in ["frameguard", "contentSecurityPolicy"] + or // read from data extensions to allow enforcing other settings - or requiredHelmetSecuritySetting(this.getName()) + requiredHelmetSecuritySetting(this.getName()) } } @@ -35,17 +36,17 @@ class HelmetProperty extends Property { * Extend the required Helmet security settings using data extensions. * Docs: https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/ * For example: - -extensions: - - addsTo: - pack: codeql/javascript-all - extensible: requiredHelmetSecuritySetting - data: - - name: "frameguard" - - * Note: `frameguard` is an example: the query already enforces this setting, so it is not necessary to add it to the data extension. - + * + * extensions: + * - addsTo: + * pack: codeql/javascript-all + * extensible: requiredHelmetSecuritySetting + * data: + * - name: "frameguard" + * + * Note: `frameguard` is an example: the query already enforces this setting, so it is not necessary to add it to the data extension. */ + extensible predicate requiredHelmetSecuritySetting(string name); from HelmetProperty helmetSetting, ExpressLibraries::HelmetRouteHandler helmet From 975811ae5973f537ca785ef0c453fb4b166b1205 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:50:06 +0100 Subject: [PATCH 09/70] Change layout of qhelp example code --- .../src/Security/CWE-693/InsecureHelmet.qhelp | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index 8c0484d8a9e9..b2f87f9aeacd 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -23,12 +23,12 @@ </p> <pre> - extensions: - - addsTo: - pack: codeql/javascript-all - extensible: requiredHelmetSecuritySetting - data: - - name: "frameguard" +extensions: +- addsTo: + pack: codeql/javascript-all + extensible: requiredHelmetSecuritySetting +data: + - name: "frameguard" </pre> <p> @@ -52,11 +52,11 @@ </p> <pre> - const helmet = require('helmet'); - app.use(helmet({ - frameguard: false, - contentSecurityPolicy: false - })); +const helmet = require('helmet'); +app.use(helmet({ + frameguard: false, + contentSecurityPolicy: false +})); </pre> <p> @@ -64,7 +64,7 @@ </p> <pre> - app.use(helmet()); +app.use(helmet()); </pre> <p> @@ -72,16 +72,16 @@ </p> <pre> - app.use( - helmet({ - contentSecurityPolicy: { - directives: { - "script-src": ["'self'", "example.com"], - "style-src": null, - }, - }, - }) - ); +app.use( + helmet({ + contentSecurityPolicy: { + directives: { + "script-src": ["'self'", "example.com"], + "style-src": null, + }, + }, + }) +); </pre> </example> From da9e1e61a4efa16001e6bc57faaf318bbf595f94 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Tue, 18 Jun 2024 19:50:06 +0100 Subject: [PATCH 10/70] Moved examples into separate files --- .../src/Security/CWE-693/InsecureHelmet.qhelp | 25 +++---------------- .../CWE-693/examples/helmet_custom.js | 10 ++++++++ .../CWE-693/examples/helmet_default.js | 1 + .../CWE-693/examples/helmet_insecure.js | 6 +++++ 4 files changed, 20 insertions(+), 22 deletions(-) create mode 100644 javascript/ql/src/Security/CWE-693/examples/helmet_custom.js create mode 100644 javascript/ql/src/Security/CWE-693/examples/helmet_default.js create mode 100644 javascript/ql/src/Security/CWE-693/examples/helmet_insecure.js diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index b2f87f9aeacd..f0813ffecd71 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -51,38 +51,19 @@ data: The following code snippet demonstrates Helmet configured in an insecure manner: </p> - <pre> -const helmet = require('helmet'); -app.use(helmet({ - frameguard: false, - contentSecurityPolicy: false -})); - </pre> + <sample src="examples/helmet_insecure.js" /> <p> In this example, the defaults are used, which enables frame protection and a default Content Security Policy. </p> - <pre> -app.use(helmet()); - </pre> + <sample src="examples/helmet_default.js" /> <p> You can also enable a custom Content Security Policy by passing an object to the <code>contentSecurityPolicy</code> key. For example, taken from the <a href="https://helmetjs.github.io/#content-security-policy">Helmet docs</a>: </p> - <pre> -app.use( - helmet({ - contentSecurityPolicy: { - directives: { - "script-src": ["'self'", "example.com"], - "style-src": null, - }, - }, - }) -); - </pre> + <sample src="examples/helmet_custom.js" /> </example> <references> diff --git a/javascript/ql/src/Security/CWE-693/examples/helmet_custom.js b/javascript/ql/src/Security/CWE-693/examples/helmet_custom.js new file mode 100644 index 000000000000..5b9e25033f22 --- /dev/null +++ b/javascript/ql/src/Security/CWE-693/examples/helmet_custom.js @@ -0,0 +1,10 @@ +app.use( + helmet({ + contentSecurityPolicy: { + directives: { + "script-src": ["'self'", "example.com"], + "style-src": null, + }, + }, + }) +); \ No newline at end of file diff --git a/javascript/ql/src/Security/CWE-693/examples/helmet_default.js b/javascript/ql/src/Security/CWE-693/examples/helmet_default.js new file mode 100644 index 000000000000..98936520dcb7 --- /dev/null +++ b/javascript/ql/src/Security/CWE-693/examples/helmet_default.js @@ -0,0 +1 @@ +app.use(helmet()); \ No newline at end of file diff --git a/javascript/ql/src/Security/CWE-693/examples/helmet_insecure.js b/javascript/ql/src/Security/CWE-693/examples/helmet_insecure.js new file mode 100644 index 000000000000..62852b9f4823 --- /dev/null +++ b/javascript/ql/src/Security/CWE-693/examples/helmet_insecure.js @@ -0,0 +1,6 @@ +const helmet = require('helmet'); + +app.use(helmet({ + frameguard: false, + contentSecurityPolicy: false +})); \ No newline at end of file From 81ef255a87553ef361cd8b6bca8e64262a3cde76 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:09:50 +0100 Subject: [PATCH 11/70] Change to helmetProperty from helmetSetting variable name --- javascript/ql/src/Security/CWE-693/InsecureHelmet.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index 70d4b41e096c..c4bb5b5ab520 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -49,7 +49,7 @@ class HelmetProperty extends Property { extensible predicate requiredHelmetSecuritySetting(string name); -from HelmetProperty helmetSetting, ExpressLibraries::HelmetRouteHandler helmet +from HelmetProperty helmetProperty, ExpressLibraries::HelmetRouteHandler helmet where helmetSetting.isFalse() and helmetSetting.isImportantSecuritySetting() and From f4691b191934b853eddafb000a76087ac8d30367 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:11:06 +0100 Subject: [PATCH 12/70] Changed to more-modern Dataflow libraries --- javascript/ql/src/Security/CWE-693/InsecureHelmet.ql | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index c4bb5b5ab520..90ac834575db 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -13,16 +13,18 @@ import semmle.javascript.frameworks.ExpressModules -class HelmetProperty extends Property { +class HelmetProperty extends DataFlow::Node instanceof DataFlow::PropWrite { ExpressLibraries::HelmetRouteHandler helmet; HelmetProperty() { - helmet.(DataFlow::CallNode).getAnArgument().asExpr().(ObjectExpr).getAProperty() = this + this = helmet.(DataFlow::CallNode).getAnArgument().getALocalSource().getAPropertyWrite() } ExpressLibraries::HelmetRouteHandler getHelmet() { result = helmet } - predicate isFalse() { this.getInit().(BooleanLiteral).getBoolValue() = false } + predicate isFalse() { DataFlow::PropWrite.super.getRhs().mayHaveBooleanValue(true) } + + string getName() { result = DataFlow::PropWrite.super.getPropertyName() } predicate isImportantSecuritySetting() { this.getName() in ["frameguard", "contentSecurityPolicy"] From de96d3951d288788519afff210ad183cf860574b Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:15:06 +0100 Subject: [PATCH 13/70] Renamed to helmetProperty everywhere --- javascript/ql/src/Security/CWE-693/InsecureHelmet.ql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index 90ac834575db..debcd9c3ddd5 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -53,8 +53,8 @@ extensible predicate requiredHelmetSecuritySetting(string name); from HelmetProperty helmetProperty, ExpressLibraries::HelmetRouteHandler helmet where - helmetSetting.isFalse() and - helmetSetting.isImportantSecuritySetting() and - helmetSetting.getHelmet() = helmet -select helmet, "Helmet route handler, called with $@ set to 'false'.", helmetSetting, - helmetSetting.getName() + helmetProperty.isFalse() and + helmetProperty.isImportantSecuritySetting() and + helmetProperty.getHelmet() = helmet +select helmet, "Helmet route handler, called with $@ set to 'false'.", helmetProperty, +helmetProperty.getName() From 8a3cec49778fa97d572c2e0c46fe3867783efd43 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 19 Jun 2024 11:38:20 +0100 Subject: [PATCH 14/70] Fix formatting for check --- javascript/ql/src/Security/CWE-693/InsecureHelmet.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index debcd9c3ddd5..c1ff6ca3e395 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -57,4 +57,4 @@ where helmetProperty.isImportantSecuritySetting() and helmetProperty.getHelmet() = helmet select helmet, "Helmet route handler, called with $@ set to 'false'.", helmetProperty, -helmetProperty.getName() + helmetProperty.getName() From d142f830da8097c28722b79ef2920b8a2e2545dc Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 19 Jun 2024 12:04:32 +0100 Subject: [PATCH 15/70] Change note and changed name of query in `.ql` file --- javascript/ql/src/Security/CWE-693/InsecureHelmet.ql | 2 +- .../ql/src/change-notes/2024-06-19-insecure-helmet-config.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 javascript/ql/src/change-notes/2024-06-19-insecure-helmet-config.md diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index c1ff6ca3e395..3a2643d603ee 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -5,7 +5,7 @@ * @problem.severity error * @security-severity 5.0 * @precision high - * @id javascript/insecure-helmet-configuration + * @id js/insecure-helmet-configuration * @tags security * cwe-693 * cwe-1021 diff --git a/javascript/ql/src/change-notes/2024-06-19-insecure-helmet-config.md b/javascript/ql/src/change-notes/2024-06-19-insecure-helmet-config.md new file mode 100644 index 000000000000..bee7ccb8fb94 --- /dev/null +++ b/javascript/ql/src/change-notes/2024-06-19-insecure-helmet-config.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* Added a new query, `js/insecure-helmet-configuration`, to detect instances where Helmet middleware is configured with important security features disabled. From 252c9e9416c9b923ac98bdf0a53c09ce32e9c6a9 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:27:17 +0100 Subject: [PATCH 16/70] Added data extension to set defaults, updated help, added README to explain customization --- .../helmet/Helmet.Required.Setting.model.yml | 7 ++++ .../src/Security/CWE-693/InsecureHelmet.qhelp | 12 +++---- .../ql/src/Security/CWE-693/InsecureHelmet.ql | 26 ++++---------- javascript/ql/src/Security/CWE-693/README.md | 36 +++++++++++++++++++ 4 files changed, 54 insertions(+), 27 deletions(-) create mode 100644 javascript/ql/lib/semmle/javascript/frameworks/helmet/Helmet.Required.Setting.model.yml create mode 100644 javascript/ql/src/Security/CWE-693/README.md diff --git a/javascript/ql/lib/semmle/javascript/frameworks/helmet/Helmet.Required.Setting.model.yml b/javascript/ql/lib/semmle/javascript/frameworks/helmet/Helmet.Required.Setting.model.yml new file mode 100644 index 000000000000..ab01ec5206df --- /dev/null +++ b/javascript/ql/lib/semmle/javascript/frameworks/helmet/Helmet.Required.Setting.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/javascript-queries + extensible: requiredHelmetSecuritySetting + data: + - ["frameguard"] + - ["contentSecurityPolicy"] diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index f0813ffecd71..c09978e13d15 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -22,14 +22,12 @@ Users of the query can extend the set of required Helmet features by adding additional checks for them, using CodeQL <a href="https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/">data extensions</a>. </p> - <pre> -extensions: -- addsTo: - pack: codeql/javascript-all - extensible: requiredHelmetSecuritySetting + <pre>extensions: + - addsTo: + pack: codeql/javascript-all + extensible: requiredHelmetSecuritySetting data: - - name: "frameguard" - </pre> + - ["frameguard"]</pre> <p> Note: <code>frameguard</code> is an example: the query already enforces this setting, so it is not necessary to add it to the data extension. diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index 3a2643d603ee..b5495714ac72 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -11,6 +11,8 @@ * cwe-1021 */ +import javascript +import DataFlow import semmle.javascript.frameworks.ExpressModules class HelmetProperty extends DataFlow::Node instanceof DataFlow::PropWrite { @@ -22,33 +24,17 @@ class HelmetProperty extends DataFlow::Node instanceof DataFlow::PropWrite { ExpressLibraries::HelmetRouteHandler getHelmet() { result = helmet } - predicate isFalse() { DataFlow::PropWrite.super.getRhs().mayHaveBooleanValue(true) } + predicate isFalse() { DataFlow::PropWrite.super.getRhs().mayHaveBooleanValue(false) } string getName() { result = DataFlow::PropWrite.super.getPropertyName() } predicate isImportantSecuritySetting() { - this.getName() in ["frameguard", "contentSecurityPolicy"] - or - // read from data extensions to allow enforcing other settings + // read from data extensions to allow enforcing custom settings + // defaults are located in javascript/ql/lib/semmle/frameworks/helmet/Helmet.Required.Setting.model.yml requiredHelmetSecuritySetting(this.getName()) } } -/* - * Extend the required Helmet security settings using data extensions. - * Docs: https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/ - * For example: - * - * extensions: - * - addsTo: - * pack: codeql/javascript-all - * extensible: requiredHelmetSecuritySetting - * data: - * - name: "frameguard" - * - * Note: `frameguard` is an example: the query already enforces this setting, so it is not necessary to add it to the data extension. - */ - extensible predicate requiredHelmetSecuritySetting(string name); from HelmetProperty helmetProperty, ExpressLibraries::HelmetRouteHandler helmet @@ -56,5 +42,5 @@ where helmetProperty.isFalse() and helmetProperty.isImportantSecuritySetting() and helmetProperty.getHelmet() = helmet -select helmet, "Helmet route handler, called with $@ set to 'false'.", helmetProperty, +select helmet, "Helmet security middleware, configured with security setting $@ set to 'false', which disables enforcing that feature.", helmetProperty, helmetProperty.getName() diff --git a/javascript/ql/src/Security/CWE-693/README.md b/javascript/ql/src/Security/CWE-693/README.md new file mode 100644 index 000000000000..0ca0afd74bb0 --- /dev/null +++ b/javascript/ql/src/Security/CWE-693/README.md @@ -0,0 +1,36 @@ +# Insecure Helmet Configuration - customizations + +You can extend the required [Helmet security settings](https://helmetjs.github.io/) using [data extensions](https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/). + +They are defaulted to just `frameguard` and `contentSecurityPolicy`, but you can add more using this method, to require them not to be set to `false` (which explicitly disables them) in the Helmet configuration. + +For example, this YAML model can be used inside a CodeQL model pack to require `frameguard` and `contentSecurityPolicy`: + +```yaml +extensions: + - addsTo: + pack: codeql/javascript-all + extensible: requiredHelmetSecuritySetting + data: + - ["frameguard"] + - ["contentSecurityPolicy"] +``` + +Note: Using `frameguard` and `contentSecurityPolicy` is an example: the query already enforces these, so it is not necessary to add it with your own data extension. + +A suitable model pack might be: + +```yaml +name: my-org/javascript-helmet-insecure-config-model-pack +version: 1.0.0 +extensionTargets: + codeql/java-all: '*' +dataExtensions: + - models/**/*.yml +``` + +## References + +- [Helmet security settings](https://helmetjs.github.io/) +- [Customizing library models for javascript](https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/) +- [Creating and working with CodeQL packs](https://docs.github.com/en/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-and-working-with-codeql-packs#creating-a-codeql-model-pack) From 26f1b367363b6fc1f6abc2b051bb0b22c2cf033d Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:41:58 +0100 Subject: [PATCH 17/70] Fixed formatting --- javascript/ql/src/Security/CWE-693/InsecureHelmet.ql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index b5495714ac72..39159b72406d 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -42,5 +42,6 @@ where helmetProperty.isFalse() and helmetProperty.isImportantSecuritySetting() and helmetProperty.getHelmet() = helmet -select helmet, "Helmet security middleware, configured with security setting $@ set to 'false', which disables enforcing that feature.", helmetProperty, - helmetProperty.getName() +select helmet, + "Helmet security middleware, configured with security setting $@ set to 'false', which disables enforcing that feature.", + helmetProperty, helmetProperty.getName() From a07639f4f6750ddf4be63f6ced724d36b9ae7c66 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:43:41 +0100 Subject: [PATCH 18/70] Set severity to 7.0, in line with other configuration queries --- javascript/ql/src/Security/CWE-693/InsecureHelmet.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index 39159b72406d..c4437d4913d4 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -3,7 +3,7 @@ * @description The Helmet middleware is used to set security-related HTTP headers in Express applications. This query finds instances where the middleware is configured with important security features disabled. * @kind problem * @problem.severity error - * @security-severity 5.0 + * @security-severity 7.0 * @precision high * @id js/insecure-helmet-configuration * @tags security From 1ecd72727ddacb1380cb7c7698bfbaac398728de Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:59:43 +0100 Subject: [PATCH 19/70] Renamed README to CUSTOMIZING, removed details from qhelp and referenced md doc instead --- .../Security/CWE-693/{README.md => CUSTOMIZING.md} | 4 ++-- .../ql/src/Security/CWE-693/InsecureHelmet.qhelp | 13 +------------ 2 files changed, 3 insertions(+), 14 deletions(-) rename javascript/ql/src/Security/CWE-693/{README.md => CUSTOMIZING.md} (78%) diff --git a/javascript/ql/src/Security/CWE-693/README.md b/javascript/ql/src/Security/CWE-693/CUSTOMIZING.md similarity index 78% rename from javascript/ql/src/Security/CWE-693/README.md rename to javascript/ql/src/Security/CWE-693/CUSTOMIZING.md index 0ca0afd74bb0..34ae2851a855 100644 --- a/javascript/ql/src/Security/CWE-693/README.md +++ b/javascript/ql/src/Security/CWE-693/CUSTOMIZING.md @@ -1,6 +1,6 @@ # Insecure Helmet Configuration - customizations -You can extend the required [Helmet security settings](https://helmetjs.github.io/) using [data extensions](https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/). +You can extend the required [Helmet security settings](https://helmetjs.github.io/) using [data extensions](https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/) in a [CodeQL model pack](https://docs.github.com/en/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-and-working-with-codeql-packs#creating-a-codeql-model-pack). They are defaulted to just `frameguard` and `contentSecurityPolicy`, but you can add more using this method, to require them not to be set to `false` (which explicitly disables them) in the Helmet configuration. @@ -18,7 +18,7 @@ extensions: Note: Using `frameguard` and `contentSecurityPolicy` is an example: the query already enforces these, so it is not necessary to add it with your own data extension. -A suitable model pack might be: +A suitable [model pack](https://docs.github.com/en/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-and-working-with-codeql-packs#creating-a-codeql-model-pack) might be: ```yaml name: my-org/javascript-helmet-insecure-config-model-pack diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index c09978e13d15..e294779d6b85 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -19,18 +19,7 @@ </p> <p> - Users of the query can extend the set of required Helmet features by adding additional checks for them, using CodeQL <a href="https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/">data extensions</a>. - </p> - - <pre>extensions: - - addsTo: - pack: codeql/javascript-all - extensible: requiredHelmetSecuritySetting -data: - - ["frameguard"]</pre> - - <p> - Note: <code>frameguard</code> is an example: the query already enforces this setting, so it is not necessary to add it to the data extension. + Users of the query can extend the set of required Helmet features by adding additional checks for them, using CodeQL <a href="https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/">data extensions</a> in a <a href="https://docs.github.com/en/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-and-working-with-codeql-packs#creating-a-codeql-model-pack">CodeQL model pack</a>. See `CUSTOMIZING.md` in the query source for more information. </p> </overview> From b71ba7c30f47d7fa7901c71ee8a481b94236333b Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Tue, 28 May 2024 10:40:15 +0100 Subject: [PATCH 20/70] Move Header Write derrived concepts to Concepts --- python/ql/lib/semmle/python/Concepts.qll | 48 ++++++++++++++++++ .../HttpHeaderInjectionCustomizations.qll | 50 ------------------- 2 files changed, 48 insertions(+), 50 deletions(-) diff --git a/python/ql/lib/semmle/python/Concepts.qll b/python/ql/lib/semmle/python/Concepts.qll index 029f13ee0c2a..8e64deddb4e5 100644 --- a/python/ql/lib/semmle/python/Concepts.qll +++ b/python/ql/lib/semmle/python/Concepts.qll @@ -1134,6 +1134,54 @@ module Http { } } + /** A key-value pair in a literal for a bulk header update, considered as a single header update. */ + private class HeaderBulkWriteDictLiteral extends Http::Server::ResponseHeaderWrite::Range instanceof Http::Server::ResponseHeaderBulkWrite + { + KeyValuePair item; + + HeaderBulkWriteDictLiteral() { + exists(Dict dict | DataFlow::localFlow(DataFlow::exprNode(dict), super.getBulkArg()) | + item = dict.getAnItem() + ) + } + + override DataFlow::Node getNameArg() { result.asExpr() = item.getKey() } + + override DataFlow::Node getValueArg() { result.asExpr() = item.getValue() } + + override predicate nameAllowsNewline() { + Http::Server::ResponseHeaderBulkWrite.super.nameAllowsNewline() + } + + override predicate valueAllowsNewline() { + Http::Server::ResponseHeaderBulkWrite.super.valueAllowsNewline() + } + } + + /** A tuple in a list for a bulk header update, considered as a single header update. */ + private class HeaderBulkWriteListLiteral extends Http::Server::ResponseHeaderWrite::Range instanceof Http::Server::ResponseHeaderBulkWrite + { + Tuple item; + + HeaderBulkWriteListLiteral() { + exists(List list | DataFlow::localFlow(DataFlow::exprNode(list), super.getBulkArg()) | + item = list.getAnElt() + ) + } + + override DataFlow::Node getNameArg() { result.asExpr() = item.getElt(0) } + + override DataFlow::Node getValueArg() { result.asExpr() = item.getElt(1) } + + override predicate nameAllowsNewline() { + Http::Server::ResponseHeaderBulkWrite.super.nameAllowsNewline() + } + + override predicate valueAllowsNewline() { + Http::Server::ResponseHeaderBulkWrite.super.valueAllowsNewline() + } + } + /** * A data-flow node that sets a cookie in an HTTP response. * diff --git a/python/ql/lib/semmle/python/security/dataflow/HttpHeaderInjectionCustomizations.qll b/python/ql/lib/semmle/python/security/dataflow/HttpHeaderInjectionCustomizations.qll index b3fe233629e4..e529d3f29e0f 100644 --- a/python/ql/lib/semmle/python/security/dataflow/HttpHeaderInjectionCustomizations.qll +++ b/python/ql/lib/semmle/python/security/dataflow/HttpHeaderInjectionCustomizations.qll @@ -51,56 +51,6 @@ module HttpHeaderInjection { } } - /** A key-value pair in a literal for a bulk header update, considered as a single header update. */ - // TODO: We could instead consider bulk writes as sinks with an implicit read step of DictionaryKey/DictionaryValue content as needed. - private class HeaderBulkWriteDictLiteral extends Http::Server::ResponseHeaderWrite::Range instanceof Http::Server::ResponseHeaderBulkWrite - { - KeyValuePair item; - - HeaderBulkWriteDictLiteral() { - exists(Dict dict | DataFlow::localFlow(DataFlow::exprNode(dict), super.getBulkArg()) | - item = dict.getAnItem() - ) - } - - override DataFlow::Node getNameArg() { result.asExpr() = item.getKey() } - - override DataFlow::Node getValueArg() { result.asExpr() = item.getValue() } - - override predicate nameAllowsNewline() { - Http::Server::ResponseHeaderBulkWrite.super.nameAllowsNewline() - } - - override predicate valueAllowsNewline() { - Http::Server::ResponseHeaderBulkWrite.super.valueAllowsNewline() - } - } - - /** A tuple in a list for a bulk header update, considered as a single header update. */ - // TODO: We could instead consider bulk writes as sinks with implicit read steps as needed. - private class HeaderBulkWriteListLiteral extends Http::Server::ResponseHeaderWrite::Range instanceof Http::Server::ResponseHeaderBulkWrite - { - Tuple item; - - HeaderBulkWriteListLiteral() { - exists(List list | DataFlow::localFlow(DataFlow::exprNode(list), super.getBulkArg()) | - item = list.getAnElt() - ) - } - - override DataFlow::Node getNameArg() { result.asExpr() = item.getElt(0) } - - override DataFlow::Node getValueArg() { result.asExpr() = item.getElt(1) } - - override predicate nameAllowsNewline() { - Http::Server::ResponseHeaderBulkWrite.super.nameAllowsNewline() - } - - override predicate valueAllowsNewline() { - Http::Server::ResponseHeaderBulkWrite.super.valueAllowsNewline() - } - } - /** * A call to replace line breaks, considered as a sanitizer. */ From d11f58f768db1bea06bec169d60144f5aa214ec3 Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Tue, 28 May 2024 10:47:41 +0100 Subject: [PATCH 21/70] Add cookie header write concept from experimental. --- python/ql/lib/semmle/python/Concepts.qll | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/python/ql/lib/semmle/python/Concepts.qll b/python/ql/lib/semmle/python/Concepts.qll index 8e64deddb4e5..c351a7dceedb 100644 --- a/python/ql/lib/semmle/python/Concepts.qll +++ b/python/ql/lib/semmle/python/Concepts.qll @@ -1234,6 +1234,29 @@ module Http { } } + /** A write to a `Set-Cookie` header that sets a cookie directly. */ + private class CookieHeaderWrite extends CookieWrite::Range instanceof Http::Server::ResponseHeaderWrite + { + CookieHeaderWrite() { + exists(StringLiteral str | + str.getText() = "Set-Cookie" and + DataFlow::exprNode(str) + .(DataFlow::LocalSourceNode) + .flowsTo(this.(Http::Server::ResponseHeaderWrite).getNameArg()) + ) + } + + override DataFlow::Node getNameArg() { + result = this.(Http::Server::ResponseHeaderWrite).getValueArg() + } + + override DataFlow::Node getHeaderArg() { + result = this.(Http::Server::ResponseHeaderWrite).getValueArg() + } + + override DataFlow::Node getValueArg() { none() } + } + /** * A data-flow node that enables or disables Cross-site request forgery protection * in a global manner. From 6b8080a5b3957e88002ef66f7dd3033a57f437a6 Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Thu, 6 Jun 2024 15:10:25 +0100 Subject: [PATCH 22/70] Update concept tests for header writes --- .../test/experimental/meta/ConceptsTest.qll | 33 ++++++++------- .../frameworks/flask/response_test.py | 42 +++++++++---------- .../stdlib/wsgiref_simple_server_test.py | 10 ++--- 3 files changed, 43 insertions(+), 42 deletions(-) diff --git a/python/ql/test/experimental/meta/ConceptsTest.qll b/python/ql/test/experimental/meta/ConceptsTest.qll index b552758582b3..473c7c177c7e 100644 --- a/python/ql/test/experimental/meta/ConceptsTest.qll +++ b/python/ql/test/experimental/meta/ConceptsTest.qll @@ -323,8 +323,8 @@ module HttpResponseHeaderWriteTest implements TestSig { string getARelevantTag() { result = [ - "headerWriteNameUnsanitized", "headerWriteNameSanitized", "headerWriteValueUnsanitized", - "headerWriteValueSanitized", "headerWriteBulk" + "headerWriteNameUnsanitized", "headerWriteName", "headerWriteValueUnsanitized", + "headerWriteValue", "headerWriteBulk", "headerWriteBulkUnsanitized" ] } @@ -339,7 +339,7 @@ module HttpResponseHeaderWriteTest implements TestSig { ( if write.nameAllowsNewline() then tag = "headerWriteNameUnsanitized" - else tag = "headerWriteNameSanitized" + else tag = "headerWriteName" ) and value = prettyNodeForInlineTest(node) or @@ -347,7 +347,7 @@ module HttpResponseHeaderWriteTest implements TestSig { ( if write.valueAllowsNewline() then tag = "headerWriteValueUnsanitized" - else tag = "headerWriteValueSanitized" + else tag = "headerWriteValue" ) and value = prettyNodeForInlineTest(node) ) @@ -360,19 +360,20 @@ module HttpResponseHeaderWriteTest implements TestSig { tag = "headerWriteBulk" and value = prettyNodeForInlineTest(node) or + tag = "headerWriteBulkUnsanitized" and ( - if write.nameAllowsNewline() - then tag = "headerWriteNameUnsanitized" - else tag = "headerWriteNameSanitized" - ) and - value = "" - or - ( - if write.valueAllowsNewline() - then tag = "headerWriteValueUnsanitized" - else tag = "headerWriteValueSanitized" - ) and - value = "" + write.nameAllowsNewline() and + not write.valueAllowsNewline() and + value = "name" + or + not write.nameAllowsNewline() and + write.valueAllowsNewline() and + value = "value" + or + write.nameAllowsNewline() and + write.valueAllowsNewline() and + value = "name,value" + ) ) ) ) diff --git a/python/ql/test/library-tests/frameworks/flask/response_test.py b/python/ql/test/library-tests/frameworks/flask/response_test.py index 1359d2f93810..bcfc36ff365e 100644 --- a/python/ql/test/library-tests/frameworks/flask/response_test.py +++ b/python/ql/test/library-tests/frameworks/flask/response_test.py @@ -118,7 +118,7 @@ def response_modification1(): # $requestHandler @app.route("/content-type/response-modification2") # $routeSetup="/content-type/response-modification2" def response_modification2(): # $requestHandler resp = make_response("<h1>hello</h1>") # $HttpResponse mimetype=text/html responseBody="<h1>hello</h1>" - resp.headers["content-type"] = "text/plain" # $ headerWriteNameUnsanitized="content-type" headerWriteValueSanitized="text/plain" MISSING: HttpResponse mimetype=text/plain + resp.headers["content-type"] = "text/plain" # $ headerWriteNameUnsanitized="content-type" headerWriteValue="text/plain" MISSING: HttpResponse mimetype=text/plain return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp @@ -148,7 +148,7 @@ def Response3(): # $requestHandler @app.route("/content-type/Response4") # $routeSetup="/content-type/Response4" def Response4(): # $requestHandler # note: capitalization of Content-Type does not matter - resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/plain"}) # $ headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized HttpResponse responseBody="<h1>hello</h1>" SPURIOUS: mimetype=text/html MISSING: mimetype=text/plain + resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/plain"}) # $ headerWriteBulk=Dict headerWriteBulkUnsanitized=name headerWriteNameUnsanitized="Content-TYPE" headerWriteValue="text/plain" HttpResponse responseBody="<h1>hello</h1>" SPURIOUS: mimetype=text/html MISSING: mimetype=text/plain return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp @@ -156,7 +156,7 @@ def Response4(): # $requestHandler def Response5(): # $requestHandler # content_type argument takes priority (and result is text/plain) # note: capitalization of Content-Type does not matter - resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/html"}, content_type="text/plain; charset=utf-8") # $ headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized HttpResponse mimetype=text/plain responseBody="<h1>hello</h1>" + resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/html"}, content_type="text/plain; charset=utf-8") # $ headerWriteBulk=Dict headerWriteBulkUnsanitized=name headerWriteNameUnsanitized="Content-TYPE" headerWriteValue="text/html" HttpResponse mimetype=text/plain responseBody="<h1>hello</h1>" return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp @@ -164,7 +164,7 @@ def Response5(): # $requestHandler def Response6(): # $requestHandler # mimetype argument takes priority over header (and result is text/plain) # note: capitalization of Content-Type does not matter - resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/html"}, mimetype="text/plain") # $ headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized HttpResponse mimetype=text/plain responseBody="<h1>hello</h1>" + resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/html"}, mimetype="text/plain") # $ headerWriteBulk=Dict headerWriteBulkUnsanitized=name headerWriteNameUnsanitized="Content-TYPE" headerWriteValue="text/html" HttpResponse mimetype=text/plain responseBody="<h1>hello</h1>" return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp @@ -208,7 +208,7 @@ def setting_cookie(): # $requestHandler resp = make_response() # $ HttpResponse mimetype=text/html resp.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value" resp.set_cookie(key="key", value="value") # $ CookieWrite CookieName="key" CookieValue="value" - resp.headers.add("Set-Cookie", "key2=value2") # $ headerWriteNameUnsanitized="Set-Cookie" headerWriteValueSanitized="key2=value2" MISSING: CookieWrite CookieRawHeader="key2=value2" + resp.headers.add("Set-Cookie", "key2=value2") # $ headerWriteNameUnsanitized="Set-Cookie" headerWriteValue="key2=value2" MISSING: CookieWrite CookieRawHeader="key2=value2" resp.delete_cookie("key3") # $ CookieWrite CookieName="key3" resp.delete_cookie(key="key3") # $ CookieWrite CookieName="key3" return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp @@ -220,29 +220,29 @@ def setting_cookie(): # $requestHandler @app.route("/headers") # $routeSetup="/headers" def headers(): # $requestHandler resp1 = Response() # $ HttpResponse mimetype=text/html - resp1.headers["X-MyHeader"] = "a" # $ headerWriteNameUnsanitized="X-MyHeader" headerWriteValueSanitized="a" + resp1.headers["X-MyHeader"] = "a" # $ headerWriteNameUnsanitized="X-MyHeader" headerWriteValue="a" resp2 = make_response() # $ HttpResponse mimetype=text/html - resp2.headers["X-MyHeader"] = "aa" # $ headerWriteNameUnsanitized="X-MyHeader" headerWriteValueSanitized="aa" - resp2.headers.extend({"X-MyHeader2": "b"}) # $ headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized - resp3 = make_response("hello", 200, {"X-MyHeader3": "c"}) # $ HttpResponse mimetype=text/html responseBody="hello" headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized - resp4 = make_response("hello", {"X-MyHeader4": "d"}) # $ HttpResponse mimetype=text/html responseBody="hello" headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized - resp5 = Response(headers={"X-MyHeader5":"e"}) # $ HttpResponse mimetype=text/html headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized + resp2.headers["X-MyHeader"] = "aa" # $ headerWriteNameUnsanitized="X-MyHeader" headerWriteValue="aa" + resp2.headers.extend({"X-MyHeader2": "b"}) # $ headerWriteBulk=Dict headerWriteBulkUnsanitized=name headerWriteNameUnsanitized="X-MyHeader2" headerWriteValue="b" + resp3 = make_response("hello", 200, {"X-MyHeader3": "c"}) # $ HttpResponse mimetype=text/html responseBody="hello" headerWriteBulk=Dict headerWriteBulkUnsanitized=name headerWriteNameUnsanitized="X-MyHeader3" headerWriteValue="c" + resp4 = make_response("hello", {"X-MyHeader4": "d"}) # $ HttpResponse mimetype=text/html responseBody="hello" headerWriteBulk=Dict headerWriteBulkUnsanitized=name headerWriteNameUnsanitized="X-MyHeader4" headerWriteValue="d" + resp5 = Response(headers={"X-MyHeader5":"e"}) # $ HttpResponse mimetype=text/html headerWriteBulk=Dict headerWriteBulkUnsanitized=name headerWriteBulkUnsanitized=name headerWriteNameUnsanitized="X-MyHeader5" headerWriteValue="e" return resp5 # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp5 @app.route("/werkzeug-headers") # $routeSetup="/werkzeug-headers" def werkzeug_headers(): # $requestHandler response = Response() # $ HttpResponse mimetype=text/html headers = Headers() - headers.add("X-MyHeader1", "a") # $ headerWriteNameUnsanitized="X-MyHeader1" headerWriteValueSanitized="a" - headers.add_header("X-MyHeader2", "b") # $ headerWriteNameUnsanitized="X-MyHeader2" headerWriteValueSanitized="b" - headers.set("X-MyHeader3", "c") # $ headerWriteNameUnsanitized="X-MyHeader3" headerWriteValueSanitized="c" - headers.setdefault("X-MyHeader4", "d") # $ headerWriteNameUnsanitized="X-MyHeader4" headerWriteValueSanitized="d" - headers.__setitem__("X-MyHeader5", "e") # $ headerWriteNameUnsanitized="X-MyHeader5" headerWriteValueSanitized="e" - headers["X-MyHeader6"] = "f" # $ headerWriteNameUnsanitized="X-MyHeader6" headerWriteValueSanitized="f" - h1 = {"X-MyHeader7": "g"} - headers.extend(h1) # $ headerWriteBulk=h1 headerWriteNameUnsanitized headerWriteValueSanitized - h2 = [("X-MyHeader8", "h")] - headers.extend(h2) # $ headerWriteBulk=h2 headerWriteNameUnsanitized headerWriteValueSanitized + headers.add("X-MyHeader1", "a") # $ headerWriteNameUnsanitized="X-MyHeader1" headerWriteValue="a" + headers.add_header("X-MyHeader2", "b") # $ headerWriteNameUnsanitized="X-MyHeader2" headerWriteValue="b" + headers.set("X-MyHeader3", "c") # $ headerWriteNameUnsanitized="X-MyHeader3" headerWriteValue="c" + headers.setdefault("X-MyHeader4", "d") # $ headerWriteNameUnsanitized="X-MyHeader4" headerWriteValue="d" + headers.__setitem__("X-MyHeader5", "e") # $ headerWriteNameUnsanitized="X-MyHeader5" headerWriteValue="e" + headers["X-MyHeader6"] = "f" # $ headerWriteNameUnsanitized="X-MyHeader6" headerWriteValue="f" + h1 = {"X-MyHeader7": "g"} # $ headerWriteNameUnsanitized="X-MyHeader7" headerWriteValue="g" + headers.extend(h1) # $ headerWriteBulk=h1 headerWriteBulkUnsanitized=name + h2 = [("X-MyHeader8", "h")] # $ headerWriteNameUnsanitized="X-MyHeader8" headerWriteValue="h" + headers.extend(h2) # $ headerWriteBulk=h2 headerWriteBulkUnsanitized=name response.headers = headers return response # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=response diff --git a/python/ql/test/library-tests/frameworks/stdlib/wsgiref_simple_server_test.py b/python/ql/test/library-tests/frameworks/stdlib/wsgiref_simple_server_test.py index 6a2031699f42..7327385c0647 100644 --- a/python/ql/test/library-tests/frameworks/stdlib/wsgiref_simple_server_test.py +++ b/python/ql/test/library-tests/frameworks/stdlib/wsgiref_simple_server_test.py @@ -18,7 +18,7 @@ def func(environ, start_response): # $ requestHandler environ, # $ tainted environ["PATH_INFO"], # $ tainted ) - write = start_response("200 OK", [("Content-Type", "text/plain")]) # $ headerWriteBulk=List headerWriteNameUnsanitized headerWriteValueUnsanitized + write = start_response("200 OK", [("Content-Type", "text/plain")]) # $ headerWriteBulk=List headerWriteBulkUnsanitized=name,value headerWriteNameUnsanitized="Content-Type" headerWriteValueUnsanitized="text/plain" write(b"hello") # $ HttpResponse responseBody=b"hello" write(data=b" ") # $ HttpResponse responseBody=b" " @@ -33,16 +33,16 @@ def __init__(self): self.set_app(self.my_method) def my_method(self, _env, start_response): # $ requestHandler - start_response("200 OK", []) # $ headerWriteBulk=List headerWriteNameUnsanitized headerWriteValueUnsanitized + start_response("200 OK", []) # $ headerWriteBulk=List headerWriteBulkUnsanitized=name,value return [b"my_method"] # $ HttpResponse responseBody=List def func2(environ, start_response): # $ requestHandler - headers = wsgiref.headers.Headers([("Content-Type", "text/plain")]) # $ headerWriteBulk=List headerWriteNameUnsanitized headerWriteValueUnsanitized + headers = wsgiref.headers.Headers([("Content-Type", "text/plain")]) # $ headerWriteBulk=List headerWriteBulkUnsanitized=name,value headerWriteNameUnsanitized="Content-Type" headerWriteValueUnsanitized="text/plain" headers.add_header("X-MyHeader", "a") # $ headerWriteNameUnsanitized="X-MyHeader" headerWriteValueUnsanitized="a" headers.setdefault("X-MyHeader2", "b") # $ headerWriteNameUnsanitized="X-MyHeader2" headerWriteValueUnsanitized="b" headers.__setitem__("X-MyHeader3", "c") # $ headerWriteNameUnsanitized="X-MyHeader3" headerWriteValueUnsanitized="c" headers["X-MyHeader4"] = "d" # $ headerWriteNameUnsanitized="X-MyHeader4" headerWriteValueUnsanitized="d" - start_response(status, headers) # $ headerWriteBulk=headers headerWriteNameUnsanitized headerWriteValueUnsanitized + start_response(status, headers) # $ headerWriteBulk=headers headerWriteBulkUnsanitized=name,value return [b"Hello"] # $ HttpResponse responseBody=List case = sys.argv[1] @@ -54,7 +54,7 @@ def func2(environ, start_response): # $ requestHandler elif case == "3": server = MyServer() def func3(_env, start_response): # $ requestHandler - start_response("200 OK", []) # $ headerWriteBulk=List headerWriteNameUnsanitized headerWriteValueUnsanitized + start_response("200 OK", []) # $ headerWriteBulk=List headerWriteBulkUnsanitized=name,value return [b"foo"] # $ HttpResponse responseBody=List server.set_app(func3) elif case == "4": From a0201e9c4ff6e04fad195750d98dc8591ae1d5f6 Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Thu, 6 Jun 2024 15:19:02 +0100 Subject: [PATCH 23/70] Update tests for new cookie write from headers --- python/ql/lib/semmle/python/Concepts.qll | 4 +--- .../ql/test/library-tests/frameworks/flask/response_test.py | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/python/ql/lib/semmle/python/Concepts.qll b/python/ql/lib/semmle/python/Concepts.qll index c351a7dceedb..74e06b54b0be 100644 --- a/python/ql/lib/semmle/python/Concepts.qll +++ b/python/ql/lib/semmle/python/Concepts.qll @@ -1246,9 +1246,7 @@ module Http { ) } - override DataFlow::Node getNameArg() { - result = this.(Http::Server::ResponseHeaderWrite).getValueArg() - } + override DataFlow::Node getNameArg() { none() } override DataFlow::Node getHeaderArg() { result = this.(Http::Server::ResponseHeaderWrite).getValueArg() diff --git a/python/ql/test/library-tests/frameworks/flask/response_test.py b/python/ql/test/library-tests/frameworks/flask/response_test.py index bcfc36ff365e..a1341022c4ec 100644 --- a/python/ql/test/library-tests/frameworks/flask/response_test.py +++ b/python/ql/test/library-tests/frameworks/flask/response_test.py @@ -208,7 +208,7 @@ def setting_cookie(): # $requestHandler resp = make_response() # $ HttpResponse mimetype=text/html resp.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value" resp.set_cookie(key="key", value="value") # $ CookieWrite CookieName="key" CookieValue="value" - resp.headers.add("Set-Cookie", "key2=value2") # $ headerWriteNameUnsanitized="Set-Cookie" headerWriteValue="key2=value2" MISSING: CookieWrite CookieRawHeader="key2=value2" + resp.headers.add("Set-Cookie", "key2=value2") # $ headerWriteNameUnsanitized="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" resp.delete_cookie("key3") # $ CookieWrite CookieName="key3" resp.delete_cookie(key="key3") # $ CookieWrite CookieName="key3" return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp From 7704801e47a8c10a7597546b51f7e5f17bf1a93f Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Fri, 21 Jun 2024 09:09:14 +0100 Subject: [PATCH 24/70] Change fastapi raw cookie header models to header write models --- python/ql/lib/semmle/python/Concepts.qll | 2 +- .../lib/semmle/python/frameworks/FastApi.qll | 21 +++++++++---------- .../frameworks/fastapi/response_test.py | 8 +++---- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/python/ql/lib/semmle/python/Concepts.qll b/python/ql/lib/semmle/python/Concepts.qll index 74e06b54b0be..20578e26960f 100644 --- a/python/ql/lib/semmle/python/Concepts.qll +++ b/python/ql/lib/semmle/python/Concepts.qll @@ -1239,7 +1239,7 @@ module Http { { CookieHeaderWrite() { exists(StringLiteral str | - str.getText() = "Set-Cookie" and + str.getText().toLowerCase() = "set-cookie" and DataFlow::exprNode(str) .(DataFlow::LocalSourceNode) .flowsTo(this.(Http::Server::ResponseHeaderWrite).getNameArg()) diff --git a/python/ql/lib/semmle/python/frameworks/FastApi.qll b/python/ql/lib/semmle/python/frameworks/FastApi.qll index 8c958e9343db..423f8580a5b9 100644 --- a/python/ql/lib/semmle/python/frameworks/FastApi.qll +++ b/python/ql/lib/semmle/python/frameworks/FastApi.qll @@ -361,28 +361,27 @@ module FastApi { } /** - * A call to `append` on a `headers` of a FastAPI Response, with the `Set-Cookie` - * header-key. + * A call to `append` on a `headers` of a FastAPI Response. */ - private class HeadersAppendCookie extends Http::Server::CookieWrite::Range, + private class HeadersAppend extends Http::Server::ResponseHeaderWrite::Range, DataFlow::MethodCallNode { - HeadersAppendCookie() { - exists(DataFlow::AttrRead headers, DataFlow::Node keyArg | + HeadersAppend() { + exists(DataFlow::AttrRead headers | headers.accesses(instance(), "headers") and - this.calls(headers, "append") and - keyArg in [this.getArg(0), this.getArgByName("key")] and - keyArg.getALocalSource().asExpr().(StringLiteral).getText().toLowerCase() = "set-cookie" + this.calls(headers, "append") ) } - override DataFlow::Node getHeaderArg() { + override DataFlow::Node getNameArg() { result = [this.getArg(0), this.getArgByName("key")] } + + override DataFlow::Node getValueArg() { result in [this.getArg(1), this.getArgByName("value")] } - override DataFlow::Node getNameArg() { none() } + override predicate nameAllowsNewline() { none() } - override DataFlow::Node getValueArg() { none() } + override predicate valueAllowsNewline() { none() } } } } diff --git a/python/ql/test/library-tests/frameworks/fastapi/response_test.py b/python/ql/test/library-tests/frameworks/fastapi/response_test.py index 9f276338c8cc..44582d6cd6ef 100644 --- a/python/ql/test/library-tests/frameworks/fastapi/response_test.py +++ b/python/ql/test/library-tests/frameworks/fastapi/response_test.py @@ -11,9 +11,9 @@ async def response_parameter(response: Response): # $ requestHandler response.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value" response.set_cookie(key="key", value="value") # $ CookieWrite CookieName="key" CookieValue="value" - response.headers.append("Set-Cookie", "key2=value2") # $ CookieWrite CookieRawHeader="key2=value2" - response.headers.append(key="Set-Cookie", value="key2=value2") # $ CookieWrite CookieRawHeader="key2=value2" - response.headers["X-MyHeader"] = "header-value" + response.headers.append("Set-Cookie", "key2=value2") # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" + response.headers.append(key="Set-Cookie", value="key2=value2") # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" + response.headers["X-MyHeader"] = "header-value" # $ MISSING: headerWriteName="X-MyHeader" headerWriteValue="header-value" response.status_code = 418 return {"message": "response as parameter"} # $ HttpResponse mimetype=application/json responseBody=Dict @@ -45,7 +45,7 @@ async def response_parameter_custom_type(response: MyXmlResponse): # $ requestHa print(type(response)) assert type(response) == fastapi.responses.Response response.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value" - response.headers["Custom-Response-Type"] = "yes, but only after function has run" + response.headers["Custom-Response-Type"] = "yes, but only after function has run" # $ MISSING: headerWriteName="Custom-Response-Typer" headerWriteValue="yes, but only after function has run" xml_data = "<foo>FOO</foo>" return xml_data # $ HttpResponse responseBody=xml_data mimetype=application/xml From 5ced5c010c9450a6d393652e60c3e7ffe97abddd Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Fri, 21 Jun 2024 11:29:20 +0100 Subject: [PATCH 25/70] Add django header writes --- .../lib/semmle/python/frameworks/Django.qll | 31 +++++++++++++++++++ .../frameworks/django-v2-v3/response_test.py | 4 +-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/python/ql/lib/semmle/python/frameworks/Django.qll b/python/ql/lib/semmle/python/frameworks/Django.qll index 064dba57f92a..7c0befa6349d 100644 --- a/python/ql/lib/semmle/python/frameworks/Django.qll +++ b/python/ql/lib/semmle/python/frameworks/Django.qll @@ -2239,6 +2239,37 @@ module PrivateDjango { override DataFlow::Node getValueArg() { result = value } } + + class DjangoResponseHeaderSubscriptWrite extends Http::Server::ResponseHeaderWrite::Range { + DataFlow::Node index; + DataFlow::Node value; + + DjangoResponseHeaderSubscriptWrite() { + exists(SubscriptNode subscript, DataFlow::AttrRead headerLookup | + // To give `this` a value, we need to choose between either LHS or RHS, + // and just go with the LHS + this.asCfgNode() = subscript + | + headerLookup + .accesses(DjangoImpl::DjangoHttp::Response::HttpResponse::instance(), "headers") and + exists(DataFlow::Node subscriptObj | + subscriptObj.asCfgNode() = subscript.getObject() + | + headerLookup.flowsTo(subscriptObj) + ) and + value.asCfgNode() = subscript.(DefinitionNode).getValue() and + index.asCfgNode() = subscript.getIndex() + ) + } + + override DataFlow::Node getNameArg() { result = index } + + override DataFlow::Node getValueArg() { result = value } + + override predicate nameAllowsNewline() { none() } + + override predicate valueAllowsNewline() { none() } + } } } diff --git a/python/ql/test/library-tests/frameworks/django-v2-v3/response_test.py b/python/ql/test/library-tests/frameworks/django-v2-v3/response_test.py index dd78cd510168..d4f17f7c3cf7 100644 --- a/python/ql/test/library-tests/frameworks/django-v2-v3/response_test.py +++ b/python/ql/test/library-tests/frameworks/django-v2-v3/response_test.py @@ -72,7 +72,7 @@ def redirect_through_normal_response_new_headers_attr(request): resp = HttpResponse() # $ HttpResponse mimetype=text/html resp.status_code = 302 - resp.headers['Location'] = next # $ MISSING: redirectLocation=next + resp.headers['Location'] = next # $ headerWriteName='Location' headerWriteValue=next MISSING: redirectLocation=next resp.content = private # $ MISSING: responseBody=private return resp @@ -130,7 +130,7 @@ def setting_cookie(request): resp = HttpResponse() # $ HttpResponse mimetype=text/html resp.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value" resp.set_cookie(key="key", value="value") # $ CookieWrite CookieName="key" CookieValue="value" - resp.headers["Set-Cookie"] = "key2=value2" # $ MISSING: CookieWrite CookieRawHeader="key2=value2" + resp.headers["Set-Cookie"] = "key2=value2" # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" resp.cookies["key3"] = "value3" # $ CookieWrite CookieName="key3" CookieValue="value3" resp.delete_cookie("key4") # $ CookieWrite CookieName="key4" resp.delete_cookie(key="key4") # $ CookieWrite CookieName="key4" From 79c0ed607487f7c59d903113f576dfdfde60bcca Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Fri, 21 Jun 2024 14:01:33 +0100 Subject: [PATCH 26/70] Add additional fastapi mheader write models --- .../lib/semmle/python/frameworks/FastApi.qll | 28 +++++++++++++++++++ .../frameworks/fastapi/response_test.py | 4 +-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/python/ql/lib/semmle/python/frameworks/FastApi.qll b/python/ql/lib/semmle/python/frameworks/FastApi.qll index 423f8580a5b9..028c5f266010 100644 --- a/python/ql/lib/semmle/python/frameworks/FastApi.qll +++ b/python/ql/lib/semmle/python/frameworks/FastApi.qll @@ -383,5 +383,33 @@ module FastApi { override predicate valueAllowsNewline() { none() } } + + class HeaderSubscriptWrite extends Http::Server::ResponseHeaderWrite::Range { + DataFlow::Node index; + DataFlow::Node value; + + HeaderSubscriptWrite() { + exists(SubscriptNode subscript, DataFlow::AttrRead headerLookup | + // To give `this` a value, we need to choose between either LHS or RHS, + // and just go with the LHS + this.asCfgNode() = subscript + | + headerLookup.accesses(instance(), "headers") and + exists(DataFlow::Node subscriptObj | subscriptObj.asCfgNode() = subscript.getObject() | + headerLookup.flowsTo(subscriptObj) + ) and + value.asCfgNode() = subscript.(DefinitionNode).getValue() and + index.asCfgNode() = subscript.getIndex() + ) + } + + override DataFlow::Node getNameArg() { result = index } + + override DataFlow::Node getValueArg() { result = value } + + override predicate nameAllowsNewline() { none() } + + override predicate valueAllowsNewline() { none() } + } } } diff --git a/python/ql/test/library-tests/frameworks/fastapi/response_test.py b/python/ql/test/library-tests/frameworks/fastapi/response_test.py index 44582d6cd6ef..2bc26c15fdac 100644 --- a/python/ql/test/library-tests/frameworks/fastapi/response_test.py +++ b/python/ql/test/library-tests/frameworks/fastapi/response_test.py @@ -13,7 +13,7 @@ async def response_parameter(response: Response): # $ requestHandler response.set_cookie(key="key", value="value") # $ CookieWrite CookieName="key" CookieValue="value" response.headers.append("Set-Cookie", "key2=value2") # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" response.headers.append(key="Set-Cookie", value="key2=value2") # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" - response.headers["X-MyHeader"] = "header-value" # $ MISSING: headerWriteName="X-MyHeader" headerWriteValue="header-value" + response.headers["X-MyHeader"] = "header-value" # $ headerWriteName="X-MyHeader" headerWriteValue="header-value" response.status_code = 418 return {"message": "response as parameter"} # $ HttpResponse mimetype=application/json responseBody=Dict @@ -45,7 +45,7 @@ async def response_parameter_custom_type(response: MyXmlResponse): # $ requestHa print(type(response)) assert type(response) == fastapi.responses.Response response.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value" - response.headers["Custom-Response-Type"] = "yes, but only after function has run" # $ MISSING: headerWriteName="Custom-Response-Typer" headerWriteValue="yes, but only after function has run" + response.headers["Custom-Response-Type"] = "yes, but only after function has run" # $ headerWriteName="Custom-Response-Type" headerWriteValue="yes, but only after function has run" xml_data = "<foo>FOO</foo>" return xml_data # $ HttpResponse responseBody=xml_data mimetype=application/xml From c404f00a9b228366393a2bf15939b4cf76a10a7f Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Mon, 24 Jun 2024 10:41:07 +0100 Subject: [PATCH 27/70] Add additional header write models for aiohttp and tornado + added qldoc --- .../lib/semmle/python/frameworks/Aiohttp.qll | 27 ++++++++ .../lib/semmle/python/frameworks/Django.qll | 4 ++ .../lib/semmle/python/frameworks/FastApi.qll | 4 ++ .../lib/semmle/python/frameworks/Tornado.qll | 63 +++++++++++++++++++ .../frameworks/aiohttp/response_test.py | 2 +- .../frameworks/tornado/response_test.py | 9 ++- 6 files changed, 105 insertions(+), 4 deletions(-) diff --git a/python/ql/lib/semmle/python/frameworks/Aiohttp.qll b/python/ql/lib/semmle/python/frameworks/Aiohttp.qll index 78d269c31d31..517b309594aa 100644 --- a/python/ql/lib/semmle/python/frameworks/Aiohttp.qll +++ b/python/ql/lib/semmle/python/frameworks/Aiohttp.qll @@ -706,6 +706,33 @@ module AiohttpWebModel { override DataFlow::Node getValueArg() { result = value } } + + /** + * A dict-like write to an item of the `headers` attribute on a HTTP response, such as + * `response.headers[name] = value`. + */ + class AiohttpResponseHeaderSubscriptWrite extends Http::Server::ResponseHeaderWrite::Range { + DataFlow::Node index; + DataFlow::Node value; + + AiohttpResponseHeaderSubscriptWrite() { + exists(API::Node i | + value = aiohttpResponseInstance().getMember("headers").getSubscriptAt(i).asSink() and + index = i.asSink() and + // To give `this` a value, we need to choose between either LHS or RHS, + // and just go with the RHS as it is readily available + this = value + ) + } + + override DataFlow::Node getNameArg() { result = index } + + override DataFlow::Node getValueArg() { result = value } + + override predicate nameAllowsNewline() { none() } + + override predicate valueAllowsNewline() { none() } + } } /** diff --git a/python/ql/lib/semmle/python/frameworks/Django.qll b/python/ql/lib/semmle/python/frameworks/Django.qll index 7c0befa6349d..69b0e8710daf 100644 --- a/python/ql/lib/semmle/python/frameworks/Django.qll +++ b/python/ql/lib/semmle/python/frameworks/Django.qll @@ -2240,6 +2240,10 @@ module PrivateDjango { override DataFlow::Node getValueArg() { result = value } } + /** + * A dict-like write to an item of the `headers` attribute on a HTTP response, such as + * `response.headers[name] = value`. + */ class DjangoResponseHeaderSubscriptWrite extends Http::Server::ResponseHeaderWrite::Range { DataFlow::Node index; DataFlow::Node value; diff --git a/python/ql/lib/semmle/python/frameworks/FastApi.qll b/python/ql/lib/semmle/python/frameworks/FastApi.qll index 028c5f266010..0793b4b7d6ab 100644 --- a/python/ql/lib/semmle/python/frameworks/FastApi.qll +++ b/python/ql/lib/semmle/python/frameworks/FastApi.qll @@ -384,6 +384,10 @@ module FastApi { override predicate valueAllowsNewline() { none() } } + /** + * A dict-like write to an item of the `headers` attribute on a HTTP response, such as + * `response.headers[name] = value`. + */ class HeaderSubscriptWrite extends Http::Server::ResponseHeaderWrite::Range { DataFlow::Node index; DataFlow::Node value; diff --git a/python/ql/lib/semmle/python/frameworks/Tornado.qll b/python/ql/lib/semmle/python/frameworks/Tornado.qll index 1bd406032962..7bc4cf25794d 100644 --- a/python/ql/lib/semmle/python/frameworks/Tornado.qll +++ b/python/ql/lib/semmle/python/frameworks/Tornado.qll @@ -63,6 +63,50 @@ module Tornado { override string getAsyncMethodName() { none() } } + + /** + * A dict-like write to an item of an `HTTPHeaders` object. + */ + private class TornadoHeaderSubscriptWrite extends Http::Server::ResponseHeaderWrite::Range { + DataFlow::Node index; + DataFlow::Node value; + + TornadoHeaderSubscriptWrite() { + exists(SubscriptNode subscript | + subscript.getObject() = instance().asCfgNode() and + value.asCfgNode() = subscript.(DefinitionNode).getValue() and + index.asCfgNode() = subscript.getIndex() and + this.asCfgNode() = subscript + ) + } + + override DataFlow::Node getNameArg() { result = index } + + override DataFlow::Node getValueArg() { result = value } + + override predicate nameAllowsNewline() { none() } + + override predicate valueAllowsNewline() { none() } + } + + /** + * A call to `HTTPHeaders.add`. + */ + private class TornadoHeadersAppendCall extends Http::Server::ResponseHeaderWrite::Range, + DataFlow::MethodCallNode + { + TornadoHeadersAppendCall() { this.calls(instance(), "append") } + + override DataFlow::Node getNameArg() { result = [this.getArg(0), this.getArgByName("name")] } + + override DataFlow::Node getValueArg() { + result in [this.getArg(1), this.getArgByName("value")] + } + + override predicate nameAllowsNewline() { none() } + + override predicate valueAllowsNewline() { none() } + } } // --------------------------------------------------------------------------- @@ -209,6 +253,25 @@ module Tornado { this.(DataFlow::AttrRead).getAttributeName() = "request" } } + + /** A call to `RequestHandler.set_header` or `RequestHandler.add_header` */ + private class TornadoSetHeaderCall extends Http::Server::ResponseHeaderWrite::Range, + DataFlow::MethodCallNode + { + TornadoSetHeaderCall() { this.calls(instance(), ["set_header", "add_header"]) } + + override DataFlow::Node getNameArg() { + result = [this.getArg(0), this.getArgByName("name")] + } + + override DataFlow::Node getValueArg() { + result in [this.getArg(1), this.getArgByName("value")] + } + + override predicate nameAllowsNewline() { none() } + + override predicate valueAllowsNewline() { none() } + } } /** diff --git a/python/ql/test/library-tests/frameworks/aiohttp/response_test.py b/python/ql/test/library-tests/frameworks/aiohttp/response_test.py index bc9bc8d3bda2..a40bf0bbc65e 100644 --- a/python/ql/test/library-tests/frameworks/aiohttp/response_test.py +++ b/python/ql/test/library-tests/frameworks/aiohttp/response_test.py @@ -96,7 +96,7 @@ async def streaming_response(request): # $ requestHandler async def setting_cookie(request): # $ requestHandler resp = web.Response(text="foo") # $ HttpResponse mimetype=text/plain responseBody="foo" resp.cookies["key"] = "value" # $ CookieWrite CookieName="key" CookieValue="value" - resp.headers["Set-Cookie"] = "key2=value2" # $ MISSING: CookieWrite CookieRawHeader="key2=value2" + resp.headers["Set-Cookie"] = "key2=value2" # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" resp.set_cookie("key3", "value3") # $ CookieWrite CookieName="key3" CookieValue="value3" resp.set_cookie(name="key3", value="value3") # $ CookieWrite CookieName="key3" CookieValue="value3" resp.del_cookie("key4") # $ CookieWrite CookieName="key4" diff --git a/python/ql/test/library-tests/frameworks/tornado/response_test.py b/python/ql/test/library-tests/frameworks/tornado/response_test.py index 1ca37ed773c8..1685ac4d158d 100644 --- a/python/ql/test/library-tests/frameworks/tornado/response_test.py +++ b/python/ql/test/library-tests/frameworks/tornado/response_test.py @@ -24,10 +24,10 @@ def get(self): # $ requestHandler # what matters. self.write("foo") # $ HttpResponse mimetype=text/html responseBody="foo" - self.set_header("Content-Type", "text/plain; charset=utf-8") + self.set_header("Content-Type", "text/plain; charset=utf-8") # $ headerWriteName="Content-Type" headerWriteValue="text/plain; charset=utf-8" def post(self): # $ requestHandler - self.set_header("Content-Type", "text/plain; charset=utf-8") + self.set_header("Content-Type", "text/plain; charset=utf-8") # $ headerWriteName="Content-Type" headerWriteValue="text/plain; charset=utf-8" self.write("foo") # $ HttpResponse responseBody="foo" MISSING: mimetype=text/plain SPURIOUS: mimetype=text/html @@ -67,7 +67,10 @@ def get(self): # $ requestHandler self.write("foo") # $ HttpResponse mimetype=text/html responseBody="foo" self.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value" self.set_cookie(name="key", value="value") # $ CookieWrite CookieName="key" CookieValue="value" - self.set_header("Set-Cookie", "key2=value2") # $ MISSING: CookieWrite CookieRawHeader="key2=value2" + self.set_header("Set-Cookie", "key2=value2") # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" + self.add_header("Set-Cookie", "key3=value3") # $ headerWriteName="Set-Cookie" headerWriteValue="key3=value3" CookieWrite CookieRawHeader="key3=value3" + self.request.headers.append("Set-Cookie", "key4=value4") # $ headerWriteName="Set-Cookie" headerWriteValue="key4=value4" CookieWrite CookieRawHeader="key4=value4" + self.request.headers["Set-Cookie"] = "key5=value5" # $ headerWriteName="Set-Cookie" headerWriteValue="key5=value5" CookieWrite CookieRawHeader="key5=value5" def make_app(): From d0f735ac28c9747ff2bc7a6f20a5092daf667da4 Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Mon, 24 Jun 2024 20:52:09 +0100 Subject: [PATCH 28/70] Update tests for restframework --- .../library-tests/frameworks/rest_framework/response_test.py | 2 +- .../library-tests/frameworks/rest_framework/testapp/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/ql/test/library-tests/frameworks/rest_framework/response_test.py b/python/ql/test/library-tests/frameworks/rest_framework/response_test.py index ec093499df63..3e4f821693bf 100644 --- a/python/ql/test/library-tests/frameworks/rest_framework/response_test.py +++ b/python/ql/test/library-tests/frameworks/rest_framework/response_test.py @@ -28,7 +28,7 @@ def setting_cookie(request): resp = Response() # $ HttpResponse resp.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value" resp.set_cookie(key="key4", value="value") # $ CookieWrite CookieName="key4" CookieValue="value" - resp.headers["Set-Cookie"] = "key2=value2" # $ MISSING: CookieWrite CookieRawHeader="key2=value2" + resp.headers["Set-Cookie"] = "key2=value2" # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" resp.cookies["key3"] = "value3" # $ CookieWrite CookieName="key3" CookieValue="value3" resp.delete_cookie("key4") # $ CookieWrite CookieName="key4" resp.delete_cookie(key="key4") # $ CookieWrite CookieName="key4" diff --git a/python/ql/test/library-tests/frameworks/rest_framework/testapp/views.py b/python/ql/test/library-tests/frameworks/rest_framework/testapp/views.py index 6affb5dac4b9..6ce06fdba31e 100644 --- a/python/ql/test/library-tests/frameworks/rest_framework/testapp/views.py +++ b/python/ql/test/library-tests/frameworks/rest_framework/testapp/views.py @@ -70,7 +70,7 @@ def cookie_test(request: Request): # $ requestHandler resp = Response("wat") # $ HttpResponse resp.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value" resp.set_cookie(key="key4", value="value") # $ CookieWrite CookieName="key4" CookieValue="value" - resp.headers["Set-Cookie"] = "key2=value2" # $ MISSING: CookieWrite CookieRawHeader="key2=value2" + resp.headers["Set-Cookie"] = "key2=value2" # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" resp.cookies["key3"] = "value3" # $ CookieWrite CookieName="key3" CookieValue="value3" return resp From 0901b3d0a67aa4836161c9d188b706f38d5a1346 Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Mon, 24 Jun 2024 21:43:09 +0100 Subject: [PATCH 29/70] Add change note --- python/ql/lib/change-notes/2024-06-24-cookie-header-writes.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 python/ql/lib/change-notes/2024-06-24-cookie-header-writes.md diff --git a/python/ql/lib/change-notes/2024-06-24-cookie-header-writes.md b/python/ql/lib/change-notes/2024-06-24-cookie-header-writes.md new file mode 100644 index 000000000000..583e0f44c059 --- /dev/null +++ b/python/ql/lib/change-notes/2024-06-24-cookie-header-writes.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Additional modelling has been added to detect cookie writes from direct writes to the `Set-Cookie` header have been added for several web frameworks. \ No newline at end of file From 6538d22d3f32dce3a8762bbe15b1621e3c34a556 Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Wed, 26 Jun 2024 09:21:53 +0100 Subject: [PATCH 30/70] Fix tornado model of httheaders.add. --- python/ql/lib/semmle/python/frameworks/Tornado.qll | 2 +- .../ql/test/library-tests/frameworks/tornado/response_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/ql/lib/semmle/python/frameworks/Tornado.qll b/python/ql/lib/semmle/python/frameworks/Tornado.qll index 7bc4cf25794d..214f2fb9bad3 100644 --- a/python/ql/lib/semmle/python/frameworks/Tornado.qll +++ b/python/ql/lib/semmle/python/frameworks/Tornado.qll @@ -95,7 +95,7 @@ module Tornado { private class TornadoHeadersAppendCall extends Http::Server::ResponseHeaderWrite::Range, DataFlow::MethodCallNode { - TornadoHeadersAppendCall() { this.calls(instance(), "append") } + TornadoHeadersAppendCall() { this.calls(instance(), "add") } override DataFlow::Node getNameArg() { result = [this.getArg(0), this.getArgByName("name")] } diff --git a/python/ql/test/library-tests/frameworks/tornado/response_test.py b/python/ql/test/library-tests/frameworks/tornado/response_test.py index 1685ac4d158d..a1054f28dc96 100644 --- a/python/ql/test/library-tests/frameworks/tornado/response_test.py +++ b/python/ql/test/library-tests/frameworks/tornado/response_test.py @@ -69,7 +69,7 @@ def get(self): # $ requestHandler self.set_cookie(name="key", value="value") # $ CookieWrite CookieName="key" CookieValue="value" self.set_header("Set-Cookie", "key2=value2") # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2" self.add_header("Set-Cookie", "key3=value3") # $ headerWriteName="Set-Cookie" headerWriteValue="key3=value3" CookieWrite CookieRawHeader="key3=value3" - self.request.headers.append("Set-Cookie", "key4=value4") # $ headerWriteName="Set-Cookie" headerWriteValue="key4=value4" CookieWrite CookieRawHeader="key4=value4" + self.request.headers.add("Set-Cookie", "key4=value4") # $ headerWriteName="Set-Cookie" headerWriteValue="key4=value4" CookieWrite CookieRawHeader="key4=value4" self.request.headers["Set-Cookie"] = "key5=value5" # $ headerWriteName="Set-Cookie" headerWriteValue="key5=value5" CookieWrite CookieRawHeader="key5=value5" From f22778960bfdaa674adff0d1fac1392350048f93 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:31:57 +0100 Subject: [PATCH 31/70] Fixed expected test results for Helmet query --- .../test/query-tests/Security/CWE-693/InsecureHelmet.expected | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmet.expected b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmet.expected index 7368d96f3d43..2c9407136aa4 100644 --- a/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmet.expected +++ b/javascript/ql/test/query-tests/Security/CWE-693/InsecureHelmet.expected @@ -1,2 +1,2 @@ -| InsecureHelmetBad.js:7:5:7:32 | content ... : false | Helmet route handler, called with $@ set to 'false' | InsecureHelmetBad.js:7:5:7:32 | content ... : false | contentSecurityPolicy | -| InsecureHelmetBad.js:8:5:8:21 | frameguard: false | Helmet route handler, called with $@ set to 'false' | InsecureHelmetBad.js:8:5:8:21 | frameguard: false | frameguard | +| InsecureHelmetBad.js:6:9:9:2 | helmet( ... uard\\n}) | Helmet security middleware, configured with security setting $@ set to 'false', which disables enforcing that feature. | InsecureHelmetBad.js:7:5:7:32 | content ... : false | contentSecurityPolicy | +| InsecureHelmetBad.js:6:9:9:2 | helmet( ... uard\\n}) | Helmet security middleware, configured with security setting $@ set to 'false', which disables enforcing that feature. | InsecureHelmetBad.js:8:5:8:21 | frameguard: false | frameguard | From b81d41ba7b64c81717ff49ce51be293ff344a0e5 Mon Sep 17 00:00:00 2001 From: Joe Farebrother <joefarebrother@github.com> Date: Mon, 1 Jul 2024 11:26:54 +0100 Subject: [PATCH 32/70] Add django header write models for direct subscript write --- .../lib/semmle/python/frameworks/Django.qll | 30 +++++++++++++++++++ .../Security/CWE-614/CookieInjection.expected | 11 +++++++ .../Security/CWE-614/InsecureCookie.expected | 6 ++++ .../Security/CWE-614/django_bad.py | 4 +-- .../frameworks/django-v2-v3/response_test.py | 3 +- 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/python/ql/lib/semmle/python/frameworks/Django.qll b/python/ql/lib/semmle/python/frameworks/Django.qll index 69b0e8710daf..b3b027e48ffe 100644 --- a/python/ql/lib/semmle/python/frameworks/Django.qll +++ b/python/ql/lib/semmle/python/frameworks/Django.qll @@ -2274,6 +2274,36 @@ module PrivateDjango { override predicate valueAllowsNewline() { none() } } + + /** + * A dict-like write to an item of an HTTP response, which is treated as a header write, + * such as `response[headerName] = value` + */ + class DjangoResponseSubscriptWrite extends Http::Server::ResponseHeaderWrite::Range { + DataFlow::Node index; + DataFlow::Node value; + + DjangoResponseSubscriptWrite() { + exists(SubscriptNode subscript | + // To give `this` a value, we need to choose between either LHS or RHS, + // and just go with the LHS + this.asCfgNode() = subscript + | + subscript.getObject() = + DjangoImpl::DjangoHttp::Response::HttpResponse::instance().asCfgNode() and + value.asCfgNode() = subscript.(DefinitionNode).getValue() and + index.asCfgNode() = subscript.getIndex() + ) + } + + override DataFlow::Node getNameArg() { result = index } + + override DataFlow::Node getValueArg() { result = value } + + override predicate nameAllowsNewline() { none() } + + override predicate valueAllowsNewline() { none() } + } } } diff --git a/python/ql/test/experimental/query-tests/Security/CWE-614/CookieInjection.expected b/python/ql/test/experimental/query-tests/Security/CWE-614/CookieInjection.expected index 1b3120c8546c..80dcbae21773 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-614/CookieInjection.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-614/CookieInjection.expected @@ -1,4 +1,6 @@ edges +| django_bad.py:27:33:27:67 | ControlFlowNode for Attribute() | django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | provenance | | +| django_bad.py:27:71:27:106 | ControlFlowNode for Attribute() | django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | provenance | | | flask_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | flask_bad.py:1:26:1:32 | ControlFlowNode for request | provenance | | | flask_bad.py:1:26:1:32 | ControlFlowNode for request | flask_bad.py:24:21:24:27 | ControlFlowNode for request | provenance | | | flask_bad.py:1:26:1:32 | ControlFlowNode for request | flask_bad.py:24:49:24:55 | ControlFlowNode for request | provenance | | @@ -12,6 +14,9 @@ edges nodes | django_bad.py:19:21:19:55 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | semmle.label | ControlFlowNode for Fstring | +| django_bad.py:27:33:27:67 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| django_bad.py:27:71:27:106 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | flask_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | flask_bad.py:1:26:1:32 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | flask_bad.py:24:21:24:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -29,6 +34,12 @@ subpaths | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | Cookie is constructed from a $@,and its httponly flag is not properly set. | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | user-supplied input | | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | Cookie is constructed from a $@,and its samesite flag is not properly set. | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | user-supplied input | | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | Cookie is constructed from a $@,and its secure flag is not properly set. | django_bad.py:20:21:20:56 | ControlFlowNode for Attribute() | user-supplied input | +| django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | django_bad.py:27:33:27:67 | ControlFlowNode for Attribute() | django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | Cookie is constructed from a $@,and its httponly flag is not properly set. | django_bad.py:27:33:27:67 | ControlFlowNode for Attribute() | user-supplied input | +| django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | django_bad.py:27:33:27:67 | ControlFlowNode for Attribute() | django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | Cookie is constructed from a $@,and its samesite flag is not properly set. | django_bad.py:27:33:27:67 | ControlFlowNode for Attribute() | user-supplied input | +| django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | django_bad.py:27:33:27:67 | ControlFlowNode for Attribute() | django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | Cookie is constructed from a $@,and its secure flag is not properly set. | django_bad.py:27:33:27:67 | ControlFlowNode for Attribute() | user-supplied input | +| django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | django_bad.py:27:71:27:106 | ControlFlowNode for Attribute() | django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | Cookie is constructed from a $@,and its httponly flag is not properly set. | django_bad.py:27:71:27:106 | ControlFlowNode for Attribute() | user-supplied input | +| django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | django_bad.py:27:71:27:106 | ControlFlowNode for Attribute() | django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | Cookie is constructed from a $@,and its samesite flag is not properly set. | django_bad.py:27:71:27:106 | ControlFlowNode for Attribute() | user-supplied input | +| django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | django_bad.py:27:71:27:106 | ControlFlowNode for Attribute() | django_bad.py:27:30:27:124 | ControlFlowNode for Fstring | Cookie is constructed from a $@,and its secure flag is not properly set. | django_bad.py:27:71:27:106 | ControlFlowNode for Attribute() | user-supplied input | | flask_bad.py:24:21:24:40 | ControlFlowNode for Subscript | flask_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | flask_bad.py:24:21:24:40 | ControlFlowNode for Subscript | Cookie is constructed from a $@,and its httponly flag is not properly set. | flask_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | user-supplied input | | flask_bad.py:24:21:24:40 | ControlFlowNode for Subscript | flask_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | flask_bad.py:24:21:24:40 | ControlFlowNode for Subscript | Cookie is constructed from a $@,and its samesite flag is not properly set. | flask_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | user-supplied input | | flask_bad.py:24:21:24:40 | ControlFlowNode for Subscript | flask_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | flask_bad.py:24:21:24:40 | ControlFlowNode for Subscript | Cookie is constructed from a $@,and its secure flag is not properly set. | flask_bad.py:1:26:1:32 | ControlFlowNode for ImportMember | user-supplied input | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-614/InsecureCookie.expected b/python/ql/test/experimental/query-tests/Security/CWE-614/InsecureCookie.expected index 2743a8d21167..61f9b9b74692 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-614/InsecureCookie.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-614/InsecureCookie.expected @@ -1,9 +1,15 @@ | django_bad.py:6:5:7:52 | ControlFlowNode for Attribute() | Cookie is added without the 'httponly' flag properly set. | | django_bad.py:6:5:7:52 | ControlFlowNode for Attribute() | Cookie is added without the 'samesite' flag properly set. | | django_bad.py:6:5:7:52 | ControlFlowNode for Attribute() | Cookie is added without the 'secure' flag properly set. | +| django_bad.py:13:5:13:26 | ControlFlowNode for Subscript | Cookie is added without the 'httponly' flag properly set. | +| django_bad.py:13:5:13:26 | ControlFlowNode for Subscript | Cookie is added without the 'samesite' flag properly set. | +| django_bad.py:13:5:13:26 | ControlFlowNode for Subscript | Cookie is added without the 'secure' flag properly set. | | django_bad.py:19:5:21:66 | ControlFlowNode for Attribute() | Cookie is added without the 'httponly' flag properly set. | | django_bad.py:19:5:21:66 | ControlFlowNode for Attribute() | Cookie is added without the 'samesite' flag properly set. | | django_bad.py:19:5:21:66 | ControlFlowNode for Attribute() | Cookie is added without the 'secure' flag properly set. | +| django_bad.py:27:5:27:26 | ControlFlowNode for Subscript | Cookie is added without the 'httponly' flag properly set. | +| django_bad.py:27:5:27:26 | ControlFlowNode for Subscript | Cookie is added without the 'samesite' flag properly set. | +| django_bad.py:27:5:27:26 | ControlFlowNode for Subscript | Cookie is added without the 'secure' flag properly set. | | django_good.py:19:5:19:44 | ControlFlowNode for Attribute() | Cookie is added without the 'httponly' flag properly set. | | django_good.py:19:5:19:44 | ControlFlowNode for Attribute() | Cookie is added without the 'samesite' flag properly set. | | django_good.py:19:5:19:44 | ControlFlowNode for Attribute() | Cookie is added without the 'secure' flag properly set. | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-614/django_bad.py b/python/ql/test/experimental/query-tests/Security/CWE-614/django_bad.py index 45cece4390f1..6f1916930e53 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-614/django_bad.py +++ b/python/ql/test/experimental/query-tests/Security/CWE-614/django_bad.py @@ -7,7 +7,7 @@ def django_response(request): httponly=False, samesite='None') return resp -# This test no longer produces an output due to django header setting methods not being modeled in the main query pack + def django_response(): response = django.http.HttpResponse() response['Set-Cookie'] = "name=value; SameSite=None;" @@ -21,7 +21,7 @@ def django_response(request): secure=False, httponly=False, samesite='None') return resp -# This test no longer produces an output due to django header setting methods not being modeled in the main query pack + def django_response(): response = django.http.HttpResponse() response['Set-Cookie'] = f"{django.http.request.GET.get('name')}={django.http.request.GET.get('value')}; SameSite=None;" diff --git a/python/ql/test/library-tests/frameworks/django-v2-v3/response_test.py b/python/ql/test/library-tests/frameworks/django-v2-v3/response_test.py index d4f17f7c3cf7..7722b4de8e18 100644 --- a/python/ql/test/library-tests/frameworks/django-v2-v3/response_test.py +++ b/python/ql/test/library-tests/frameworks/django-v2-v3/response_test.py @@ -62,7 +62,7 @@ def redirect_through_normal_response(request): resp = HttpResponse() # $ HttpResponse mimetype=text/html resp.status_code = 302 - resp['Location'] = next # $ MISSING: redirectLocation=next + resp['Location'] = next # $ headerWriteName='Location' headerWriteValue=next MISSING: redirectLocation=next resp.content = private # $ MISSING: responseBody=private return resp @@ -134,4 +134,5 @@ def setting_cookie(request): resp.cookies["key3"] = "value3" # $ CookieWrite CookieName="key3" CookieValue="value3" resp.delete_cookie("key4") # $ CookieWrite CookieName="key4" resp.delete_cookie(key="key4") # $ CookieWrite CookieName="key4" + resp["Set-Cookie"] = "key5=value5" # $ headerWriteName="Set-Cookie" headerWriteValue="key5=value5" CookieWrite CookieRawHeader="key5=value5" return resp From d1d082982ac5f63ed0a60f4de41ec748dd38dfe8 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Mon, 1 Jul 2024 14:25:29 +0100 Subject: [PATCH 33/70] More external references --- javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index e294779d6b85..30fb2f891790 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -57,5 +57,14 @@ <li> <a href="https://helmetjs.github.io/">helmet.js website</a> </li> + <li> + <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy">Content Security Policy (CSP) | MDN</a> + </li> + <li> + <a href="https://infosec.mozilla.org/guidelines/web_security">Mozilla Web Security Guidelines</a> + </li> + <li> + <a href="https://developer.mozilla.org/en-US/docs/Web/Security#protect_against_clickjacking">Protect against clickjacking | MDN</a> + </references> </qhelp> \ No newline at end of file From fc6fba8d06f04fa2b6af60b91a3fa6519445174a Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Mon, 1 Jul 2024 14:25:47 +0100 Subject: [PATCH 34/70] Fixed CWE tags --- javascript/ql/src/Security/CWE-693/InsecureHelmet.ql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql index c4437d4913d4..8f837669ffc3 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.ql @@ -7,8 +7,8 @@ * @precision high * @id js/insecure-helmet-configuration * @tags security - * cwe-693 - * cwe-1021 + * external/cwe/cwe-693 + * external/cwe/cwe-1021 */ import javascript From 808af286182c622960da61bc86eb94fd93feb926 Mon Sep 17 00:00:00 2001 From: Porcupiney Hairs <porcupiney.hairs@protonmail.com> Date: Sat, 15 Jun 2024 20:53:00 +0530 Subject: [PATCH 35/70] Python : Arbitrary codde execution due to Js2Py Js2Py is a Javascript to Python translation library written in Python. It allows users to invoke JavaScript code directly from Python. The Js2Py interpreter by default exposes the entire standard library to it's users. This can lead to security issues if a malicious input were directly. This PR includes a CodeQL query along with a qhelp and testcases to detect cases where an untrusted input flows to an Js2Py eval call. This query successfully detects CVE-2023-0297 in `pyload/pyload`along with it's fix. The databases can be downloaded from the links bellow. ``` https://file.io/qrMEjSJJoTq1 https://filetransfer.io/data-package/a02eab7V#link ``` --- .../experimental/Security/CWE-094/Js2Py.qhelp | 24 +++++++++++++ .../experimental/Security/CWE-094/Js2Py.ql | 36 +++++++++++++++++++ .../experimental/Security/CWE-094/Js2pyBad.py | 4 +++ .../Security/CWE-094/Js2pyGood.py | 6 ++++ .../Security/CWE-094/Js2Py.expected | 10 ++++++ .../query-tests/Security/CWE-094/Js2Py.qlref | 1 + .../query-tests/Security/CWE-094/Js2PyTest.py | 10 ++++++ 7 files changed, 91 insertions(+) create mode 100644 python/ql/src/experimental/Security/CWE-094/Js2Py.qhelp create mode 100644 python/ql/src/experimental/Security/CWE-094/Js2Py.ql create mode 100644 python/ql/src/experimental/Security/CWE-094/Js2pyBad.py create mode 100644 python/ql/src/experimental/Security/CWE-094/Js2pyGood.py create mode 100644 python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.expected create mode 100644 python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.qlref create mode 100644 python/ql/test/experimental/query-tests/Security/CWE-094/Js2PyTest.py diff --git a/python/ql/src/experimental/Security/CWE-094/Js2Py.qhelp b/python/ql/src/experimental/Security/CWE-094/Js2Py.qhelp new file mode 100644 index 000000000000..f1fed6c38f6d --- /dev/null +++ b/python/ql/src/experimental/Security/CWE-094/Js2Py.qhelp @@ -0,0 +1,24 @@ +<!DOCTYPE qhelp SYSTEM "qhelp.dtd"> +<qhelp> + <overview> + <p> + Passing untrusted inputs to a JavaScript interpreter like `Js2Py` can lead to arbitrary + code execution. + </p> + </overview> + <recommendation> + <p> This vulnerability can be prevented either by preventing an untrusted user input to flow + to an <code>eval_js</code> call. Or, the impact of this vulnerability can be + significantly reduced by disabling imports from the interepreted code (note that in a <a + href="https://github.com/PiotrDabkowski/Js2Py/issues/45#issuecomment-258724406"> + comment</a> the author of the library highlights that Js2Py is still insecure with this + option).</p> + </recommendation> + <example> + <p>In the example below, the Javascript code being evaluated is controlled by the user and + hence leads to arbitrary code execution.</p> + <sample src="Js2PyBad.py" /> + <p>This can be fixed by disabling imports before evaluating the user passed buffer. + <sample src="Js2PyGood.py" /> + </example> +</qhelp> \ No newline at end of file diff --git a/python/ql/src/experimental/Security/CWE-094/Js2Py.ql b/python/ql/src/experimental/Security/CWE-094/Js2Py.ql new file mode 100644 index 000000000000..0dc0145a1e7d --- /dev/null +++ b/python/ql/src/experimental/Security/CWE-094/Js2Py.ql @@ -0,0 +1,36 @@ +/** + * @name JavaScript code execution. + * @description Passing user supplied arguments to a Javascript to Python translation engine such as Js2Py can lead to remote code execution. + * @severity high + * @kind path-problem + * @id py/js2py-rce + * @tags security + * experimental + * external/cwe/cwe-94 + */ + +import python +import semmle.python.ApiGraphs +import semmle.python.dataflow.new.TaintTracking +import semmle.python.dataflow.new.RemoteFlowSources +import semmle.python.Concepts + +module Js2PyFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { node instanceof RemoteFlowSource } + + predicate isSink(DataFlow::Node node) { + API::moduleImport("js2py").getMember(["eval_js", "eval_js6", "EvalJs"]).getACall().getArg(_) = + node + } +} + +module Js2PyFlow = TaintTracking::Global<Js2PyFlowConfig>; + +import Js2PyFlow::PathGraph + +from Js2PyFlow::PathNode source, Js2PyFlow::PathNode sink +where + Js2PyFlow::flowPath(source, sink) and + not exists(API::moduleImport("js2py").getMember("disable_pyimport").getACall()) +select sink, source, sink, "This input to Js2Py depends on a $@.", source.getNode(), + "user-provided value" diff --git a/python/ql/src/experimental/Security/CWE-094/Js2pyBad.py b/python/ql/src/experimental/Security/CWE-094/Js2pyBad.py new file mode 100644 index 000000000000..69791a424628 --- /dev/null +++ b/python/ql/src/experimental/Security/CWE-094/Js2pyBad.py @@ -0,0 +1,4 @@ +@bp.route("/bad") +def bad(): + jk = flask.request.form["jk"] + jk = eval_js(f"{jk} f()") diff --git a/python/ql/src/experimental/Security/CWE-094/Js2pyGood.py b/python/ql/src/experimental/Security/CWE-094/Js2pyGood.py new file mode 100644 index 000000000000..dd034d48bb30 --- /dev/null +++ b/python/ql/src/experimental/Security/CWE-094/Js2pyGood.py @@ -0,0 +1,6 @@ +@bp.route("/good") +def good(): + # disable python imports to prevent execution of malicious code + js2py.disable_pyimport() + jk = flask.request.form["jk"] + jk = eval_js(f"{jk} f()") diff --git a/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.expected b/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.expected new file mode 100644 index 000000000000..2d4542b92ec9 --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.expected @@ -0,0 +1,10 @@ +edges +| Js2PyTest.py:9:5:9:6 | ControlFlowNode for jk | Js2PyTest.py:10:18:10:28 | ControlFlowNode for Fstring | provenance | | +| Js2PyTest.py:9:10:9:22 | ControlFlowNode for Attribute | Js2PyTest.py:9:5:9:6 | ControlFlowNode for jk | provenance | AdditionalTaintStep | +nodes +| Js2PyTest.py:9:5:9:6 | ControlFlowNode for jk | semmle.label | ControlFlowNode for jk | +| Js2PyTest.py:9:10:9:22 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| Js2PyTest.py:10:18:10:28 | ControlFlowNode for Fstring | semmle.label | ControlFlowNode for Fstring | +subpaths +#select +| Js2PyTest.py:10:18:10:28 | ControlFlowNode for Fstring | Js2PyTest.py:9:10:9:22 | ControlFlowNode for Attribute | Js2PyTest.py:10:18:10:28 | ControlFlowNode for Fstring | This can lead to arbitrary code execution | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.qlref b/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.qlref new file mode 100644 index 000000000000..457bfe2aacca --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.qlref @@ -0,0 +1 @@ +experimental/Security/CWE-094/Js2Py.ql diff --git a/python/ql/test/experimental/query-tests/Security/CWE-094/Js2PyTest.py b/python/ql/test/experimental/query-tests/Security/CWE-094/Js2PyTest.py new file mode 100644 index 000000000000..f7aae16a9eed --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-094/Js2PyTest.py @@ -0,0 +1,10 @@ + +import flask +from js2py import eval_js, disable_pyimport + +bp = flask.Blueprint("app", __name__, url_prefix="/") + +@bp.route("/bad") +def bad(): + jk = flask.request.form["jk"] + jk = eval_js(f"{jk} f()") \ No newline at end of file From 3260966e3b0038ce06c31258b35ff70c0464ae6d Mon Sep 17 00:00:00 2001 From: Ian Lynagh <igfoo@github.com> Date: Wed, 3 Jul 2024 17:10:41 +0100 Subject: [PATCH 36/70] Kotlin: Remove unused SEMMLE_DIST --- .../src/main/java/com/semmle/util/process/Env.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/java/kotlin-extractor/src/main/java/com/semmle/util/process/Env.java b/java/kotlin-extractor/src/main/java/com/semmle/util/process/Env.java index 0b4b2a829fb6..2edfbb3e1647 100644 --- a/java/kotlin-extractor/src/main/java/com/semmle/util/process/Env.java +++ b/java/kotlin-extractor/src/main/java/com/semmle/util/process/Env.java @@ -50,10 +50,6 @@ public enum Var { * The location of any caches used by the toolchain, including compilation caches, trap caches, etc. */ SEMMLE_CACHE, - /** - * The location of the toolchain files, including the odasa jar, our queries etc. - */ - SEMMLE_DIST, /** * If running from a git tree, the root of the tree. */ From ea16f72c6fdb5bebb7629f765695e5713b498fa5 Mon Sep 17 00:00:00 2001 From: Ian Lynagh <igfoo@github.com> Date: Wed, 3 Jul 2024 17:12:04 +0100 Subject: [PATCH 37/70] Java: Add changenote for dropping $SEMMLE_DIST support --- java/ql/lib/change-notes/2024-07-03-env-var-semmle-dist.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 java/ql/lib/change-notes/2024-07-03-env-var-semmle-dist.md diff --git a/java/ql/lib/change-notes/2024-07-03-env-var-semmle-dist.md b/java/ql/lib/change-notes/2024-07-03-env-var-semmle-dist.md new file mode 100644 index 000000000000..372bed1eb662 --- /dev/null +++ b/java/ql/lib/change-notes/2024-07-03-env-var-semmle-dist.md @@ -0,0 +1,4 @@ +--- +category: breaking +--- +* The Java extractor no longer supports the `SEMMLE_DIST` legacy environment variable. From 8d1113cdafa0f22e0dffbffe53f965d3082e8e94 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen <rasmuswl@github.com> Date: Thu, 4 Jul 2024 14:01:30 +0200 Subject: [PATCH 38/70] Python: Fixup qhelp --- python/ql/src/experimental/Security/CWE-094/Js2Py.qhelp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/ql/src/experimental/Security/CWE-094/Js2Py.qhelp b/python/ql/src/experimental/Security/CWE-094/Js2Py.qhelp index f1fed6c38f6d..6be0b43d1a1f 100644 --- a/python/ql/src/experimental/Security/CWE-094/Js2Py.qhelp +++ b/python/ql/src/experimental/Security/CWE-094/Js2Py.qhelp @@ -17,8 +17,8 @@ <example> <p>In the example below, the Javascript code being evaluated is controlled by the user and hence leads to arbitrary code execution.</p> - <sample src="Js2PyBad.py" /> - <p>This can be fixed by disabling imports before evaluating the user passed buffer. - <sample src="Js2PyGood.py" /> + <sample src="Js2pyBad.py" /> + <p>This can be fixed by disabling imports before evaluating the user passed buffer.</p> + <sample src="Js2pyGood.py" /> </example> -</qhelp> \ No newline at end of file +</qhelp> From 0a32f9fed67b76a602c0731bc79c397b775a8f7a Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen <rasmuswl@github.com> Date: Thu, 4 Jul 2024 14:09:37 +0200 Subject: [PATCH 39/70] Python: Update query metadata --- python/ql/src/experimental/Security/CWE-094/Js2Py.ql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/ql/src/experimental/Security/CWE-094/Js2Py.ql b/python/ql/src/experimental/Security/CWE-094/Js2Py.ql index 0dc0145a1e7d..5dc160077873 100644 --- a/python/ql/src/experimental/Security/CWE-094/Js2Py.ql +++ b/python/ql/src/experimental/Security/CWE-094/Js2Py.ql @@ -1,7 +1,9 @@ /** * @name JavaScript code execution. * @description Passing user supplied arguments to a Javascript to Python translation engine such as Js2Py can lead to remote code execution. - * @severity high + * @problem.severity error + * @security-severity 9.3 + * @precision high * @kind path-problem * @id py/js2py-rce * @tags security From c003f265b0929fd3e54ea458a0db135e40dfbf75 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:58:06 +0100 Subject: [PATCH 40/70] Fixed missing li closing tag --- javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp | 1 + 1 file changed, 1 insertion(+) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index 30fb2f891790..4a1fbb7cac86 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -65,6 +65,7 @@ </li> <li> <a href="https://developer.mozilla.org/en-US/docs/Web/Security#protect_against_clickjacking">Protect against clickjacking | MDN</a> + </li> </references> </qhelp> \ No newline at end of file From 2aff2a73854ab13807bae92d9e704297de9eda02 Mon Sep 17 00:00:00 2001 From: aegilops <41705651+aegilops@users.noreply.github.com> Date: Mon, 8 Jul 2024 11:31:06 +0100 Subject: [PATCH 41/70] Fixed code markup --- javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp index 4a1fbb7cac86..c2cacbdf2faf 100644 --- a/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp +++ b/javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp @@ -19,7 +19,7 @@ </p> <p> - Users of the query can extend the set of required Helmet features by adding additional checks for them, using CodeQL <a href="https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/">data extensions</a> in a <a href="https://docs.github.com/en/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-and-working-with-codeql-packs#creating-a-codeql-model-pack">CodeQL model pack</a>. See `CUSTOMIZING.md` in the query source for more information. + Users of the query can extend the set of required Helmet features by adding additional checks for them, using CodeQL <a href="https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/">data extensions</a> in a <a href="https://docs.github.com/en/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-and-working-with-codeql-packs#creating-a-codeql-model-pack">CodeQL model pack</a>. See <code>CUSTOMIZING.md</code> in the query source for more information. </p> </overview> From 7fc1e13672b74c600d80abdf69ea3bb0c82c0f23 Mon Sep 17 00:00:00 2001 From: Tamas Vajk <tamasvajk@github.com> Date: Mon, 8 Jul 2024 14:08:15 +0200 Subject: [PATCH 42/70] C#: Add buildless integration test with Windows Forms application --- .../standalone_winforms/Assemblies.expected | 0 .../standalone_winforms/Assemblies.ql | 11 ++++++ .../CompilationInfo.expected | 18 +++++++++ .../standalone_winforms/CompilationInfo.ql | 16 ++++++++ .../standalone_winforms/Form1.Designer.cs | 38 +++++++++++++++++++ .../standalone_winforms/Form1.cs | 9 +++++ .../standalone_winforms/Program.cs | 16 ++++++++ .../standalone_winforms/global.json | 5 +++ .../all-platforms/standalone_winforms/test.py | 3 ++ .../standalone_winforms/winforms.csproj | 11 ++++++ 10 files changed, 127 insertions(+) create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.ql create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/Form1.Designer.cs create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/Form1.cs create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/test.py create mode 100644 csharp/ql/integration-tests/all-platforms/standalone_winforms/winforms.csproj diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.ql b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.ql new file mode 100644 index 000000000000..d47b596f0afd --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.ql @@ -0,0 +1,11 @@ +import csharp + +private string getPath(Assembly a) { + not a.getCompilation().getOutputAssembly() = a and + exists(string s | s = a.getFile().getAbsolutePath() | + result = "[...]" + s.substring(s.indexOf("microsoft.windowsdesktop.app.ref") - 1, s.length()) + ) +} + +from Assembly a +select getPath(a) diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected new file mode 100644 index 000000000000..0d59e0c3fd6a --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected @@ -0,0 +1,18 @@ +| All Nuget feeds reachable | 1.0 | +| Failed project restore with package source error | 0.0 | +| Failed solution restore with package source error | 0.0 | +| NuGet feed responsiveness checked | 1.0 | +| Project files on filesystem | 1.0 | +| Reachable fallback Nuget feed count | 1.0 | +| Resource extraction enabled | 0.0 | +| Restored .NET framework variants | 0.0 | +| Restored projects through solution files | 0.0 | +| Solution files on filesystem | 0.0 | +| Source files generated | 1.0 | +| Source files on filesystem | 3.0 | +| Successfully restored project files | 0.0 | +| Successfully restored solution files | 0.0 | +| Unresolved references | 0.0 | +| UseWPF set | 0.0 | +| UseWindowsForms set | 1.0 | +| WebView extraction enabled | 1.0 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql new file mode 100644 index 000000000000..a96c2fd99a69 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql @@ -0,0 +1,16 @@ +import csharp +import semmle.code.csharp.commons.Diagnostics + +query predicate compilationInfo(string key, float value) { + key != "Resolved references" and + key != "Resolved assembly conflicts" and + not key.matches("Compiler diagnostic count for%") and + exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | + key = infoKey and + value = infoValue.toFloat() + or + not exists(infoValue.toFloat()) and + key = infoKey + ": " + infoValue and + value = 1 + ) +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Form1.Designer.cs b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Form1.Designer.cs new file mode 100644 index 000000000000..841a32410f7e --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Form1.Designer.cs @@ -0,0 +1,38 @@ +namespace winforms; + +partial class Form1 +{ + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Text = "Form1"; + } + + #endregion +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Form1.cs b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Form1.cs new file mode 100644 index 000000000000..834b9ce772b0 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Form1.cs @@ -0,0 +1,9 @@ +namespace winforms; + +public partial class Form1 : Form +{ + public Form1() + { + InitializeComponent(); + } +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Program.cs b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Program.cs new file mode 100644 index 000000000000..822a48b121e2 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Program.cs @@ -0,0 +1,16 @@ +namespace winforms; + +static class Program +{ + /// <summary> + /// The main entry point for the application. + /// </summary> + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new Form1()); + } +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json b/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json new file mode 100644 index 000000000000..5c3fd64fbd12 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "8.0.101" + } +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/test.py b/csharp/ql/integration-tests/all-platforms/standalone_winforms/test.py new file mode 100644 index 000000000000..8609eca2f16f --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/test.py @@ -0,0 +1,3 @@ +from create_database_utils import * + +run_codeql_database_create(lang="csharp", extra_args=["--build-mode=none"]) diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/winforms.csproj b/csharp/ql/integration-tests/all-platforms/standalone_winforms/winforms.csproj new file mode 100644 index 000000000000..bcc83124518c --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/winforms.csproj @@ -0,0 +1,11 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>WinExe</OutputType> + <TargetFramework>net8.0-windows</TargetFramework> + <Nullable>enable</Nullable> + <UseWindowsForms>true</UseWindowsForms> + <ImplicitUsings>enable</ImplicitUsings> + </PropertyGroup> + +</Project> \ No newline at end of file From 7387c565e41498c3e403f872d512906c3e30bb74 Mon Sep 17 00:00:00 2001 From: Tamas Vajk <tamasvajk@github.com> Date: Mon, 8 Jul 2024 14:09:12 +0200 Subject: [PATCH 43/70] C#: Restore Windows dependencies when Windows Forms or WPF usage is detected --- .../DotNet.cs | 5 ++ .../IDotNet.cs | 2 +- .../NugetPackageRestorer.cs | 10 +++- .../standalone_winforms/Assemblies.expected | 47 +++++++++++++++++++ .../CompilationInfo.expected | 4 +- 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index 655c89abd771..0e47f1d1911d 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -69,6 +69,11 @@ private string GetRestoreArgs(RestoreSettings restoreSettings) args += " --force"; } + if (restoreSettings.TargetWindows) + { + args += " /p:EnableWindowsTargeting=true"; + } + return args; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs index c4e4557aa34e..2c10afa80ef2 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs @@ -17,7 +17,7 @@ public interface IDotNet IList<string> GetNugetFeedsFromFolder(string folderPath); } - public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? PathToNugetConfig = null, bool ForceReevaluation = false); + public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? PathToNugetConfig = null, bool ForceReevaluation = false, bool TargetWindows = false); public partial record class RestoreResult(bool Success, IList<string> Output) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 4ad4c8c9e31a..5d7a0a8ab928 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -225,10 +225,13 @@ private IEnumerable<string> RestoreSolutions(out DependencyContainer dependencie var successCount = 0; var nugetSourceFailures = 0; var assets = new Assets(logger); + + var isWindows = fileContent.UseWindowsForms || fileContent.UseWpf; + var projects = fileProvider.Solutions.SelectMany(solution => { logger.LogInfo($"Restoring solution {solution}..."); - var res = dotnet.Restore(new(solution, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true)); + var res = dotnet.Restore(new(solution, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, TargetWindows: isWindows)); if (res.Success) { successCount++; @@ -258,6 +261,9 @@ private void RestoreProjects(IEnumerable<string> projects, out ConcurrentBag<Dep var successCount = 0; var nugetSourceFailures = 0; ConcurrentBag<DependencyContainer> collectedDependencies = []; + + var isWindows = fileContent.UseWindowsForms || fileContent.UseWpf; + var sync = new object(); var projectGroups = projects.GroupBy(Path.GetDirectoryName); Parallel.ForEach(projectGroups, new ParallelOptions { MaxDegreeOfParallelism = DependencyManager.Threads }, projectGroup => @@ -266,7 +272,7 @@ private void RestoreProjects(IEnumerable<string> projects, out ConcurrentBag<Dep foreach (var project in projectGroup) { logger.LogInfo($"Restoring project {project}..."); - var res = dotnet.Restore(new(project, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true)); + var res = dotnet.Restore(new(project, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, TargetWindows: isWindows)); assets.AddDependenciesRange(res.AssetsFilePaths); lock (sync) { diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected index e69de29bb2d1..058ec9e2f355 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected @@ -0,0 +1,47 @@ +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Accessibility.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.Forms.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.VisualBasic.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.Registry.AccessControl.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/Microsoft.Win32.SystemEvents.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationCore.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Aero2.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Aero.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.AeroLite.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Classic.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Luna.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.Royale.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationFramework.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/PresentationUI.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/ReachFramework.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.CodeDom.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Configuration.ConfigurationManager.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Design.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Diagnostics.EventLog.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Diagnostics.PerformanceCounter.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.DirectoryServices.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Drawing.Common.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Drawing.Design.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Drawing.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.IO.Packaging.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Printing.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Resources.Extensions.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Pkcs.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.ProtectedData.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Cryptography.Xml.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Security.Permissions.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Threading.AccessControl.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Controls.Ribbon.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Extensions.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.Design.Editors.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.Design.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.Primitives.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Forms.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Input.Manipulations.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Windows.Presentation.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/System.Xaml.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationClient.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationClientSideProviders.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationProvider.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/UIAutomationTypes.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/WindowsBase.dll | +| [...]/microsoft.windowsdesktop.app.ref/8.0.1/ref/net8.0/WindowsFormsIntegration.dll | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected index 0d59e0c3fd6a..f87af9b7599d 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected @@ -5,12 +5,12 @@ | Project files on filesystem | 1.0 | | Reachable fallback Nuget feed count | 1.0 | | Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 0.0 | +| Restored .NET framework variants | 1.0 | | Restored projects through solution files | 0.0 | | Solution files on filesystem | 0.0 | | Source files generated | 1.0 | | Source files on filesystem | 3.0 | -| Successfully restored project files | 0.0 | +| Successfully restored project files | 1.0 | | Successfully restored solution files | 0.0 | | Unresolved references | 0.0 | | UseWPF set | 0.0 | From bc61a58000976fb6f551bafccbad632ffa1127c3 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" <mbg@github.com> Date: Mon, 8 Jul 2024 14:05:06 +0100 Subject: [PATCH 44/70] Go: Add integration test for extracting vendored dependencies --- .../go/extract-vendor/build-environment.expected | 5 +++++ .../go/extract-vendor/diagnostics.expected | 14 ++++++++++++++ .../extract-vendor/force_sequential_test_execution | 2 ++ .../all-platforms/go/extract-vendor/src/go.mod | 5 +++++ .../all-platforms/go/extract-vendor/src/go.sum | 1 + .../all-platforms/go/extract-vendor/src/test.go | 11 +++++++++++ .../src/vendor/example.com/test/add.go | 5 +++++ .../go/extract-vendor/src/vendor/modules.txt | 3 +++ .../all-platforms/go/extract-vendor/test.expected | 5 +++++ .../all-platforms/go/extract-vendor/test.py | 4 ++++ .../all-platforms/go/extract-vendor/test.ql | 8 ++++++++ 11 files changed, 63 insertions(+) create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/build-environment.expected create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/diagnostics.expected create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/force_sequential_test_execution create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/src/go.mod create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/src/go.sum create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/src/test.go create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/src/vendor/example.com/test/add.go create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/src/vendor/modules.txt create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/test.expected create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/test.py create mode 100644 go/ql/integration-tests/all-platforms/go/extract-vendor/test.ql diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/build-environment.expected b/go/ql/integration-tests/all-platforms/go/extract-vendor/build-environment.expected new file mode 100644 index 000000000000..0b225ce00857 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/build-environment.expected @@ -0,0 +1,5 @@ +{ + "configuration" : { + "go" : { } + } +} diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/diagnostics.expected b/go/ql/integration-tests/all-platforms/go/extract-vendor/diagnostics.expected new file mode 100644 index 000000000000..56d774b7037c --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/diagnostics.expected @@ -0,0 +1,14 @@ +{ + "markdownMessage": "A single `go.mod` file was found.\n\n`go.mod`", + "severity": "note", + "source": { + "extractorName": "go", + "id": "go/autobuilder/single-root-go-mod-found", + "name": "A single `go.mod` file was found in the root" + }, + "visibility": { + "cliSummaryTable": false, + "statusPage": false, + "telemetry": true + } +} diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/force_sequential_test_execution b/go/ql/integration-tests/all-platforms/go/extract-vendor/force_sequential_test_execution new file mode 100644 index 000000000000..47ca99290999 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/force_sequential_test_execution @@ -0,0 +1,2 @@ +# go get has been observed to sometimes fail when multiple tests try to simultaneously fetch the same package. +goget diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/src/go.mod b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/go.mod new file mode 100644 index 000000000000..bfb907e7b813 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/go.mod @@ -0,0 +1,5 @@ +go 1.14 + +require example.com/test v0.1.0 + +module test diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/src/go.sum b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/go.sum new file mode 100644 index 000000000000..77b7c845ca63 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/go.sum @@ -0,0 +1 @@ +example.com/test v0.1.0/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/src/test.go b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/test.go new file mode 100644 index 000000000000..1939e3478d48 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/test.go @@ -0,0 +1,11 @@ +package test + +import ( + subdir "example.com/test" +) + +func Test() { + + foo := subdir.Add(2, 2) + println(foo) +} diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/src/vendor/example.com/test/add.go b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/vendor/example.com/test/add.go new file mode 100644 index 000000000000..b1ce6a2a3a39 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/vendor/example.com/test/add.go @@ -0,0 +1,5 @@ +package test + +func Add(a, b int) int { + return a + b +} diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/src/vendor/modules.txt b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/vendor/modules.txt new file mode 100644 index 000000000000..023bcb386e2d --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/src/vendor/modules.txt @@ -0,0 +1,3 @@ +# example.com/test v0.1.0 +## explicit; go 1.14 +example.com/test diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/test.expected b/go/ql/integration-tests/all-platforms/go/extract-vendor/test.expected new file mode 100644 index 000000000000..d03518bd540f --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/test.expected @@ -0,0 +1,5 @@ +extractedFiles +| src/go.mod:0:0:0:0 | src/go.mod | +| src/test.go:0:0:0:0 | src/test.go | +| src/vendor/example.com/test/add.go:0:0:0:0 | src/vendor/example.com/test/add.go | +#select diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/test.py b/go/ql/integration-tests/all-platforms/go/extract-vendor/test.py new file mode 100644 index 000000000000..2bd482201b8b --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/test.py @@ -0,0 +1,4 @@ +from go_integration_test import * + +os.environ['CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS'] = "true" +go_integration_test() diff --git a/go/ql/integration-tests/all-platforms/go/extract-vendor/test.ql b/go/ql/integration-tests/all-platforms/go/extract-vendor/test.ql new file mode 100644 index 000000000000..459a43015602 --- /dev/null +++ b/go/ql/integration-tests/all-platforms/go/extract-vendor/test.ql @@ -0,0 +1,8 @@ +import go +import semmle.go.DiagnosticsReporting + +query predicate extractedFiles(File f) { any() } + +from string msg, int sev +where reportableDiagnostics(_, msg, sev) +select msg, sev From 7ca57e114f0d132c08ffe7369486d094ddf22454 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" <mbg@github.com> Date: Mon, 8 Jul 2024 14:08:19 +0100 Subject: [PATCH 45/70] Go: Add `CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS` env var If set to `true`, this allows `vendor` directories to be extracted --- go/extractor/extractor.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go index 090bd486c3a7..df3a43f80cfa 100644 --- a/go/extractor/extractor.go +++ b/go/extractor/extractor.go @@ -193,10 +193,20 @@ func ExtractWithFlags(buildFlags []string, patterns []string) error { log.Println("Starting to extract packages.") sep := regexp.QuoteMeta(string(filepath.Separator)) - // if a path matches this regexp, we don't want to extract this package. Currently, it checks - // - that the path does not contain a `..` segment, and - // - the path does not contain a `vendor` directory. - noExtractRe := regexp.MustCompile(`.*(^|` + sep + `)(\.\.|vendor)($|` + sep + `).*`) + + // Construct a list of directory segments to exclude from extraction, starting with ".." + excludedDirs := []string{`\.\.`} + + // If CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS is "true", we extract `vendor` directories; + // otherwise (the default) is to exclude them from extraction + includeVendor := os.Getenv("CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS") == "true" + if !includeVendor { + excludedDirs = append(excludedDirs, "vendor") + } + + // If a path matches this regexp, we don't extract this package. It checks whether the path + // contains one of the `excludedDirs`. + noExtractRe := regexp.MustCompile(`.*(^|` + sep + `)(` + strings.Join(excludedDirs, "|") + `)($|` + sep + `).*`) // extract AST information for all packages packages.Visit(pkgs, nil, func(pkg *packages.Package) { From d41eae6fc30c8b87356617dc9c26c5a5b071a892 Mon Sep 17 00:00:00 2001 From: Tom Hvitved <hvitved@github.com> Date: Wed, 3 Jul 2024 11:35:24 +0200 Subject: [PATCH 46/70] SSA: Add data-flow integration layer --- shared/ssa/codeql/ssa/Ssa.qll | 476 ++++++++++++++++++++++++++++++++++ 1 file changed, 476 insertions(+) diff --git a/shared/ssa/codeql/ssa/Ssa.qll b/shared/ssa/codeql/ssa/Ssa.qll index 4e61d61efa71..5b2fd0f5e85c 100644 --- a/shared/ssa/codeql/ssa/Ssa.qll +++ b/shared/ssa/codeql/ssa/Ssa.qll @@ -1163,4 +1163,480 @@ module Make<LocationSig Location, InputSig<Location> Input> { ) } } + + /** Provides the input to `DataFlowIntegration`. */ + signature module DataFlowIntegrationInputSig { + /** + * An expression with a value. That is, we expect these expressions to be + * represented in the data flow graph. + */ + class Expr { + /** Gets a textual representation of this expression. */ + string toString(); + + /** Holds if the `i`th node of basic block `bb` evaluates this expression. */ + predicate hasCfgNode(BasicBlock bb, int i); + } + + /** Holds if SSA definition `def` assigns `value` to the underlying variable. */ + predicate ssaDefAssigns(WriteDefinition def, Expr value); + + /** A parameter. */ + class Parameter { + /** Gets a textual representation of this parameter. */ + string toString(); + + /** Gets the location of this parameter. */ + Location getLocation(); + } + + /** Holds if SSA definition `def` initializes parameter `p` at function entry. */ + predicate ssaDefInitializesParam(WriteDefinition def, Parameter p); + + /** + * Holds if flow should be allowed into uncertain SSA definition `def` from + * previous definitions or reads. + */ + default predicate allowFlowIntoUncertainDef(UncertainWriteDefinition def) { none() } + + /** A (potential) guard. */ + class Guard { + /** Gets a textual representation of this guard. */ + string toString(); + + /** Holds if the `i`th node of basic block `bb` evaluates this guard. */ + predicate hasCfgNode(BasicBlock bb, int i); + } + + /** Holds if `guard` controls block `bb` upon evaluating to `branch`. */ + predicate guardControlsBlock(Guard guard, BasicBlock bb, boolean branch); + + /** Gets an immediate conditional successor of basic block `bb`, if any. */ + BasicBlock getAConditionalBasicBlockSuccessor(BasicBlock bb, boolean branch); + } + + /** + * Constructs the type `Node` and associated value step relations, which are + * intended to be included in the `DataFlow::Node` type and local step relations. + * + * Additionally, this module also provides a barrier guards implementation. + */ + module DataFlowIntegration<DataFlowIntegrationInputSig DfInput> { + private import codeql.util.Boolean + + pragma[nomagic] + private DfInput::Expr getARead(Definition def) { + exists(SourceVariable v, BasicBlock bb, int i | + ssaDefReachesRead(v, def, bb, i) and + variableRead(bb, i, v, true) and + result.hasCfgNode(bb, i) + ) + } + + pragma[nomagic] + private predicate adjacentDefReachesReadExt( + DefinitionExt def, SourceVariable v, BasicBlock bb1, int i1, BasicBlock bb2, int i2 + ) { + adjacentDefReadExt(def, v, bb1, i1, bb2, i2) and + ( + def.definesAt(v, bb1, i1, _) + or + variableRead(bb1, i1, v, true) + ) + or + exists(BasicBlock bb3, int i3 | + adjacentDefReachesReadExt(def, v, bb1, i1, bb3, i3) and + variableRead(bb3, i3, v, false) and + adjacentDefReadExt(def, v, bb3, i3, bb2, i2) + ) + } + + pragma[nomagic] + private predicate adjacentDefReachesUncertainReadExt( + DefinitionExt def, SourceVariable v, BasicBlock bb1, int i1, BasicBlock bb2, int i2 + ) { + adjacentDefReachesReadExt(def, v, bb1, i1, bb2, i2) and + variableRead(bb2, i2, v, false) + } + + /** + * Holds if the reference to `def` at index `i` in basic block `bb` can reach + * another definition `next` of the same underlying source variable, without + * passing through another write or non-pseudo read. + * + * The reference is either a read of `def` or `def` itself. + */ + pragma[nomagic] + private predicate lastRefBeforeRedefExt( + DefinitionExt def, SourceVariable v, BasicBlock bb, int i, BasicBlock input, + DefinitionExt next + ) { + lastRefRedefExt(def, v, bb, i, input, next) and + not variableRead(bb, i, v, false) + or + exists(BasicBlock bb0, int i0 | + lastRefRedefExt(def, v, bb0, i0, input, next) and + adjacentDefReachesUncertainReadExt(def, v, bb, i, bb0, i0) + ) + } + + /** Same as `adjacentDefReadExt`, but skips uncertain reads. */ + pragma[nomagic] + private predicate adjacentDefSkipUncertainReadsExt( + DefinitionExt def, SourceVariable v, BasicBlock bb1, int i1, BasicBlock bb2, int i2 + ) { + adjacentDefReachesReadExt(def, v, bb1, i1, bb2, i2) and + variableRead(bb2, i2, v, true) + } + + pragma[nomagic] + private predicate adjacentReadPairExt(DefinitionExt def, ReadNode read1, ReadNode read2) { + exists(SourceVariable v, BasicBlock bb1, int i1, BasicBlock bb2, int i2 | + read1.readsAt(bb1, i1, v) and + adjacentDefSkipUncertainReadsExt(def, v, bb1, i1, bb2, i2) and + read2.readsAt(bb2, i2, v) + ) + } + + final private class DefinitionExtFinal = DefinitionExt; + + /** An SSA definition into which another SSA definition may flow. */ + private class SsaInputDefinitionExt extends DefinitionExtFinal { + SsaInputDefinitionExt() { + this instanceof PhiNode + or + this instanceof PhiReadNode + or + DfInput::allowFlowIntoUncertainDef(this) + } + + /** Holds if `def` may flow into this definition via basic block `input`. */ + predicate hasInputFromBlock( + DefinitionExt def, SourceVariable v, BasicBlock bb, int i, BasicBlock input + ) { + lastRefBeforeRedefExt(def, v, bb, i, input, this) + } + } + + cached + private newtype TNode = + TParamNode(DfInput::Parameter p) { DfInput::ssaDefInitializesParam(_, p) } or + TExprNode(DfInput::Expr e, Boolean isPost) { + e = getARead(_) + or + DfInput::ssaDefAssigns(_, e) and + isPost = false + } or + TSsaDefinitionNode(DefinitionExt def) or + TSsaInputNode(SsaInputDefinitionExt def, BasicBlock input) { + def.hasInputFromBlock(_, _, _, _, input) + } + + /** + * A data flow node that we need to reference in the value step relation. + * + * Note that only the `SsaNode` subclass is expected to be added as additional + * nodes in `DataFlow::Node`. The other subclasses are expected to already be + * present and are included here in order to reference them in the step relation. + */ + abstract private class NodeImpl extends TNode { + /** Gets the location of this node. */ + abstract Location getLocation(); + + /** Gets a textual representation of this node. */ + abstract string toString(); + } + + final class Node = NodeImpl; + + /** A parameter node. */ + private class ParameterNodeImpl extends NodeImpl, TParamNode { + private DfInput::Parameter p; + + ParameterNodeImpl() { this = TParamNode(p) } + + /** Gets the underlying parameter. */ + DfInput::Parameter getParameter() { result = p } + + override string toString() { result = p.toString() } + + override Location getLocation() { result = p.getLocation() } + } + + final class ParameterNode = ParameterNodeImpl; + + /** A (post-update) expression node. */ + abstract private class ExprNodePreOrPostImpl extends NodeImpl, TExprNode { + DfInput::Expr e; + boolean isPost; + + ExprNodePreOrPostImpl() { this = TExprNode(e, isPost) } + + /** Gets the underlying expression. */ + DfInput::Expr getExpr() { result = e } + + override Location getLocation() { + exists(BasicBlock bb, int i | + e.hasCfgNode(bb, i) and + result = bb.getNode(i).getLocation() + ) + } + } + + final class ExprNodePreOrPost = ExprNodePreOrPostImpl; + + /** An expression node. */ + private class ExprNodeImpl extends ExprNodePreOrPostImpl { + ExprNodeImpl() { isPost = false } + + override string toString() { result = e.toString() } + } + + final class ExprNode = ExprNodeImpl; + + /** A post-update expression node. */ + private class ExprPostUpdateNodeImpl extends ExprNodePreOrPostImpl { + ExprPostUpdateNodeImpl() { isPost = true } + + /** Gets the pre-update expression node. */ + ExprNode getPreUpdateNode() { result = TExprNode(e, false) } + + override string toString() { result = e.toString() + " [postupdate]" } + } + + final class ExprPostUpdateNode = ExprPostUpdateNodeImpl; + + private class ReadNodeImpl extends ExprNodeImpl { + private BasicBlock bb_; + private int i_; + private SourceVariable v_; + + ReadNodeImpl() { + variableRead(bb_, i_, v_, true) and + this.getExpr().hasCfgNode(bb_, i_) + } + + SourceVariable getVariable() { result = v_ } + + pragma[nomagic] + predicate readsAt(BasicBlock bb, int i, SourceVariable v) { + bb = bb_ and + i = i_ and + v = v_ + } + } + + final private class ReadNode = ReadNodeImpl; + + /** A synthesized SSA data flow node. */ + abstract private class SsaNodeImpl extends NodeImpl { + /** Gets the underlying SSA definition. */ + abstract DefinitionExt getDefinitionExt(); + } + + final class SsaNode = SsaNodeImpl; + + /** An SSA definition, viewed as a node in a data flow graph. */ + private class SsaDefinitionExtNodeImpl extends SsaNodeImpl, TSsaDefinitionNode { + private DefinitionExt def; + + SsaDefinitionExtNodeImpl() { this = TSsaDefinitionNode(def) } + + override DefinitionExt getDefinitionExt() { result = def } + + override Location getLocation() { result = def.getLocation() } + + override string toString() { result = def.toString() } + } + + final class SsaDefinitionExtNode = SsaDefinitionExtNodeImpl; + + /** + * A node that represents an input to an SSA phi (read) definition. + * + * This allows for barrier guards to filter input to phi nodes. For example, in + * + * ```rb + * x = taint + * if x != "safe" then + * x = "safe" + * end + * sink x + * ``` + * + * the `false` edge out of `x != "safe"` guards the input from `x = taint` into the + * `phi` node after the condition. + * + * It is also relevant to filter input into phi read nodes: + * + * ```rb + * x = taint + * if b then + * if x != "safe1" then + * return + * end + * else + * if x != "safe2" then + * return + * end + * end + * + * sink x + * ``` + * + * both inputs into the phi read node after the outer condition are guarded. + */ + private class SsaInputNodeImpl extends SsaNodeImpl, TSsaInputNode { + private SsaInputDefinitionExt def_; + private BasicBlock input_; + + SsaInputNodeImpl() { this = TSsaInputNode(def_, input_) } + + /** Holds if this node represents input into SSA definition `def` via basic block `input`. */ + predicate isInputInto(DefinitionExt def, BasicBlock input) { + def = def_ and + input = input_ + } + + override SsaInputDefinitionExt getDefinitionExt() { result = def_ } + + override Location getLocation() { result = input_.getNode(input_.length() - 1).getLocation() } + + override string toString() { result = "[input] " + def_.toString() } + } + + final class SsaInputNode = SsaInputNodeImpl; + + /** + * Holds if `nodeFrom` is a node for SSA definition `def`, which can input + * node `nodeTo`. + */ + pragma[nomagic] + private predicate inputFromDef( + DefinitionExt def, SsaDefinitionExtNode nodeFrom, SsaInputNode nodeTo + ) { + exists(SourceVariable v, BasicBlock bb, int i, BasicBlock input, SsaInputDefinitionExt next | + next.hasInputFromBlock(def, v, bb, i, input) and + def = nodeFrom.getDefinitionExt() and + def.definesAt(v, bb, i, _) and + nodeTo = TSsaInputNode(next, input) + ) + } + + /** + * Holds if `nodeFrom` is a last read of SSA definition `def`, which + * can reach input node `nodeTo`. + */ + pragma[nomagic] + private predicate inputFromRead(DefinitionExt def, ReadNode nodeFrom, SsaInputNode nodeTo) { + exists(SourceVariable v, BasicBlock bb, int i, BasicBlock input, SsaInputDefinitionExt next | + next.hasInputFromBlock(def, v, bb, i, input) and + nodeFrom.readsAt(bb, i, v) and + nodeTo = TSsaInputNode(next, input) + ) + } + + pragma[nomagic] + private predicate firstReadExt(DefinitionExt def, ReadNode read) { + exists(SourceVariable v, BasicBlock bb1, int i1, BasicBlock bb2, int i2 | + def.definesAt(v, bb1, i1, _) and + adjacentDefSkipUncertainReadsExt(def, v, bb1, i1, bb2, i2) and + read.readsAt(bb2, i2, v) + ) + } + + /** Holds if there is a local flow step from `nodeFrom` to `nodeTo`. */ + predicate localFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) { + ( + // Flow from assignment into SSA definition + DfInput::ssaDefAssigns(def, nodeFrom.(ExprNode).getExpr()) + or + // Flow from parameter into entry definition + DfInput::ssaDefInitializesParam(def, nodeFrom.(ParameterNode).getParameter()) + ) and + nodeTo.(SsaDefinitionExtNode).getDefinitionExt() = def and + isUseStep = false + or + // Flow from SSA definition to first read + def = nodeFrom.(SsaDefinitionExtNode).getDefinitionExt() and + firstReadExt(def, nodeTo) and + isUseStep = false + or + // Flow from (post-update) read to next read + adjacentReadPairExt(def, [nodeFrom, nodeFrom.(ExprPostUpdateNode).getPreUpdateNode()], nodeTo) and + nodeFrom != nodeTo and + isUseStep = true + or + // Flow into phi (read) SSA definition node from def + inputFromDef(def, nodeFrom, nodeTo) and + isUseStep = false + or + // Flow into phi (read) SSA definition node from (post-update) read + inputFromRead(def, [nodeFrom, nodeFrom.(ExprPostUpdateNode).getPreUpdateNode()], nodeTo) and + isUseStep = true + or + // Flow from input node to def + nodeTo.(SsaDefinitionExtNode).getDefinitionExt() = def and + def = nodeFrom.(SsaInputNode).getDefinitionExt() and + isUseStep = false + } + + /** Holds if the value of `nodeTo` is given by `nodeFrom`. */ + predicate localMustFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo) { + ( + // Flow from assignment into SSA definition + DfInput::ssaDefAssigns(def, nodeFrom.(ExprNode).getExpr()) + or + // Flow from parameter into entry definition + DfInput::ssaDefInitializesParam(def, nodeFrom.(ParameterNode).getParameter()) + ) and + nodeTo.(SsaDefinitionExtNode).getDefinitionExt() = def + or + // Flow from SSA definition to read + nodeFrom.(SsaDefinitionExtNode).getDefinitionExt() = def and + nodeTo.(ExprNode).getExpr() = getARead(def) + } + + pragma[nomagic] + private predicate guardControlsSsaRead( + DfInput::Guard g, boolean branch, Definition def, ExprNode n + ) { + exists(BasicBlock bb, DfInput::Expr e | + e = n.getExpr() and + getARead(def) = e and + DfInput::guardControlsBlock(g, bb, branch) and + e.hasCfgNode(bb, _) + ) + } + + pragma[nomagic] + private predicate guardControlsPhiInput( + DfInput::Guard g, boolean branch, Definition def, BasicBlock input, SsaInputDefinitionExt phi + ) { + phi.hasInputFromBlock(def, _, _, _, input) and + ( + DfInput::guardControlsBlock(g, input, branch) + or + exists(int last | + last = input.length() - 1 and + g.hasCfgNode(input, last) and + DfInput::getAConditionalBasicBlockSuccessor(input, branch) = phi.getBasicBlock() + ) + ) + } + + /** + * Gets a node that reads SSA defininition `def`, and which is guarded by + * `g` evaluating to `branch`. + */ + pragma[nomagic] + Node getABarrierNode(DfInput::Guard g, Definition def, boolean branch) { + guardControlsSsaRead(g, branch, def, result) + or + exists(BasicBlock input, SsaInputDefinitionExt phi | + guardControlsPhiInput(g, branch, def, input, phi) and + result.(SsaInputNode).isInputInto(phi, input) + ) + } + } } From 7928d751d100eea085c249ace01b13f803f8d458 Mon Sep 17 00:00:00 2001 From: Tom Hvitved <hvitved@github.com> Date: Wed, 10 Jul 2024 09:52:09 +0200 Subject: [PATCH 47/70] Address review comment --- shared/ssa/codeql/ssa/Ssa.qll | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/shared/ssa/codeql/ssa/Ssa.qll b/shared/ssa/codeql/ssa/Ssa.qll index 5b2fd0f5e85c..476309afba6e 100644 --- a/shared/ssa/codeql/ssa/Ssa.qll +++ b/shared/ssa/codeql/ssa/Ssa.qll @@ -1178,6 +1178,19 @@ module Make<LocationSig Location, InputSig<Location> Input> { predicate hasCfgNode(BasicBlock bb, int i); } + /** + * Gets a read of SSA defintion `def`. + * + * Override this with a cached version when applicable. + */ + default Expr getARead(Definition def) { + exists(SourceVariable v, BasicBlock bb, int i | + ssaDefReachesRead(v, def, bb, i) and + variableRead(bb, i, v, true) and + result.hasCfgNode(bb, i) + ) + } + /** Holds if SSA definition `def` assigns `value` to the underlying variable. */ predicate ssaDefAssigns(WriteDefinition def, Expr value); @@ -1224,15 +1237,6 @@ module Make<LocationSig Location, InputSig<Location> Input> { module DataFlowIntegration<DataFlowIntegrationInputSig DfInput> { private import codeql.util.Boolean - pragma[nomagic] - private DfInput::Expr getARead(Definition def) { - exists(SourceVariable v, BasicBlock bb, int i | - ssaDefReachesRead(v, def, bb, i) and - variableRead(bb, i, v, true) and - result.hasCfgNode(bb, i) - ) - } - pragma[nomagic] private predicate adjacentDefReachesReadExt( DefinitionExt def, SourceVariable v, BasicBlock bb1, int i1, BasicBlock bb2, int i2 @@ -1322,7 +1326,7 @@ module Make<LocationSig Location, InputSig<Location> Input> { private newtype TNode = TParamNode(DfInput::Parameter p) { DfInput::ssaDefInitializesParam(_, p) } or TExprNode(DfInput::Expr e, Boolean isPost) { - e = getARead(_) + e = DfInput::getARead(_) or DfInput::ssaDefAssigns(_, e) and isPost = false @@ -1545,7 +1549,12 @@ module Make<LocationSig Location, InputSig<Location> Input> { ) } - /** Holds if there is a local flow step from `nodeFrom` to `nodeTo`. */ + /** + * Holds if there is a local flow step from `nodeFrom` to `nodeTo`. + * + * `isUseStep` is `true` when `nodeFrom` is a (post-update) read node and + * `nodeTo` is a read node or phi (read) node. + */ predicate localFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) { ( // Flow from assignment into SSA definition @@ -1594,7 +1603,7 @@ module Make<LocationSig Location, InputSig<Location> Input> { or // Flow from SSA definition to read nodeFrom.(SsaDefinitionExtNode).getDefinitionExt() = def and - nodeTo.(ExprNode).getExpr() = getARead(def) + nodeTo.(ExprNode).getExpr() = DfInput::getARead(def) } pragma[nomagic] @@ -1603,7 +1612,7 @@ module Make<LocationSig Location, InputSig<Location> Input> { ) { exists(BasicBlock bb, DfInput::Expr e | e = n.getExpr() and - getARead(def) = e and + DfInput::getARead(def) = e and DfInput::guardControlsBlock(g, bb, branch) and e.hasCfgNode(bb, _) ) From ccf56a21c2c823d4ee81b4a90372a3a1f6d5bf09 Mon Sep 17 00:00:00 2001 From: Tamas Vajk <tamasvajk@github.com> Date: Wed, 10 Jul 2024 10:53:53 +0200 Subject: [PATCH 48/70] C#: Order files in buildless extraction --- .../FileProvider.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs index e908855df0a9..b6463ea24caa 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs @@ -62,7 +62,7 @@ private string[] SelectTextFileNamesByExtension(string filetype, params string[] private string[] SelectTextFileNamesByName(string name) { var ret = allNonBinary.Value.SelectFileNamesByName(name).ToArray(); - var ending = ret.Length == 0 ? "." : $": {string.Join(", ", ret.OrderBy(s => s))}."; + var ending = ret.Length == 0 ? "." : $": {string.Join(", ", ret)}."; logger.LogInfo($"Found {ret.Length} {name} files in {SourceDir}{ending}"); return ret; } @@ -91,7 +91,9 @@ private IEnumerable<FileInfo> SelectSmallFiles(IEnumerable<FileInfo> files) private FileInfo[] GetAllFiles() { logger.LogInfo($"Finding files in {SourceDir}..."); - var files = SourceDir.GetFiles("*.*", new EnumerationOptions { RecurseSubdirectories = true }); + var files = SourceDir + .GetFiles("*.*", new EnumerationOptions { RecurseSubdirectories = true }) + .OrderBy(f => f.FullName); var filteredFiles = files.Where(f => { From 8979bac4d8f6f9f11f9e9cb49a6eaf3240369def Mon Sep 17 00:00:00 2001 From: Tom Hvitved <hvitved@github.com> Date: Wed, 10 Jul 2024 10:55:13 +0200 Subject: [PATCH 49/70] Update shared/ssa/codeql/ssa/Ssa.qll Co-authored-by: Mathias Vorreiter Pedersen <mathiasvp@github.com> --- shared/ssa/codeql/ssa/Ssa.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/ssa/codeql/ssa/Ssa.qll b/shared/ssa/codeql/ssa/Ssa.qll index 476309afba6e..3e96636010d3 100644 --- a/shared/ssa/codeql/ssa/Ssa.qll +++ b/shared/ssa/codeql/ssa/Ssa.qll @@ -1179,7 +1179,7 @@ module Make<LocationSig Location, InputSig<Location> Input> { } /** - * Gets a read of SSA defintion `def`. + * Gets a read of SSA definition `def`. * * Override this with a cached version when applicable. */ From 39b5dbfaf798d4b588b0930fb59d4a827cc9461c Mon Sep 17 00:00:00 2001 From: Tom Hvitved <hvitved@github.com> Date: Wed, 10 Jul 2024 13:13:21 +0200 Subject: [PATCH 50/70] C#: Perform fewer `regexpCapture`s when matching version numbers --- csharp/ql/lib/semmle/code/csharp/Location.qll | 76 ++++++++++++++++--- .../csharp/security/xml/InsecureXMLQuery.qll | 28 ++++--- 2 files changed, 82 insertions(+), 22 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/Location.qll b/csharp/ql/lib/semmle/code/csharp/Location.qll index eb6a30e7d35d..9b2cea470ed7 100644 --- a/csharp/ql/lib/semmle/code/csharp/Location.qll +++ b/csharp/ql/lib/semmle/code/csharp/Location.qll @@ -110,12 +110,21 @@ class SourceLocation extends Location, @location_default { bindingset[version] private int versionField(string version, int field) { - exists(string format | - format = "(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)" or - format = "(\\d+)\\.(\\d+)\\.(\\d+)" or - format = "(\\d+)\\.(\\d+)" + exists(string format, int i | + format = "(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)|" + "(\\d+)\\.(\\d+)\\.(\\d+)|" + "(\\d+)\\.(\\d+)" and + result = version.regexpCapture(format, i).toInt() | - result = version.regexpCapture(format, field).toInt() + i = [1, 5, 8] and + field = 1 + or + i = [2, 6, 9] and + field = 2 + or + i = [3, 7] and + field = 3 + or + i = 4 and + field = 4 ) and result >= 0 and result <= 255 @@ -123,8 +132,19 @@ private int versionField(string version, int field) { /** An assembly version, for example `4.0.0.0` or `4.5`. */ class Version extends string { + private int major; + bindingset[this] - Version() { exists(versionField(this, 1)) } + Version() { major = versionField(this, 1) } + + bindingset[this] + private int getVersionField(int field) { + field = 1 and + result = major + or + field in [2 .. 4] and + result = versionField(this, field) + } /** * Gets field `field` of this version. @@ -132,13 +152,47 @@ class Version extends string { */ bindingset[this] int getField(int field) { - field in [1 .. 4] and - if exists(versionField(this, field)) then result = versionField(this, field) else result = 0 + result = this.getVersionField(field) + or + field in [2 .. 4] and + not exists(this.getVersionField(field)) and + result = 0 + } + + bindingset[this] + private string getCanonicalizedField(int field) { + exists(string s, int length | + s = this.getVersionField(field).toString() and + length = s.length() + | + // make each field consist of 3 digits + result = concat(int i | i in [1 .. 3 - length] | "0") + s + ) + } + + /** + * Gets a canonicalized version of this string, where lexicographical ordering + * corresponds to version ordering. + */ + bindingset[this] + string getCanonicalizedVersion() { + exists(string res, int length | + res = + strictconcat(int field, string s | + s = this.getCanonicalizedField(field) + | + s, "." order by field + ) and + length = res.length() + | + // make each canonicalized version consist of 4 chunks of 3 digits separated by a dot + result = res + concat(int i | i = [1 .. 15 - length] / 4 and i > 0 | ".000") + ) } /** Gets the major version, for example `1` in `1.2.3.4`. */ bindingset[this] - int getMajor() { result = this.getField(1) } + int getMajor() { result = major } /** Gets the major revision, for example `2` in `1.2.3.4`. */ bindingset[this] @@ -164,9 +218,7 @@ class Version extends string { */ bindingset[this, other] predicate isEarlierThan(Version other) { - exists(int i | this.getField(i) < other.getField(i) | - forall(int j | j in [1 .. i - 1] | this.getField(j) = other.getField(j)) - ) + this.getCanonicalizedVersion() < other.getCanonicalizedVersion() } /** diff --git a/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll index 25793a8a71cc..ba98888fa6fc 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll @@ -5,6 +5,19 @@ import csharp private import semmle.code.csharp.commons.TargetFramework +pragma[nomagic] +private float getAssemblyVersion(Assembly a) { + result = a.getVersion().regexpCapture("([0-9]+\\.[0-9]+).*", 1).toFloat() and + // This method is only accurate when we're looking at versions before 4.0. + result < 4.0 +} + +pragma[nomagic] +private Version getTargetFrameworkVersion(TargetFrameworkAttribute tfa) { + tfa.isNetFramework() and + result = tfa.getFrameworkVersion() +} + /** * Holds if the type `t` is in an assembly that has been compiled against a .NET framework version * before the given version. @@ -14,21 +27,16 @@ private predicate isNetFrameworkBefore(Type t, string version) { // For assemblies compiled against framework versions before 4 the TargetFrameworkAttribute // will not be present. In this case, we can revert back to the assembly version, which may not // contain full minor version information. - exists(string assemblyVersion | - assemblyVersion = - t.getALocation().(Assembly).getVersion().regexpCapture("([0-9]+\\.[0-9]+).*", 1) - | - assemblyVersion.toFloat() < version.toFloat() and - // This method is only accurate when we're looking at versions before 4.0. - assemblyVersion.toFloat() < 4.0 + exists(float assemblyVersion | + assemblyVersion = getAssemblyVersion(t.getALocation()) and + assemblyVersion < version.toFloat() ) or // For 4.0 and above the TargetFrameworkAttribute should be present to provide detailed version // information. exists(TargetFrameworkAttribute tfa | tfa.hasElement(t) and - tfa.isNetFramework() and - tfa.getFrameworkVersion().isEarlierThan(version) + getTargetFrameworkVersion(tfa).isEarlierThan(version) ) } @@ -173,7 +181,7 @@ module XmlReader { reason = "DTD processing is enabled by default in versions < 4.0" and evidence = this and not exists(this.getSettings()) and - isNetFrameworkBefore(this.(MethodCall).getTarget().getDeclaringType(), "4.0") + isNetFrameworkBefore(this.getTarget().getDeclaringType(), "4.0") or // bad settings flow here exists(ObjectCreation settings | From 4193b7e591c3329f6d76b2512c4b25682c6a9dbc Mon Sep 17 00:00:00 2001 From: Michael Nebel <michaelnebel@github.com> Date: Wed, 3 Jul 2024 14:11:28 +0100 Subject: [PATCH 51/70] Allow grouping import paths for models-as-data --- go/ql/lib/ext/empty.model.yml | 4 + go/ql/lib/semmle/go/dataflow/ExternalFlow.qll | 78 ++++++++++++++++++- .../internal/ExternalFlowExtensions.qll | 5 ++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/go/ql/lib/ext/empty.model.yml b/go/ql/lib/ext/empty.model.yml index 867714a30443..8d661a9f1db6 100644 --- a/go/ql/lib/ext/empty.model.yml +++ b/go/ql/lib/ext/empty.model.yml @@ -17,3 +17,7 @@ extensions: pack: codeql/go-all extensible: neutralModel data: [] + - addsTo: + pack: codeql/go-all + extensible: packageGrouping + data: [] diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll index 583f96661a49..8ebc21ab6db9 100644 --- a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -78,7 +78,7 @@ */ private import go -import internal.ExternalFlowExtensions +import internal.ExternalFlowExtensions as FlowExtensions private import FlowSummary as FlowSummary private import internal.DataFlowPrivate private import internal.FlowSummaryImpl @@ -87,6 +87,82 @@ private import internal.FlowSummaryImpl::Private private import internal.FlowSummaryImpl::Private::External private import codeql.mad.ModelValidation as SharedModelVal +/** Gets the prefix for a group of packages. */ +string groupPrefix() { result = "group:" } + +/** Gets a group that `package` is in, according to `packageGrouping`. */ +private string getGroup(string package) { + exists(string group | + FlowExtensions::packageGrouping(group, package) and + result = groupPrefix() + group + ) +} + +/** + * Holds if a source model exists for the given parameters. + * + * Note that we consider all packages in the same group. + */ +predicate sourceModel( + string package, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, QlBuiltins::ExtensionId madId +) { + FlowExtensions::sourceModel(package, type, subtypes, name, signature, ext, output, kind, + provenance, madId) + or + // Also look for models that are defined for a group that `package` is part of. + FlowExtensions::sourceModel(getGroup(package), type, subtypes, name, signature, ext, output, kind, + provenance, madId) +} + +/** + * Holds if a sink model exists for the given parameters. + * + * Note that we consider all packages in the same group. + */ +predicate sinkModel( + string package, string type, boolean subtypes, string name, string signature, string ext, + string input, string kind, string provenance, QlBuiltins::ExtensionId madId +) { + FlowExtensions::sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance, + madId) + or + // Also look for models that are defined for a group that `package` is part of. + FlowExtensions::sinkModel(getGroup(package), type, subtypes, name, signature, ext, input, kind, + provenance, madId) +} + +/** + * Holds if a summary model exists for the given parameters. + * + * Note that we consider all packages in the same group. + */ +predicate summaryModel( + string package, string type, boolean subtypes, string name, string signature, string ext, + string input, string output, string kind, string provenance, QlBuiltins::ExtensionId madId +) { + FlowExtensions::summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, + provenance, madId) + or + // Also look for models that are defined for a group that `package` is part of. + FlowExtensions::summaryModel(getGroup(package), type, subtypes, name, signature, ext, input, + output, kind, provenance, madId) +} + +/** + * Holds if a neutral model exists for the given parameters. + * + * Note that we consider all packages in the same group. + */ +predicate neutralModel( + string package, string type, string name, string signature, string kind, string provenance +) { + FlowExtensions::neutralModel(package, type, name, signature, kind, provenance) + or + // Also look for models that are defined for a group that `package` is part of. + FlowExtensions::neutralModel(getGroup(package), type, name, signature, kind, provenance) +} + /** * Holds if the given extension tuple `madId` should pretty-print as `model`. * diff --git a/go/ql/lib/semmle/go/dataflow/internal/ExternalFlowExtensions.qll b/go/ql/lib/semmle/go/dataflow/internal/ExternalFlowExtensions.qll index 1cc3fe7292ea..b1e1c906028c 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/ExternalFlowExtensions.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/ExternalFlowExtensions.qll @@ -32,3 +32,8 @@ extensible predicate summaryModel( extensible predicate neutralModel( string package, string type, string name, string signature, string kind, string provenance ); + +/** + * Holds if the package `package` is part of the group `group`. + */ +extensible predicate packageGrouping(string group, string package); From fde7d7b969454e73e359bedc992ce8b8b4383fdc Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Tue, 9 Jul 2024 11:07:02 +0100 Subject: [PATCH 52/70] Use `packageGrouping` for Beego models --- ...github.com.astaxie.beego.context.model.yml | 72 ++++++------------- .../ext/github.com.astaxie.beego.model.yml | 59 ++++++--------- .../github.com.astaxie.beego.utils.model.yml | 46 ++++++------ 3 files changed, 63 insertions(+), 114 deletions(-) diff --git a/go/ql/lib/ext/github.com.astaxie.beego.context.model.yml b/go/ql/lib/ext/github.com.astaxie.beego.context.model.yml index 5a41e55b6db4..89f8eeebfba4 100644 --- a/go/ql/lib/ext/github.com.astaxie.beego.context.model.yml +++ b/go/ql/lib/ext/github.com.astaxie.beego.context.model.yml @@ -1,58 +1,32 @@ extensions: + - addsTo: + pack: codeql/go-all + extensible: packageGrouping + data: + - ["beego-context", "github.com/astaxie/beego/context"] + - ["beego-context", "github.com/beego/beego/context"] + - ["beego-context", "github.com/beego/beego/server/web/context"] - addsTo: pack: codeql/go-all extensible: summaryModel data: - - ["github.com/astaxie/beego/context", "", False, "WriteBody", "", "", "Argument[2]", "Argument[1]", "taint", "manual"] - - ["github.com/beego/beego/server/web/context", "", False, "WriteBody", "", "", "Argument[2]", "Argument[1]", "taint", "manual"] + - ["group:beego-context", "", False, "WriteBody", "", "", "Argument[2]", "Argument[1]", "taint", "manual"] - addsTo: pack: codeql/go-all extensible: sourceModel data: - - ["github.com/astaxie/beego/context", "BeegoInput", True, "Bind", "", "", "Argument[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "Cookie", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "Data", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "GetData", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "Header", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "Param", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "Params", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "Query", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "Refer", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "Referer", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "RequestBody", "", "", "", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "URI", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "URL", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "BeegoInput", True, "UserAgent", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego/context", "Context", True, "GetCookie", "", "", "ReturnValue", "remote", "manual"] - - - ["github.com/beego/beego/context", "BeegoInput", True, "Bind", "", "", "Argument[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "Cookie", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "Data", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "GetData", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "Header", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "Param", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "Params", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "Query", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "Refer", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "Referer", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "RequestBody", "", "", "", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "URI", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "URL", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "BeegoInput", True, "UserAgent", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/context", "Context", True, "GetCookie", "", "", "ReturnValue", "remote", "manual"] - - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "Bind", "", "", "Argument[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "Cookie", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "Data", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "GetData", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "Header", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "Param", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "Params", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "Query", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "Refer", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "Referer", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "RequestBody", "", "", "", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "URI", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "URL", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "BeegoInput", True, "UserAgent", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web/context", "Context", True, "GetCookie", "", "", "ReturnValue", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "Bind", "", "", "Argument[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "Cookie", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "Data", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "GetData", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "Header", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "Param", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "Params", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "Query", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "Refer", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "Referer", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "RequestBody", "", "", "", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "URI", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "URL", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "BeegoInput", True, "UserAgent", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego-context", "Context", True, "GetCookie", "", "", "ReturnValue", "remote", "manual"] diff --git a/go/ql/lib/ext/github.com.astaxie.beego.model.yml b/go/ql/lib/ext/github.com.astaxie.beego.model.yml index 27a9c9cb5904..ee14aa224d4f 100644 --- a/go/ql/lib/ext/github.com.astaxie.beego.model.yml +++ b/go/ql/lib/ext/github.com.astaxie.beego.model.yml @@ -1,48 +1,29 @@ extensions: + - addsTo: + pack: codeql/go-all + extensible: packageGrouping + data: + - ["beego", "github.com/astaxie/beego"] + - ["beego", "github.com/beego/beego"] + - ["beego", "github.com/beego/beego/server/web"] - addsTo: pack: codeql/go-all extensible: summaryModel data: - - ["github.com/astaxie/beego", "", False, "HTML2str", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego", "", False, "Htmlquote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego", "", False, "Htmlunquote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego", "", False, "MapGet", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - - ["github.com/astaxie/beego", "", False, "ParseForm", "", "", "Argument[0]", "Argument[1]", "taint", "manual"] - - ["github.com/astaxie/beego", "", False, "Str2html", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego", "", False, "Substr", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego", "", False, "HTML2str", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego", "", False, "Htmlquote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego", "", False, "Htmlunquote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego", "", False, "MapGet", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - - ["github.com/beego/beego", "", False, "ParseForm", "", "", "Argument[0]", "Argument[1]", "taint", "manual"] - - ["github.com/beego/beego", "", False, "Str2html", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego", "", False, "Substr", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/server/web", "", False, "HTML2str", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/server/web", "", False, "Htmlquote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/server/web", "", False, "Htmlunquote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/server/web", "", False, "MapGet", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - - ["github.com/beego/beego/server/web", "", False, "ParseForm", "", "", "Argument[0]", "Argument[1]", "taint", "manual"] - - ["github.com/beego/beego/server/web", "", False, "Str2html", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/server/web", "", False, "Substr", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego", "", False, "HTML2str", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego", "", False, "Htmlquote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego", "", False, "Htmlunquote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego", "", False, "MapGet", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] + - ["group:beego", "", False, "ParseForm", "", "", "Argument[0]", "Argument[1]", "taint", "manual"] + - ["group:beego", "", False, "Str2html", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego", "", False, "Substr", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/go-all extensible: sourceModel data: - - ["github.com/astaxie/beego", "Controller", True, "ParseForm", "", "", "Argument[0]", "remote", "manual"] - - ["github.com/astaxie/beego", "Controller", True, "GetFile", "", "", "ReturnValue[0..1]", "remote", "manual"] - - ["github.com/astaxie/beego", "Controller", True, "GetFiles", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego", "Controller", True, "GetString", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego", "Controller", True, "GetStrings", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/astaxie/beego", "Controller", True, "Input", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego", "Controller", True, "ParseForm", "", "", "Argument[0]", "remote", "manual"] - - ["github.com/beego/beego", "Controller", True, "GetFile", "", "", "ReturnValue[0..1]", "remote", "manual"] - - ["github.com/beego/beego", "Controller", True, "GetFiles", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego", "Controller", True, "GetString", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego", "Controller", True, "GetStrings", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego", "Controller", True, "Input", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web", "Controller", True, "ParseForm", "", "", "Argument[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web", "Controller", True, "GetFile", "", "", "ReturnValue[0..1]", "remote", "manual"] - - ["github.com/beego/beego/server/web", "Controller", True, "GetFiles", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web", "Controller", True, "GetString", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web", "Controller", True, "GetStrings", "", "", "ReturnValue[0]", "remote", "manual"] - - ["github.com/beego/beego/server/web", "Controller", True, "Input", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego", "Controller", True, "ParseForm", "", "", "Argument[0]", "remote", "manual"] + - ["group:beego", "Controller", True, "GetFile", "", "", "ReturnValue[0..1]", "remote", "manual"] + - ["group:beego", "Controller", True, "GetFiles", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego", "Controller", True, "GetString", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego", "Controller", True, "GetStrings", "", "", "ReturnValue[0]", "remote", "manual"] + - ["group:beego", "Controller", True, "Input", "", "", "ReturnValue[0]", "remote", "manual"] diff --git a/go/ql/lib/ext/github.com.astaxie.beego.utils.model.yml b/go/ql/lib/ext/github.com.astaxie.beego.utils.model.yml index 261c1dab61a9..4eb0688e37e7 100644 --- a/go/ql/lib/ext/github.com.astaxie.beego.utils.model.yml +++ b/go/ql/lib/ext/github.com.astaxie.beego.utils.model.yml @@ -1,31 +1,25 @@ extensions: + - addsTo: + pack: codeql/go-all + extensible: packageGrouping + data: + - ["beego-utils", "github.com/astaxie/beego/utils"] + - ["beego-utils", "github.com/beego/beego/utils"] + - ["beego-utils", "github.com/beego/beego/core/utils"] - addsTo: pack: codeql/go-all extensible: summaryModel data: - - ["github.com/astaxie/beego/utils", "", False, "SliceChunk", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "", False, "SliceDiff", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "", False, "SliceFilter", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "", False, "SliceIntersect", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "", False, "SliceMerge", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "", False, "SlicePad", "", "", "Argument[0..2]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "", False, "SliceRand", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "", False, "SliceReduce", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "", False, "SliceShuffle", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "", False, "SliceUnique", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "BeeMap", True, "Get", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "BeeMap", True, "Items", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - - ["github.com/astaxie/beego/utils", "BeeMap", True, "Set", "", "", "Argument[1]", "Argument[receiver]", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SliceChunk", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SliceDiff", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SliceFilter", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SliceIntersect", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SliceMerge", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SlicePad", "", "", "Argument[0..2]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SliceRand", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SliceReduce", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SliceShuffle", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "", False, "SliceUnique", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "BeeMap", True, "Get", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "BeeMap", True, "Items", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - - ["github.com/beego/beego/core/utils", "BeeMap", True, "Set", "", "", "Argument[1]", "Argument[receiver]", "taint", "manual"] + - ["group:beego-utils", "", False, "SliceChunk", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "", False, "SliceDiff", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "", False, "SliceFilter", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "", False, "SliceIntersect", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "", False, "SliceMerge", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "", False, "SlicePad", "", "", "Argument[0..2]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "", False, "SliceRand", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "", False, "SliceReduce", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "", False, "SliceShuffle", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "", False, "SliceUnique", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "BeeMap", True, "Get", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "BeeMap", True, "Items", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["group:beego-utils", "BeeMap", True, "Set", "", "", "Argument[1]", "Argument[receiver]", "taint", "manual"] From 1e448d547dbd7b793fce778b13e26b26d53e026a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Tue, 9 Jul 2024 16:04:38 +0100 Subject: [PATCH 53/70] Rename Beego MaD files using path from current version --- ...tils.model.yml => github.com.beego.beego.core.utils.model.yml} | 0 ...el.yml => github.com.beego.beego.server.web.context.model.yml} | 0 ...eego.model.yml => github.com.beego.beego.server.web.model.yml} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename go/ql/lib/ext/{github.com.astaxie.beego.utils.model.yml => github.com.beego.beego.core.utils.model.yml} (100%) rename go/ql/lib/ext/{github.com.astaxie.beego.context.model.yml => github.com.beego.beego.server.web.context.model.yml} (100%) rename go/ql/lib/ext/{github.com.astaxie.beego.model.yml => github.com.beego.beego.server.web.model.yml} (100%) diff --git a/go/ql/lib/ext/github.com.astaxie.beego.utils.model.yml b/go/ql/lib/ext/github.com.beego.beego.core.utils.model.yml similarity index 100% rename from go/ql/lib/ext/github.com.astaxie.beego.utils.model.yml rename to go/ql/lib/ext/github.com.beego.beego.core.utils.model.yml diff --git a/go/ql/lib/ext/github.com.astaxie.beego.context.model.yml b/go/ql/lib/ext/github.com.beego.beego.server.web.context.model.yml similarity index 100% rename from go/ql/lib/ext/github.com.astaxie.beego.context.model.yml rename to go/ql/lib/ext/github.com.beego.beego.server.web.context.model.yml diff --git a/go/ql/lib/ext/github.com.astaxie.beego.model.yml b/go/ql/lib/ext/github.com.beego.beego.server.web.model.yml similarity index 100% rename from go/ql/lib/ext/github.com.astaxie.beego.model.yml rename to go/ql/lib/ext/github.com.beego.beego.server.web.model.yml From 01afa360d7ce5db7cdd398af9b6a1a50ca8b728b Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Tue, 9 Jul 2024 16:05:25 +0100 Subject: [PATCH 54/70] Tests: accept model numbering changes --- .../go/frameworks/Beego/ReflectedXss.expected | 146 +++++++++--------- .../go/frameworks/Beego/TaintedPath.expected | 14 +- 2 files changed, 80 insertions(+), 80 deletions(-) diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected index 6845b74b9126..81d770e777ce 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected @@ -1,104 +1,104 @@ edges -| test.go:33:6:33:10 | definition of bound | test.go:35:13:35:30 | type conversion | provenance | Src:MaD:252 | -| test.go:33:6:33:10 | definition of bound | test.go:36:13:36:27 | type conversion | provenance | Src:MaD:252 | -| test.go:33:6:33:10 | definition of bound | test.go:37:13:37:29 | type conversion | provenance | Src:MaD:252 | -| test.go:42:20:42:42 | call to Cookie | test.go:42:13:42:43 | type conversion | provenance | Src:MaD:253 | -| test.go:47:20:47:31 | call to Data | test.go:47:13:47:52 | type conversion | provenance | Src:MaD:254 | -| test.go:52:20:52:43 | call to GetData | test.go:52:13:52:53 | type conversion | provenance | Src:MaD:255 | -| test.go:57:20:57:42 | call to Header | test.go:57:13:57:43 | type conversion | provenance | Src:MaD:256 | -| test.go:62:20:62:41 | call to Param | test.go:62:13:62:42 | type conversion | provenance | Src:MaD:257 | -| test.go:67:20:67:33 | call to Params | test.go:67:13:67:45 | type conversion | provenance | Src:MaD:258 | -| test.go:72:20:72:41 | call to Query | test.go:72:13:72:42 | type conversion | provenance | Src:MaD:259 | -| test.go:77:20:77:32 | call to Refer | test.go:77:13:77:33 | type conversion | provenance | Src:MaD:260 | -| test.go:82:20:82:34 | call to Referer | test.go:82:13:82:35 | type conversion | provenance | Src:MaD:261 | -| test.go:87:20:87:30 | call to URI | test.go:87:13:87:31 | type conversion | provenance | Src:MaD:263 | -| test.go:92:20:92:30 | call to URL | test.go:92:13:92:31 | type conversion | provenance | Src:MaD:264 | -| test.go:97:20:97:36 | call to UserAgent | test.go:97:13:97:37 | type conversion | provenance | Src:MaD:265 | -| test.go:102:14:102:25 | call to Data | test.go:102:14:102:45 | type assertion | provenance | Src:MaD:254 | -| test.go:114:14:114:25 | call to Data | test.go:114:14:114:45 | type assertion | provenance | Src:MaD:254 | -| test.go:126:14:126:25 | call to Data | test.go:126:14:126:45 | type assertion | provenance | Src:MaD:254 | -| test.go:143:23:143:42 | call to Data | test.go:143:23:143:62 | type assertion | provenance | Src:MaD:254 | -| test.go:199:15:199:26 | call to Data | test.go:200:36:200:53 | type assertion | provenance | Src:MaD:254 | -| test.go:199:15:199:26 | call to Data | test.go:201:39:201:56 | type assertion | provenance | Src:MaD:254 | -| test.go:199:15:199:26 | call to Data | test.go:202:28:202:56 | type assertion | provenance | Src:MaD:254 | -| test.go:199:15:199:26 | call to Data | test.go:204:36:204:53 | type assertion | provenance | Src:MaD:254 | -| test.go:199:15:199:26 | call to Data | test.go:205:34:205:51 | type assertion | provenance | Src:MaD:254 | +| test.go:33:6:33:10 | definition of bound | test.go:35:13:35:30 | type conversion | provenance | Src:MaD:254 | +| test.go:33:6:33:10 | definition of bound | test.go:36:13:36:27 | type conversion | provenance | Src:MaD:254 | +| test.go:33:6:33:10 | definition of bound | test.go:37:13:37:29 | type conversion | provenance | Src:MaD:254 | +| test.go:42:20:42:42 | call to Cookie | test.go:42:13:42:43 | type conversion | provenance | Src:MaD:255 | +| test.go:47:20:47:31 | call to Data | test.go:47:13:47:52 | type conversion | provenance | Src:MaD:256 | +| test.go:52:20:52:43 | call to GetData | test.go:52:13:52:53 | type conversion | provenance | Src:MaD:257 | +| test.go:57:20:57:42 | call to Header | test.go:57:13:57:43 | type conversion | provenance | Src:MaD:258 | +| test.go:62:20:62:41 | call to Param | test.go:62:13:62:42 | type conversion | provenance | Src:MaD:259 | +| test.go:67:20:67:33 | call to Params | test.go:67:13:67:45 | type conversion | provenance | Src:MaD:260 | +| test.go:72:20:72:41 | call to Query | test.go:72:13:72:42 | type conversion | provenance | Src:MaD:261 | +| test.go:77:20:77:32 | call to Refer | test.go:77:13:77:33 | type conversion | provenance | Src:MaD:262 | +| test.go:82:20:82:34 | call to Referer | test.go:82:13:82:35 | type conversion | provenance | Src:MaD:263 | +| test.go:87:20:87:30 | call to URI | test.go:87:13:87:31 | type conversion | provenance | Src:MaD:265 | +| test.go:92:20:92:30 | call to URL | test.go:92:13:92:31 | type conversion | provenance | Src:MaD:266 | +| test.go:97:20:97:36 | call to UserAgent | test.go:97:13:97:37 | type conversion | provenance | Src:MaD:267 | +| test.go:102:14:102:25 | call to Data | test.go:102:14:102:45 | type assertion | provenance | Src:MaD:256 | +| test.go:114:14:114:25 | call to Data | test.go:114:14:114:45 | type assertion | provenance | Src:MaD:256 | +| test.go:126:14:126:25 | call to Data | test.go:126:14:126:45 | type assertion | provenance | Src:MaD:256 | +| test.go:143:23:143:42 | call to Data | test.go:143:23:143:62 | type assertion | provenance | Src:MaD:256 | +| test.go:199:15:199:26 | call to Data | test.go:200:36:200:53 | type assertion | provenance | Src:MaD:256 | +| test.go:199:15:199:26 | call to Data | test.go:201:39:201:56 | type assertion | provenance | Src:MaD:256 | +| test.go:199:15:199:26 | call to Data | test.go:202:28:202:56 | type assertion | provenance | Src:MaD:256 | +| test.go:199:15:199:26 | call to Data | test.go:204:36:204:53 | type assertion | provenance | Src:MaD:256 | +| test.go:199:15:199:26 | call to Data | test.go:205:34:205:51 | type assertion | provenance | Src:MaD:256 | | test.go:200:21:200:54 | call to HTML2str | test.go:200:14:200:55 | type conversion | provenance | | -| test.go:200:36:200:53 | type assertion | test.go:200:21:200:54 | call to HTML2str | provenance | MaD:297 | +| test.go:200:36:200:53 | type assertion | test.go:200:21:200:54 | call to HTML2str | provenance | MaD:272 | | test.go:201:21:201:57 | call to Htmlunquote | test.go:201:14:201:58 | type conversion | provenance | | -| test.go:201:39:201:56 | type assertion | test.go:201:21:201:57 | call to Htmlunquote | provenance | MaD:299 | +| test.go:201:39:201:56 | type assertion | test.go:201:21:201:57 | call to Htmlunquote | provenance | MaD:274 | | test.go:202:2:202:68 | ... := ...[0] | test.go:203:14:203:28 | type assertion | provenance | | -| test.go:202:28:202:56 | type assertion | test.go:202:2:202:68 | ... := ...[0] | provenance | MaD:300 | +| test.go:202:28:202:56 | type assertion | test.go:202:2:202:68 | ... := ...[0] | provenance | MaD:275 | | test.go:204:21:204:54 | call to Str2html | test.go:204:14:204:55 | type conversion | provenance | | -| test.go:204:36:204:53 | type assertion | test.go:204:21:204:54 | call to Str2html | provenance | MaD:302 | +| test.go:204:36:204:53 | type assertion | test.go:204:21:204:54 | call to Str2html | provenance | MaD:277 | | test.go:205:21:205:58 | call to Substr | test.go:205:14:205:59 | type conversion | provenance | | -| test.go:205:34:205:51 | type assertion | test.go:205:21:205:58 | call to Substr | provenance | MaD:303 | +| test.go:205:34:205:51 | type assertion | test.go:205:21:205:58 | call to Substr | provenance | MaD:278 | | test.go:207:6:207:6 | definition of s | test.go:209:14:209:28 | type conversion | provenance | | -| test.go:208:18:208:33 | selection of Form | test.go:207:6:207:6 | definition of s | provenance | MaD:301 | -| test.go:223:2:223:34 | ... := ...[0] | test.go:225:31:225:31 | f | provenance | Src:MaD:319 | -| test.go:223:2:223:34 | ... := ...[1] | test.go:224:14:224:32 | type conversion | provenance | Src:MaD:319 | +| test.go:208:18:208:33 | selection of Form | test.go:207:6:207:6 | definition of s | provenance | MaD:276 | +| test.go:223:2:223:34 | ... := ...[0] | test.go:225:31:225:31 | f | provenance | Src:MaD:280 | +| test.go:223:2:223:34 | ... := ...[1] | test.go:224:14:224:32 | type conversion | provenance | Src:MaD:280 | | test.go:225:2:225:32 | ... := ...[0] | test.go:226:14:226:20 | content | provenance | | -| test.go:225:31:225:31 | f | test.go:225:2:225:32 | ... := ...[0] | provenance | MaD:613 | -| test.go:228:2:228:40 | ... := ...[0] | test.go:229:14:229:38 | type conversion | provenance | Src:MaD:320 | -| test.go:231:7:231:28 | call to GetString | test.go:232:14:232:22 | type conversion | provenance | Src:MaD:321 | -| test.go:234:8:234:35 | call to GetStrings | test.go:235:14:235:26 | type conversion | provenance | Src:MaD:322 | -| test.go:237:9:237:17 | call to Input | test.go:238:14:238:27 | type conversion | provenance | Src:MaD:323 | -| test.go:240:6:240:8 | definition of str | test.go:242:14:242:30 | type conversion | provenance | Src:MaD:318 | -| test.go:246:15:246:36 | call to GetString | test.go:249:21:249:29 | untrusted | provenance | Src:MaD:321 | -| test.go:259:23:259:44 | call to GetCookie | test.go:259:16:259:45 | type conversion | provenance | Src:MaD:266 | -| test.go:270:62:270:83 | call to GetCookie | test.go:270:55:270:84 | type conversion | provenance | Src:MaD:266 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:278:21:278:28 | index expression | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:283:44:283:60 | selection of Filename | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:284:38:284:49 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:285:37:285:48 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:291:4:291:15 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:293:42:293:53 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:294:53:294:64 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:295:38:295:49 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:296:49:296:60 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:297:51:297:65 | index expression | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:298:36:298:47 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:299:37:299:48 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:301:39:301:50 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:302:40:302:51 | genericFiles | provenance | Src:MaD:320 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:303:39:303:50 | genericFiles | provenance | Src:MaD:320 | +| test.go:225:31:225:31 | f | test.go:225:2:225:32 | ... := ...[0] | provenance | MaD:552 | +| test.go:228:2:228:40 | ... := ...[0] | test.go:229:14:229:38 | type conversion | provenance | Src:MaD:281 | +| test.go:231:7:231:28 | call to GetString | test.go:232:14:232:22 | type conversion | provenance | Src:MaD:282 | +| test.go:234:8:234:35 | call to GetStrings | test.go:235:14:235:26 | type conversion | provenance | Src:MaD:283 | +| test.go:237:9:237:17 | call to Input | test.go:238:14:238:27 | type conversion | provenance | Src:MaD:284 | +| test.go:240:6:240:8 | definition of str | test.go:242:14:242:30 | type conversion | provenance | Src:MaD:279 | +| test.go:246:15:246:36 | call to GetString | test.go:249:21:249:29 | untrusted | provenance | Src:MaD:282 | +| test.go:259:23:259:44 | call to GetCookie | test.go:259:16:259:45 | type conversion | provenance | Src:MaD:268 | +| test.go:270:62:270:83 | call to GetCookie | test.go:270:55:270:84 | type conversion | provenance | Src:MaD:268 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:278:21:278:28 | index expression | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:283:44:283:60 | selection of Filename | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:284:38:284:49 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:285:37:285:48 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:291:4:291:15 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:293:42:293:53 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:294:53:294:64 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:295:38:295:49 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:296:49:296:60 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:297:51:297:65 | index expression | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:298:36:298:47 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:299:37:299:48 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:301:39:301:50 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:302:40:302:51 | genericFiles | provenance | Src:MaD:281 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:303:39:303:50 | genericFiles | provenance | Src:MaD:281 | | test.go:276:2:276:13 | definition of genericFiles [array] | test.go:297:51:297:62 | genericFiles [array] | provenance | | | test.go:278:21:278:28 | index expression | test.go:276:2:276:13 | definition of genericFiles [array] | provenance | | | test.go:283:44:283:60 | selection of Filename | test.go:283:21:283:61 | call to GetDisplayString | provenance | FunctionModel | | test.go:284:21:284:53 | call to SliceChunk | test.go:284:21:284:92 | selection of Filename | provenance | | -| test.go:284:38:284:49 | genericFiles | test.go:284:21:284:53 | call to SliceChunk | provenance | MaD:336 | +| test.go:284:38:284:49 | genericFiles | test.go:284:21:284:53 | call to SliceChunk | provenance | MaD:288 | | test.go:285:21:285:60 | call to SliceDiff | test.go:285:21:285:96 | selection of Filename | provenance | | -| test.go:285:37:285:48 | genericFiles | test.go:285:21:285:60 | call to SliceDiff | provenance | MaD:337 | +| test.go:285:37:285:48 | genericFiles | test.go:285:21:285:60 | call to SliceDiff | provenance | MaD:289 | | test.go:290:3:292:44 | call to SliceFilter | test.go:290:3:292:80 | selection of Filename | provenance | | -| test.go:291:4:291:15 | genericFiles | test.go:290:3:292:44 | call to SliceFilter | provenance | MaD:338 | +| test.go:291:4:291:15 | genericFiles | test.go:290:3:292:44 | call to SliceFilter | provenance | MaD:290 | | test.go:293:21:293:65 | call to SliceIntersect | test.go:293:21:293:101 | selection of Filename | provenance | | -| test.go:293:42:293:53 | genericFiles | test.go:293:21:293:65 | call to SliceIntersect | provenance | MaD:339 | +| test.go:293:42:293:53 | genericFiles | test.go:293:21:293:65 | call to SliceIntersect | provenance | MaD:291 | | test.go:294:21:294:65 | call to SliceIntersect | test.go:294:21:294:101 | selection of Filename | provenance | | -| test.go:294:53:294:64 | genericFiles | test.go:294:21:294:65 | call to SliceIntersect | provenance | MaD:339 | +| test.go:294:53:294:64 | genericFiles | test.go:294:21:294:65 | call to SliceIntersect | provenance | MaD:291 | | test.go:295:21:295:61 | call to SliceMerge | test.go:295:21:295:97 | selection of Filename | provenance | | -| test.go:295:38:295:49 | genericFiles | test.go:295:21:295:61 | call to SliceMerge | provenance | MaD:340 | +| test.go:295:38:295:49 | genericFiles | test.go:295:21:295:61 | call to SliceMerge | provenance | MaD:292 | | test.go:296:21:296:61 | call to SliceMerge | test.go:296:21:296:97 | selection of Filename | provenance | | -| test.go:296:49:296:60 | genericFiles | test.go:296:21:296:61 | call to SliceMerge | provenance | MaD:340 | +| test.go:296:49:296:60 | genericFiles | test.go:296:21:296:61 | call to SliceMerge | provenance | MaD:292 | | test.go:297:21:297:66 | call to SlicePad | test.go:297:21:297:102 | selection of Filename | provenance | | | test.go:297:51:297:62 | genericFiles [array] | test.go:297:51:297:65 | index expression | provenance | | -| test.go:297:51:297:65 | index expression | test.go:297:21:297:66 | call to SlicePad | provenance | MaD:341 | +| test.go:297:51:297:65 | index expression | test.go:297:21:297:66 | call to SlicePad | provenance | MaD:293 | | test.go:298:21:298:66 | call to SlicePad | test.go:298:21:298:102 | selection of Filename | provenance | | -| test.go:298:36:298:47 | genericFiles | test.go:298:21:298:66 | call to SlicePad | provenance | MaD:341 | +| test.go:298:36:298:47 | genericFiles | test.go:298:21:298:66 | call to SlicePad | provenance | MaD:293 | | test.go:299:21:299:49 | call to SliceRand | test.go:299:21:299:82 | selection of Filename | provenance | | -| test.go:299:37:299:48 | genericFiles | test.go:299:21:299:49 | call to SliceRand | provenance | MaD:342 | +| test.go:299:37:299:48 | genericFiles | test.go:299:21:299:49 | call to SliceRand | provenance | MaD:294 | | test.go:301:21:301:97 | call to SliceReduce | test.go:301:21:301:133 | selection of Filename | provenance | | -| test.go:301:39:301:50 | genericFiles | test.go:301:21:301:97 | call to SliceReduce | provenance | MaD:343 | +| test.go:301:39:301:50 | genericFiles | test.go:301:21:301:97 | call to SliceReduce | provenance | MaD:295 | | test.go:302:21:302:52 | call to SliceShuffle | test.go:302:21:302:88 | selection of Filename | provenance | | -| test.go:302:40:302:51 | genericFiles | test.go:302:21:302:52 | call to SliceShuffle | provenance | MaD:344 | +| test.go:302:40:302:51 | genericFiles | test.go:302:21:302:52 | call to SliceShuffle | provenance | MaD:296 | | test.go:303:21:303:51 | call to SliceUnique | test.go:303:21:303:87 | selection of Filename | provenance | | -| test.go:303:39:303:50 | genericFiles | test.go:303:21:303:51 | call to SliceUnique | provenance | MaD:345 | +| test.go:303:39:303:50 | genericFiles | test.go:303:21:303:51 | call to SliceUnique | provenance | MaD:297 | | test.go:308:2:308:5 | definition of bMap | test.go:311:21:311:24 | bMap | provenance | | | test.go:308:2:308:5 | definition of bMap | test.go:312:21:312:24 | bMap | provenance | | -| test.go:309:15:309:36 | call to GetString | test.go:310:22:310:30 | untrusted | provenance | Src:MaD:321 | -| test.go:310:22:310:30 | untrusted | test.go:308:2:308:5 | definition of bMap | provenance | MaD:348 | -| test.go:311:21:311:24 | bMap | test.go:311:21:311:39 | call to Get | provenance | MaD:346 | +| test.go:309:15:309:36 | call to GetString | test.go:310:22:310:30 | untrusted | provenance | Src:MaD:282 | +| test.go:310:22:310:30 | untrusted | test.go:308:2:308:5 | definition of bMap | provenance | MaD:300 | +| test.go:311:21:311:24 | bMap | test.go:311:21:311:39 | call to Get | provenance | MaD:298 | | test.go:311:21:311:39 | call to Get | test.go:311:21:311:48 | type assertion | provenance | | -| test.go:312:21:312:24 | bMap | test.go:312:21:312:32 | call to Items | provenance | MaD:347 | +| test.go:312:21:312:24 | bMap | test.go:312:21:312:32 | call to Items | provenance | MaD:299 | | test.go:312:21:312:32 | call to Items | test.go:312:21:312:52 | type assertion | provenance | | nodes | test.go:33:6:33:10 | definition of bound | semmle.label | definition of bound | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Beego/TaintedPath.expected b/go/ql/test/library-tests/semmle/go/frameworks/Beego/TaintedPath.expected index 9681164d8259..18d4f8ca300a 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Beego/TaintedPath.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Beego/TaintedPath.expected @@ -1,12 +1,12 @@ edges -| test.go:215:15:215:26 | call to Data | test.go:216:18:216:26 | untrusted | provenance | Src:MaD:254 | -| test.go:215:15:215:26 | call to Data | test.go:217:10:217:18 | untrusted | provenance | Src:MaD:254 | -| test.go:215:15:215:26 | call to Data | test.go:218:35:218:43 | untrusted | provenance | Src:MaD:254 | -| test.go:324:17:324:37 | selection of RequestBody | test.go:324:40:324:43 | &... | provenance | Src:MaD:262 MaD:187 | +| test.go:215:15:215:26 | call to Data | test.go:216:18:216:26 | untrusted | provenance | Src:MaD:256 | +| test.go:215:15:215:26 | call to Data | test.go:217:10:217:18 | untrusted | provenance | Src:MaD:256 | +| test.go:215:15:215:26 | call to Data | test.go:218:35:218:43 | untrusted | provenance | Src:MaD:256 | +| test.go:324:17:324:37 | selection of RequestBody | test.go:324:40:324:43 | &... | provenance | Src:MaD:264 MaD:187 | | test.go:324:40:324:43 | &... | test.go:326:35:326:43 | untrusted | provenance | | -| test.go:332:15:332:26 | call to Data | test.go:334:23:334:31 | untrusted | provenance | Src:MaD:254 | -| test.go:340:15:340:26 | call to Data | test.go:342:53:342:61 | untrusted | provenance | Src:MaD:284 | -| test.go:340:15:340:26 | call to Data | test.go:344:23:344:31 | untrusted | provenance | Src:MaD:284 | +| test.go:332:15:332:26 | call to Data | test.go:334:23:334:31 | untrusted | provenance | Src:MaD:256 | +| test.go:340:15:340:26 | call to Data | test.go:342:53:342:61 | untrusted | provenance | Src:MaD:256 | +| test.go:340:15:340:26 | call to Data | test.go:344:23:344:31 | untrusted | provenance | Src:MaD:256 | nodes | test.go:215:15:215:26 | call to Data | semmle.label | call to Data | | test.go:216:18:216:26 | untrusted | semmle.label | untrusted | From f650e3f72b24d63d86f363a63fa3831b4c3242a6 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Tue, 9 Jul 2024 16:19:09 +0100 Subject: [PATCH 55/70] Update MaD documentation explain "group:" in package column --- go/ql/lib/semmle/go/dataflow/ExternalFlow.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll index 8ebc21ab6db9..f5c946ac42c0 100644 --- a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -20,7 +20,10 @@ * 1. The `package` column selects a package. Note that if the package does not * contain a major version suffix (like "/v2") then we will match all major * versions. This can be disabled by putting `fixed-version:` at the start - * of the package path. + * of the package path. Also, instead of a package path, if this column is + * "group:<groupname>" then it indicates that the row applies to all + * packages in the group `<groupname>` according to the `packageGrouping` + * predicate. * 2. The `type` column selects a type within that package. * 3. The `subtypes` is a boolean that indicates whether to jump to an * arbitrary subtype of that type. From ab991af2a535109b53651916365931adad624e8e Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Tue, 9 Jul 2024 17:15:09 +0100 Subject: [PATCH 56/70] Fix package validation errors --- go/ql/lib/semmle/go/dataflow/ExternalFlow.qll | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll index f5c946ac42c0..014172689a35 100644 --- a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -110,12 +110,15 @@ predicate sourceModel( string package, string type, boolean subtypes, string name, string signature, string ext, string output, string kind, string provenance, QlBuiltins::ExtensionId madId ) { - FlowExtensions::sourceModel(package, type, subtypes, name, signature, ext, output, kind, - provenance, madId) - or - // Also look for models that are defined for a group that `package` is part of. - FlowExtensions::sourceModel(getGroup(package), type, subtypes, name, signature, ext, output, kind, - provenance, madId) + exists(string p | + FlowExtensions::sourceModel(p, type, subtypes, name, signature, ext, output, kind, provenance, + madId) + | + not exists(string s | p = groupPrefix() + s) and package = p + or + // Also look for models that are defined for a group that `package` is part of. + p = getGroup(package) + ) } /** @@ -127,12 +130,15 @@ predicate sinkModel( string package, string type, boolean subtypes, string name, string signature, string ext, string input, string kind, string provenance, QlBuiltins::ExtensionId madId ) { - FlowExtensions::sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance, - madId) - or - // Also look for models that are defined for a group that `package` is part of. - FlowExtensions::sinkModel(getGroup(package), type, subtypes, name, signature, ext, input, kind, - provenance, madId) + exists(string p | + FlowExtensions::sinkModel(p, type, subtypes, name, signature, ext, input, kind, provenance, + madId) + | + not exists(string s | p = groupPrefix() + s) and package = p + or + // Also look for models that are defined for a group that `package` is part of. + p = getGroup(package) + ) } /** @@ -144,12 +150,15 @@ predicate summaryModel( string package, string type, boolean subtypes, string name, string signature, string ext, string input, string output, string kind, string provenance, QlBuiltins::ExtensionId madId ) { - FlowExtensions::summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, - provenance, madId) - or - // Also look for models that are defined for a group that `package` is part of. - FlowExtensions::summaryModel(getGroup(package), type, subtypes, name, signature, ext, input, - output, kind, provenance, madId) + exists(string p | + FlowExtensions::summaryModel(p, type, subtypes, name, signature, ext, input, output, kind, + provenance, madId) + | + not exists(string s | p = groupPrefix() + s) and package = p + or + // Also look for models that are defined for a group that `package` is part of. + p = getGroup(package) + ) } /** @@ -160,10 +169,12 @@ predicate summaryModel( predicate neutralModel( string package, string type, string name, string signature, string kind, string provenance ) { - FlowExtensions::neutralModel(package, type, name, signature, kind, provenance) - or - // Also look for models that are defined for a group that `package` is part of. - FlowExtensions::neutralModel(getGroup(package), type, name, signature, kind, provenance) + exists(string p | FlowExtensions::neutralModel(p, type, name, signature, kind, provenance) | + not exists(string s | p = groupPrefix() + s) and package = p + or + // Also look for models that are defined for a group that `package` is part of. + p = getGroup(package) + ) } /** From f6b9195a61d3dfe99f599555d561ed433473f910 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Wed, 10 Jul 2024 10:05:02 +0100 Subject: [PATCH 57/70] Add validation of package groups --- go/ql/lib/semmle/go/dataflow/ExternalFlow.qll | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll index 014172689a35..84a9bc1a3bea 100644 --- a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -376,12 +376,30 @@ module ModelValidation { ) } + private string getInvalidPackageGroup() { + exists(string pred, string group, string package | + FlowExtensions::sourceModel(package, _, _, _, _, _, _, _, _, _) and pred = "source" + or + FlowExtensions::sinkModel(package, _, _, _, _, _, _, _, _, _) and pred = "sink" + or + FlowExtensions::summaryModel(package, _, _, _, _, _, _, _, _, _, _) and + pred = "summary" + or + FlowExtensions::neutralModel(package, _, _, _, _, _) and + pred = "neutral" + | + package = groupPrefix() + group and + not FlowExtensions::packageGrouping(group, _) and + result = "Dubious package group \"" + package + "\" in " + pred + " model." + ) + } + /** Holds if some row in a MaD flow model appears to contain typos. */ query predicate invalidModelRow(string msg) { msg = [ getInvalidModelSignature(), getInvalidModelInput(), getInvalidModelOutput(), - KindVal::getInvalidModelKind() + KindVal::getInvalidModelKind(), getInvalidPackageGroup() ] } } From 3e2ebf436c78eb27368095a2d9783641e05de9c4 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Wed, 10 Jul 2024 15:26:07 +0100 Subject: [PATCH 58/70] Move logic for dealing with groups into a predicate --- go/ql/lib/semmle/go/dataflow/ExternalFlow.qll | 58 ++++++++----------- 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll index 84a9bc1a3bea..24fb6abf34c6 100644 --- a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -93,11 +93,20 @@ private import codeql.mad.ModelValidation as SharedModelVal /** Gets the prefix for a group of packages. */ string groupPrefix() { result = "group:" } -/** Gets a group that `package` is in, according to `packageGrouping`. */ -private string getGroup(string package) { +/** + * Gets a package represented by `packageOrGroup`. + * + * If `packageOrGroup` is of the form `group:<groupname>` then `result` is a + * package in the group `<groupname>`, as determined by `packageGrouping`. + * Otherwise, `result` is `packageOrGroup`. + */ +bindingset[packageOrGroup] +private string getPackage(string packageOrGroup) { + not exists(string s | packageOrGroup = groupPrefix() + s) and result = packageOrGroup + or exists(string group | - FlowExtensions::packageGrouping(group, package) and - result = groupPrefix() + group + FlowExtensions::packageGrouping(group, result) and + packageOrGroup = groupPrefix() + group ) } @@ -110,14 +119,10 @@ predicate sourceModel( string package, string type, boolean subtypes, string name, string signature, string ext, string output, string kind, string provenance, QlBuiltins::ExtensionId madId ) { - exists(string p | - FlowExtensions::sourceModel(p, type, subtypes, name, signature, ext, output, kind, provenance, - madId) - | - not exists(string s | p = groupPrefix() + s) and package = p - or - // Also look for models that are defined for a group that `package` is part of. - p = getGroup(package) + exists(string packageOrGroup | + package = getPackage(packageOrGroup) and + FlowExtensions::sourceModel(packageOrGroup, type, subtypes, name, signature, ext, output, kind, + provenance, madId) ) } @@ -130,14 +135,9 @@ predicate sinkModel( string package, string type, boolean subtypes, string name, string signature, string ext, string input, string kind, string provenance, QlBuiltins::ExtensionId madId ) { - exists(string p | - FlowExtensions::sinkModel(p, type, subtypes, name, signature, ext, input, kind, provenance, - madId) - | - not exists(string s | p = groupPrefix() + s) and package = p - or - // Also look for models that are defined for a group that `package` is part of. - p = getGroup(package) + exists(string packageOrGroup | package = getPackage(packageOrGroup) | + FlowExtensions::sinkModel(packageOrGroup, type, subtypes, name, signature, ext, input, kind, + provenance, madId) ) } @@ -150,14 +150,9 @@ predicate summaryModel( string package, string type, boolean subtypes, string name, string signature, string ext, string input, string output, string kind, string provenance, QlBuiltins::ExtensionId madId ) { - exists(string p | - FlowExtensions::summaryModel(p, type, subtypes, name, signature, ext, input, output, kind, - provenance, madId) - | - not exists(string s | p = groupPrefix() + s) and package = p - or - // Also look for models that are defined for a group that `package` is part of. - p = getGroup(package) + exists(string packageOrGroup | package = getPackage(packageOrGroup) | + FlowExtensions::summaryModel(packageOrGroup, type, subtypes, name, signature, ext, input, + output, kind, provenance, madId) ) } @@ -169,11 +164,8 @@ predicate summaryModel( predicate neutralModel( string package, string type, string name, string signature, string kind, string provenance ) { - exists(string p | FlowExtensions::neutralModel(p, type, name, signature, kind, provenance) | - not exists(string s | p = groupPrefix() + s) and package = p - or - // Also look for models that are defined for a group that `package` is part of. - p = getGroup(package) + exists(string packageOrGroup | package = getPackage(packageOrGroup) | + FlowExtensions::neutralModel(packageOrGroup, type, name, signature, kind, provenance) ) } From b64ef8439373556750b920107641f054bc4969ea Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Wed, 10 Jul 2024 15:28:54 +0100 Subject: [PATCH 59/70] Use `prefix()` method on string to check for group prefix --- go/ql/lib/semmle/go/dataflow/ExternalFlow.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll index 24fb6abf34c6..ba08e24e0e04 100644 --- a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -102,7 +102,7 @@ string groupPrefix() { result = "group:" } */ bindingset[packageOrGroup] private string getPackage(string packageOrGroup) { - not exists(string s | packageOrGroup = groupPrefix() + s) and result = packageOrGroup + not packageOrGroup.prefix(groupPrefix().length()) = groupPrefix() and result = packageOrGroup or exists(string group | FlowExtensions::packageGrouping(group, result) and From 32acff76c21ffea2a6aa51f2addc2983f479b63b Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Wed, 10 Jul 2024 15:29:38 +0100 Subject: [PATCH 60/70] Make `groupPrefix()` private This could be made public in future. But I expect that we will want to use this logic for QL models as well then we will want to move it into a different file, which will be much easier if it's all private at the moment. --- go/ql/lib/semmle/go/dataflow/ExternalFlow.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll index ba08e24e0e04..84c3e71e4a96 100644 --- a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -91,7 +91,7 @@ private import internal.FlowSummaryImpl::Private::External private import codeql.mad.ModelValidation as SharedModelVal /** Gets the prefix for a group of packages. */ -string groupPrefix() { result = "group:" } +private string groupPrefix() { result = "group:" } /** * Gets a package represented by `packageOrGroup`. From 2c7fbda2ecc17510b60350d0be407d4b218019ad Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Wed, 10 Jul 2024 15:32:58 +0100 Subject: [PATCH 61/70] Accept review suggestion for QLDoc --- go/ql/lib/semmle/go/dataflow/ExternalFlow.qll | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll index 84c3e71e4a96..f8a7457b11b0 100644 --- a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -113,7 +113,8 @@ private string getPackage(string packageOrGroup) { /** * Holds if a source model exists for the given parameters. * - * Note that we consider all packages in the same group. + * Note that `group:` references are expanded into one or more actual packages + * by this predicate. */ predicate sourceModel( string package, string type, boolean subtypes, string name, string signature, string ext, @@ -129,7 +130,8 @@ predicate sourceModel( /** * Holds if a sink model exists for the given parameters. * - * Note that we consider all packages in the same group. + * Note that `group:` references are expanded into one or more actual packages + * by this predicate. */ predicate sinkModel( string package, string type, boolean subtypes, string name, string signature, string ext, @@ -144,7 +146,8 @@ predicate sinkModel( /** * Holds if a summary model exists for the given parameters. * - * Note that we consider all packages in the same group. + * Note that `group:` references are expanded into one or more actual packages + * by this predicate. */ predicate summaryModel( string package, string type, boolean subtypes, string name, string signature, string ext, @@ -159,7 +162,8 @@ predicate summaryModel( /** * Holds if a neutral model exists for the given parameters. * - * Note that we consider all packages in the same group. + * Note that `group:` references are expanded into one or more actual packages + * by this predicate. */ predicate neutralModel( string package, string type, string name, string signature, string kind, string provenance From 3f789bad6030b96a6e22c9e2665d320186510c05 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <jketema@github.com> Date: Wed, 10 Jul 2024 19:10:44 +0200 Subject: [PATCH 62/70] C++: Support more builtin operations --- .../exprs.ql | 17 + .../old.dbscheme | 2289 +++++++ .../semmlecode.cpp.dbscheme | 2251 +++++++ .../upgrade.properties | 3 + .../code/cpp/exprs/BuiltInOperations.qll | 329 +- cpp/ql/lib/semmlecode.cpp.dbscheme | 38 + cpp/ql/lib/semmlecode.cpp.dbscheme.stats | 5983 +++++++++-------- .../old.dbscheme | 2251 +++++++ .../semmlecode.cpp.dbscheme | 2289 +++++++ .../upgrade.properties | 2 + .../builtins/type_traits/clang.cpp | 17 +- .../builtins/type_traits/expr.expected | 104 + .../builtins/type_traits/gcc.cpp | 29 + .../library-tests/builtins/type_traits/ms.cpp | 17 + 14 files changed, 12673 insertions(+), 2946 deletions(-) create mode 100644 cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/exprs.ql create mode 100644 cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/old.dbscheme create mode 100644 cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/semmlecode.cpp.dbscheme create mode 100644 cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/upgrade.properties create mode 100644 cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/old.dbscheme create mode 100644 cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/semmlecode.cpp.dbscheme create mode 100644 cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/upgrade.properties create mode 100644 cpp/ql/test/library-tests/builtins/type_traits/gcc.cpp diff --git a/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/exprs.ql b/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/exprs.ql new file mode 100644 index 000000000000..d1b8af0b6664 --- /dev/null +++ b/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/exprs.ql @@ -0,0 +1,17 @@ +class Expr extends @expr { + string toString() { none() } +} + +class Location extends @location_expr { + string toString() { none() } +} + +predicate isExprWithNewBuiltin(Expr expr) { + exists(int kind | exprs(expr, kind, _) | 364 <= kind and kind <= 384) +} + +from Expr expr, int kind, int kind_new, Location location +where + exprs(expr, kind, location) and + if isExprWithNewBuiltin(expr) then kind_new = 1 else kind_new = kind +select expr, kind_new, location diff --git a/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/old.dbscheme b/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/old.dbscheme new file mode 100644 index 000000000000..3d35dd6b50ed --- /dev/null +++ b/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/old.dbscheme @@ -0,0 +1,2289 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* +case @function.kind of + 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; +*/ + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +| 40 = @decimal32 // _Decimal32 +| 41 = @decimal64 // _Decimal64 +| 42 = @decimal128 // _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* +case @usertype.kind of + 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +| 5 = @typedef // classic C: typedef typedef type name +| 6 = @template +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +| 14 = @using_alias // a using name = type style typedef +; +*/ + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/semmlecode.cpp.dbscheme b/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..abfce5c170f9 --- /dev/null +++ b/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/semmlecode.cpp.dbscheme @@ -0,0 +1,2251 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* +case @function.kind of + 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; +*/ + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +| 40 = @decimal32 // _Decimal32 +| 41 = @decimal64 // _Decimal64 +| 42 = @decimal128 // _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* +case @usertype.kind of + 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +| 5 = @typedef // classic C: typedef typedef type name +| 6 = @template +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +| 14 = @using_alias // a using name = type style typedef +; +*/ + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/upgrade.properties b/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/upgrade.properties new file mode 100644 index 000000000000..d697a16a42fd --- /dev/null +++ b/cpp/downgrades/3d35dd6b50edfc540c14c6757e0c7b3c5b7b04dd/upgrade.properties @@ -0,0 +1,3 @@ +description: Add new builtin operations +compatibility: partial +exprs.rel: run exprs.qlo diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll index ba924d58da5b..6748c3c27d22 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll @@ -383,6 +383,37 @@ class BuiltInOperationIsConvertibleTo extends BuiltInOperation, @isconvtoexpr { override string getAPrimaryQlClass() { result = "BuiltInOperationIsConvertibleTo" } } +/** + * A C++ `__is_convertible` built-in operation (used by some implementations + * of the `<type_traits>` header). + * + * Returns `true` if the first type can be converted to the second type. + * ``` + * bool v = __is_convertible(MyType, OtherType); + * ``` + */ +class BuiltInOperationIsConvertible extends BuiltInOperation, @isconvertible { + override string toString() { result = "__is_convertible" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsConvertible" } +} + +/** + * A C++ `__is_nothrow_convertible` built-in operation (used by some implementations + * of the `<type_traits>` header). + * + * Returns `true` if the first type can be converted to the second type without + * potentially rasing an exception. + * ``` + * bool v = __is_nothrow_convertible(MyType, OtherType); + * ``` + */ +class BuiltInOperationIsNothrowConvertible extends BuiltInOperation, @isnothrowconvertible { + override string toString() { result = "__is_nothrow_convertible" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsNothrowConvertible" } +} + /** * A C++ `__is_empty` built-in operation (used by some implementations of the * `<type_traits>` header). @@ -675,6 +706,26 @@ class BuiltInOperationIsAssignable extends BuiltInOperation, @isassignable { override string getAPrimaryQlClass() { result = "BuiltInOperationIsAssignable" } } +/** + * The `__is_assignable_no_precondition_check` built-in operation (used by some + * implementations of the `<type_traits>` header). + * + * Returns true if there exists a `C::operator =(const D& d)` assignment + * operator. + * ``` + * bool v = __is_assignable_no_precondition_check(MyType1, MyType2); + * ``` + */ +class BuiltInOperationIsAssignableNoPreconditionCheck extends BuiltInOperation, + @isassignablenopreconditioncheck +{ + override string toString() { result = "__is_assignable_no_precondition_check" } + + override string getAPrimaryQlClass() { + result = "BuiltInOperationIsAssignableNoPreconditionCheck" + } +} + /** * The `__is_standard_layout` built-in operation (used by some implementations * of the `<type_traits>` header). @@ -708,6 +759,20 @@ class BuiltInOperationIsTriviallyCopyable extends BuiltInOperation, @istrivially override string getAPrimaryQlClass() { result = "BuiltInOperationIsTriviallyCopyable" } } +/** + * The `__is_trivially_copy_assignable` built-in operation (used by some + * implementations of the `<type_traits>` header). + * + * Returns `true` if instances of this type can be copied using a trivial + * copy operator. + */ +class BuiltInOperationIsTriviallyCopyAssignable extends BuiltInOperation, @istriviallycopyassignable +{ + override string toString() { result = "__is_trivially_copy_assignable" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsTriviallyCopyAssignable" } +} + /** * The `__is_literal_type` built-in operation (used by some implementations of * the `<type_traits>` header). @@ -1062,6 +1127,24 @@ class BuiltInOperationIsSame extends BuiltInOperation, @issame { override string getAPrimaryQlClass() { result = "BuiltInOperationIsSame" } } +/** + * A C++ `__is_same_as` built-in operation (used by some implementations of the + * `<type_traits>` header). + * + * Returns `true` if two types are the same. + * ``` + * template<typename _Tp, typename _Up> + * struct is_same + * : public integral_constant<bool, __is_same_as(_Tp, _Up)> + * { }; + * ``` + */ +class BuiltInOperationIsSameAs extends BuiltInOperation, @issameas { + override string toString() { result = "__is_same_as" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsSameAs" } +} + /** * A C++ `__is_function` built-in operation (used by some implementations of the * `<type_traits>` header). @@ -1120,6 +1203,87 @@ class BuiltInOperationIsPointerInterconvertibleBaseOf extends BuiltInOperation, } } +/** + * A C++ `__is_pointer_interconvertible_with_class` built-in operation (used + * by some implementations of the `<type_traits>` header). + * + * Returns `true` if the member pointer is pointer-interconvertible with a + * class type. + * ``` + * template<typename _Tp, typename _Up> + * constexpr bool is_pointer_interconvertible_with_class(_Up _Tp::*mp) noexcept + * = __is_pointer_interconvertible_with_class(_Tp, mp); + * ``` + */ +class BuiltInOperationIsPointerInterconvertibleWithClass extends BuiltInOperation, + @ispointerinterconvertiblewithclass +{ + override string toString() { result = "__is_pointer_interconvertible_with_class" } + + override string getAPrimaryQlClass() { + result = "BuiltInOperationIsPointerInterconvertibleWithClass" + } +} + +/** + * A C++ `__builtin_is_pointer_interconvertible_with_class` built-in operation (used + * by some implementations of the `<type_traits>` header). + * + * Returns `true` if the member pointer is pointer-interconvertible with a class type. + * ``` + * template<typename _Tp, typename _Up> + * constexpr bool is_pointer_interconvertible_with_class(_Up _Tp::*mp) noexcept + * = __builtin_is_pointer_interconvertible_with_class(mp); + * ``` + */ +class BuiltInOperationBuiltInIsPointerInterconvertible extends BuiltInOperation, + @builtinispointerinterconvertiblewithclass +{ + override string toString() { result = "__builtin_is_pointer_interconvertible_with_class" } + + override string getAPrimaryQlClass() { + result = "BuiltInOperationBuiltInIsPointerInterconvertible" + } +} + +/** + * A C++ `__is_corresponding_member` built-in operation (used + * by some implementations of the `<type_traits>` header). + * + * Returns `true` if the member pointers refer to corresponding + * members in the initial sequences of two class types. + * ``` + * template<typename _Tp1, typename _Tp2, typename _Up1, typename _Up2> + * constexpr bool is_corresponding_member(_Up1 _Tp1::*mp1, _Up2 _Tp2::*mp2 ) noexcept + * = __is_corresponding_member(_Tp1, _Tp2, mp1, mp2); + * ``` + */ +class BuiltInOperationIsCorrespondingMember extends BuiltInOperation, @iscorrespondingmember { + override string toString() { result = "__is_corresponding_member" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsCorrespondingMember" } +} + +/** + * A C++ `__builtin_is_corresponding_member` built-in operation (used + * by some implementations of the `<type_traits>` header). + * + * Returns `true` if the member pointers refer to corresponding + * members in the initial sequences of two class types. + * ``` + * template<typename _Tp1, typename _Tp2, typename _Up1, typename _Up2> + * constexpr bool is_corresponding_member(_Up1 _Tp1::*mp1, _Up2 _Tp2::*mp2 ) noexcept + * = __builtin_is_corresponding_member(mp1, mp2); + * ``` + */ +class BuiltInOperationBuiltInIsCorrespondingMember extends BuiltInOperation, + @builtiniscorrespondingmember +{ + override string toString() { result = "__builtin_is_corresponding_member" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationBuiltInIsCorrespondingMember" } +} + /** * A C++ `__is_array` built-in operation (used by some implementations of the * `<type_traits>` header). @@ -1138,6 +1302,42 @@ class BuiltInOperationIsArray extends BuiltInOperation, @isarray { override string getAPrimaryQlClass() { result = "BuiltInOperationIsArray" } } +/** + * A C++ `__is_bounded_array` built-in operation (used by some implementations + * of the `<type_traits>` header). + * + * Returns `true` if a type is a bounded array type. + * ``` + * template<typename _Tp> + * struct is_bounded_array + * : public integral_constant<bool, __is_bounded_array(_Tp)> + * { }; + * ``` + */ +class BuiltInOperationIsBoundedArray extends BuiltInOperation, @isboundedarray { + override string toString() { result = "__is_bounded_array" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsBoundedArray" } +} + +/** + * A C++ `__is_unbounded_array` built-in operation (used by some implementations + * of the `<type_traits>` header). + * + * Returns `true` if a type is an unbounded array type. + * ``` + * template<typename _Tp> + * struct is_bounded_array + * : public integral_constant<bool, __is_unbounded_array(_Tp)> + * { }; + * ``` + */ +class BuiltInOperationIsUnboundedArray extends BuiltInOperation, @isunboundedarray { + override string toString() { result = "__is_unbounded_array" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsUnboundedArray" } +} + /** * A C++ `__array_rank` built-in operation (used by some implementations of the * `<type_traits>` header). @@ -1554,10 +1754,10 @@ class BuiltInBitCast extends BuiltInOperation, @builtinbitcast { * * Returns `true` if a type is a trivial type. * ``` - * template<typename _Tp> - * struct is_trivial - * : public integral_constant<bool, __is_trivial(_Tp)> - * {}; + * template<typename _Tp> + * struct is_trivial + * : public integral_constant<bool, __is_trivial(_Tp)> + * {}; * ``` */ class BuiltInIsTrivial extends BuiltInOperation, @istrivialexpr { @@ -1565,3 +1765,124 @@ class BuiltInIsTrivial extends BuiltInOperation, @istrivialexpr { override string getAPrimaryQlClass() { result = "BuiltInIsTrivial" } } + +/** + * A C++ `__reference_constructs_from_temporary` built-in operation + * (used by some implementations of the `<type_traits>` header). + * + * Returns `true` if a type is a trivial type. + * ``` + * template<typename _Tp> + * struct reference_constructs_from_temporary + * : public integral_constant<bool, __reference_constructs_from_temporary(_Tp)> + * {}; + * ``` + */ +class BuiltInOperationReferenceConstructsFromTemporary extends BuiltInOperation, + @referenceconstructsfromtemporary +{ + override string toString() { result = "__reference_constructs_from_temporary" } + + override string getAPrimaryQlClass() { + result = "BuiltInOperationReferenceConstructsFromTemporary" + } +} + +/** + * A C++ `__reference_converts_from_temporary` built-in operation + * (used by some implementations of the `<type_traits>` header). + * + * Returns `true` if a type is a trivial type. + * ``` + * template<typename _Tp> + * struct reference_converts_from_temporary + * : public integral_constant<bool, __reference_converts_from_temporary(_Tp)> + * {}; + * ``` + */ +class BuiltInOperationReferenceCovertsFromTemporary extends BuiltInOperation, + @referenceconstructsfromtemporary +{ + override string toString() { result = "__reference_constructs_from_temporary" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationReferenceCovertsFromTemporary" } +} + +/** + * A C++ `__reference_binds_to_temporary` built-in operation (used by some + * implementations of the `<tuple>` header). + * + * Returns `true` if a reference of type `Type1` bound to an expression of + * type `Type1` binds to a temporary object. + * ``` + * __reference_binds_to_temporary(Type1, Type2) + */ +class BuiltInOperationReferenceBindsToTemporary extends BuiltInOperation, @referencebindstotemporary +{ + override string toString() { result = "__reference_binds_to_temporary" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationReferenceBindsToTemporary" } +} + +/** + * A C++ `__builtin_has_attribute` built-in operation. + * + * Returns `true` if a type or expression has been declared with an + * attribute. + * ``` + * __attribute__ ((aligned(8))) int v; + * bool has_attribute = __builtin_has_attribute(v, aligned); + * ``` + */ +class BuiltInOperationHasAttribute extends BuiltInOperation, @builtinhasattribute { + override string toString() { result = "__builtin_has_attribute" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationHasAttribute" } +} + +/** + * A C++ `__is_referenceable` built-in operation. + * + * Returns `true` if a type can be referenced. + * ``` + * bool is_referenceable = __is_referenceable(int); + * ``` + */ +class BuiltInOperationIsReferenceable extends BuiltInOperation, @isreferenceable { + override string toString() { result = "__is_referenceable" } + + override string getAPrimaryQlClass() { result = "BuiltInIsReferenceable" } +} + +/** + * The `__is_valid_winrt_type` built-in operation. This is a Microsoft extension. + * + * Returns `true` if the type is a valid WinRT type. + */ +class BuiltInOperationIsValidWinRtType extends BuiltInOperation, @isvalidwinrttype { + override string toString() { result = "__is_valid_winrt_type" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsValidWinRtType" } +} + +/** + * The `__is_win_class` built-in operation. This is a Microsoft extension. + * + * Returns `true` if the class is a ref class. + */ +class BuiltInOperationIsWinClass extends BuiltInOperation, @iswinclass { + override string toString() { result = "__is_win_class" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsWinClass" } +} + +/** + * The `__is_win_class` built-in operation. This is a Microsoft extension. + * + * Returns `true` if the class is an interface class. + */ +class BuiltInOperationIsWinInterface extends BuiltInOperation, @iswininterface { + override string toString() { result = "__is_win_interface" } + + override string getAPrimaryQlClass() { result = "BuiltInOperationIsWinInterface" } +} diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme index abfce5c170f9..3d35dd6b50ed 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme @@ -1748,6 +1748,25 @@ case @expr.kind of | 361 = @isvoid | 362 = @isvolatile | 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface ; @var_args_expr = @vastartexpr @@ -1842,6 +1861,25 @@ case @expr.kind of | @isunsigned | @isvoid | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface ; new_allocated_type( diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats index d6f973be1f64..fbb177927c72 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats @@ -2,7 +2,7 @@ <typesizes> <e> <k>@compilation</k> - <v>9654</v> + <v>9651</v> </e> <e> <k>@externalDataElement</k> @@ -18,71 +18,71 @@ </e> <e> <k>@location_default</k> - <v>29787737</v> + <v>29785199</v> </e> <e> <k>@location_stmt</k> - <v>3820076</v> + <v>3820138</v> </e> <e> - <k>@diagnostic</k> - <v>5001</v> + <k>@location_expr</k> + <v>13188829</v> </e> <e> - <k>@location_expr</k> - <v>13188614</v> + <k>@diagnostic</k> + <v>4979</v> </e> <e> <k>@file</k> - <v>123139</v> + <v>123129</v> </e> <e> <k>@folder</k> - <v>16325</v> + <v>16323</v> </e> <e> <k>@macro_expansion</k> - <v>32959239</v> + <v>32951596</v> </e> <e> <k>@other_macro_reference</k> - <v>858248</v> + <v>858174</v> </e> <e> <k>@function</k> - <v>4646200</v> + <v>4645804</v> </e> <e> <k>@fun_decl</k> - <v>5010023</v> + <v>5009596</v> </e> <e> <k>@var_decl</k> - <v>8423424</v> + <v>8422707</v> </e> <e> <k>@type_decl</k> - <v>3242218</v> + <v>3280187</v> </e> <e> <k>@namespace_decl</k> - <v>311523</v> + <v>311514</v> </e> <e> <k>@using</k> - <v>369419</v> + <v>369388</v> </e> <e> <k>@static_assert</k> - <v>134652</v> + <v>134648</v> </e> <e> <k>@parameter</k> - <v>6576325</v> + <v>6575765</v> </e> <e> <k>@membervariable</k> - <v>1054750</v> + <v>1054767</v> </e> <e> <k>@globalvariable</k> @@ -90,11 +90,11 @@ </e> <e> <k>@localvariable</k> - <v>576895</v> + <v>576915</v> </e> <e> <k>@enumconstant</k> - <v>241682</v> + <v>241686</v> </e> <e> <k>@errortype</k> @@ -322,27 +322,27 @@ </e> <e> <k>@pointer</k> - <v>567656</v> + <v>567608</v> </e> <e> <k>@type_with_specifiers</k> - <v>1010307</v> + <v>1010221</v> </e> <e> <k>@array</k> - <v>110079</v> + <v>110070</v> </e> <e> <k>@routineptr</k> - <v>624503</v> + <v>624146</v> </e> <e> <k>@reference</k> - <v>1720495</v> + <v>1720096</v> </e> <e> <k>@gnu_vector</k> - <v>671</v> + <v>693</v> </e> <e> <k>@routinereference</k> @@ -350,7 +350,7 @@ </e> <e> <k>@rvalue_reference</k> - <v>620537</v> + <v>620183</v> </e> <e> <k>@block</k> @@ -358,43 +358,43 @@ </e> <e> <k>@decltype</k> - <v>27053</v> + <v>27051</v> </e> <e> <k>@usertype</k> - <v>5230182</v> + <v>5228803</v> </e> <e> <k>@mangledname</k> - <v>6448521</v> + <v>6447972</v> </e> <e> <k>@type_mention</k> - <v>4029338</v> + <v>4029404</v> </e> <e> <k>@routinetype</k> - <v>538026</v> + <v>537719</v> </e> <e> <k>@ptrtomember</k> - <v>37781</v> + <v>37778</v> </e> <e> <k>@specifier</k> - <v>24721</v> + <v>24719</v> </e> <e> <k>@gnuattribute</k> - <v>685665</v> + <v>686073</v> </e> <e> <k>@stdattribute</k> - <v>487639</v> + <v>476990</v> </e> <e> <k>@declspec</k> - <v>243121</v> + <v>243125</v> </e> <e> <k>@msattribute</k> @@ -402,15 +402,15 @@ </e> <e> <k>@alignas</k> - <v>9795</v> + <v>9794</v> </e> <e> <k>@attribute_arg_token</k> - <v>39180</v> + <v>39177</v> </e> <e> <k>@attribute_arg_constant_expr</k> - <v>370352</v> + <v>370787</v> </e> <e> <k>@attribute_arg_empty</k> @@ -430,35 +430,35 @@ </e> <e> <k>@derivation</k> - <v>390988</v> + <v>390765</v> </e> <e> <k>@frienddecl</k> - <v>706005</v> + <v>705602</v> </e> <e> <k>@comment</k> - <v>8682106</v> + <v>8267972</v> </e> <e> <k>@namespace</k> - <v>12127</v> + <v>12126</v> </e> <e> - <k>@specialnamequalifyingelement</k> - <v>466</v> + <k>@namequalifier</k> + <v>1508764</v> </e> <e> - <k>@namequalifier</k> - <v>1515301</v> + <k>@specialnamequalifyingelement</k> + <v>466</v> </e> <e> <k>@value</k> - <v>10777241</v> + <v>10777417</v> </e> <e> <k>@initialiser</k> - <v>1710223</v> + <v>1710171</v> </e> <e> <k>@address_of</k> @@ -466,15 +466,15 @@ </e> <e> <k>@indirect</k> - <v>292660</v> + <v>292665</v> </e> <e> <k>@array_to_pointer</k> - <v>1430911</v> + <v>1430934</v> </e> <e> <k>@parexpr</k> - <v>3587661</v> + <v>3587718</v> </e> <e> <k>@arithnegexpr</k> @@ -490,19 +490,19 @@ </e> <e> <k>@notexpr</k> - <v>276439</v> + <v>276443</v> </e> <e> <k>@postincrexpr</k> - <v>62048</v> + <v>62049</v> </e> <e> <k>@postdecrexpr</k> - <v>42037</v> + <v>42038</v> </e> <e> <k>@preincrexpr</k> - <v>70577</v> + <v>70578</v> </e> <e> <k>@predecrexpr</k> @@ -510,87 +510,87 @@ </e> <e> <k>@conditionalexpr</k> - <v>657271</v> + <v>657281</v> </e> <e> <k>@addexpr</k> - <v>398414</v> + <v>398421</v> </e> <e> <k>@subexpr</k> - <v>340775</v> + <v>340781</v> </e> <e> <k>@mulexpr</k> - <v>306372</v> + <v>306377</v> </e> <e> <k>@divexpr</k> - <v>133173</v> + <v>133175</v> </e> <e> <k>@remexpr</k> - <v>15618</v> + <v>15609</v> </e> <e> <k>@paddexpr</k> - <v>86666</v> + <v>86668</v> </e> <e> <k>@psubexpr</k> - <v>49902</v> + <v>49903</v> </e> <e> <k>@pdiffexpr</k> - <v>35178</v> + <v>33697</v> </e> <e> <k>@lshiftexpr</k> - <v>566331</v> + <v>566340</v> </e> <e> <k>@rshiftexpr</k> - <v>140847</v> + <v>140849</v> </e> <e> <k>@andexpr</k> - <v>489081</v> + <v>489088</v> </e> <e> <k>@orexpr</k> - <v>145472</v> + <v>145475</v> </e> <e> <k>@xorexpr</k> - <v>54177</v> + <v>54178</v> </e> <e> <k>@eqexpr</k> - <v>470674</v> + <v>470681</v> </e> <e> <k>@neexpr</k> - <v>301682</v> + <v>301687</v> </e> <e> <k>@gtexpr</k> - <v>104015</v> + <v>104007</v> </e> <e> <k>@ltexpr</k> - <v>101683</v> + <v>101675</v> </e> <e> <k>@geexpr</k> - <v>59252</v> + <v>59253</v> </e> <e> <k>@leexpr</k> - <v>212537</v> + <v>212540</v> </e> <e> <k>@assignexpr</k> - <v>937004</v> + <v>937019</v> </e> <e> <k>@assignaddexpr</k> @@ -602,7 +602,7 @@ </e> <e> <k>@assignmulexpr</k> - <v>8210</v> + <v>8209</v> </e> <e> <k>@assigndivexpr</k> @@ -610,7 +610,7 @@ </e> <e> <k>@assignremexpr</k> - <v>413</v> + <v>689</v> </e> <e> <k>@assignlshiftexpr</k> @@ -626,7 +626,7 @@ </e> <e> <k>@assignorexpr</k> - <v>23654</v> + <v>23626</v> </e> <e> <k>@assignxorexpr</k> @@ -642,23 +642,23 @@ </e> <e> <k>@andlogicalexpr</k> - <v>249965</v> + <v>249969</v> </e> <e> <k>@orlogicalexpr</k> - <v>866154</v> + <v>866168</v> </e> <e> <k>@commaexpr</k> - <v>122711</v> + <v>122868</v> </e> <e> <k>@subscriptexpr</k> - <v>364880</v> + <v>364458</v> </e> <e> <k>@callexpr</k> - <v>316245</v> + <v>316218</v> </e> <e> <k>@vastartexpr</k> @@ -678,27 +678,27 @@ </e> <e> <k>@varaccess</k> - <v>6029430</v> + <v>6029528</v> </e> <e> <k>@runtime_sizeof</k> - <v>295851</v> + <v>295856</v> </e> <e> <k>@runtime_alignof</k> - <v>49186</v> + <v>49158</v> </e> <e> <k>@expr_stmt</k> - <v>94392</v> + <v>94393</v> </e> <e> <k>@routineexpr</k> - <v>3150048</v> + <v>3176148</v> </e> <e> <k>@type_operand</k> - <v>1128813</v> + <v>1128831</v> </e> <e> <k>@offsetofexpr</k> @@ -706,11 +706,11 @@ </e> <e> <k>@typescompexpr</k> - <v>563806</v> + <v>563815</v> </e> <e> <k>@literal</k> - <v>4406917</v> + <v>4406923</v> </e> <e> <k>@aggregateliteral</k> @@ -718,27 +718,27 @@ </e> <e> <k>@c_style_cast</k> - <v>4210103</v> + <v>4210086</v> </e> <e> <k>@temp_init</k> - <v>795228</v> + <v>791807</v> </e> <e> <k>@errorexpr</k> - <v>46229</v> + <v>46203</v> </e> <e> <k>@reference_to</k> - <v>1569867</v> + <v>1568970</v> </e> <e> <k>@ref_indirect</k> - <v>1906417</v> + <v>1905327</v> </e> <e> <k>@vacuous_destructor_call</k> - <v>8035</v> + <v>8030</v> </e> <e> <k>@assume</k> @@ -794,35 +794,35 @@ </e> <e> <k>@thisaccess</k> - <v>1117561</v> + <v>1117527</v> </e> <e> <k>@new_expr</k> - <v>46995</v> + <v>46968</v> </e> <e> <k>@delete_expr</k> - <v>11618</v> + <v>11611</v> </e> <e> <k>@throw_expr</k> - <v>21053</v> + <v>21048</v> </e> <e> <k>@condition_decl</k> - <v>40753</v> + <v>40577</v> </e> <e> <k>@braced_init_list</k> - <v>1064</v> + <v>1060</v> </e> <e> <k>@type_id</k> - <v>35968</v> + <v>35947</v> </e> <e> <k>@sizeof_pack</k> - <v>5597</v> + <v>5596</v> </e> <e> <k>@hasassignexpr</k> @@ -866,7 +866,7 @@ </e> <e> <k>@isabstractexpr</k> - <v>19</v> + <v>18</v> </e> <e> <k>@isbaseofexpr</k> @@ -878,7 +878,7 @@ </e> <e> <k>@isconvtoexpr</k> - <v>206</v> + <v>197</v> </e> <e> <k>@isemptyexpr</k> @@ -886,7 +886,7 @@ </e> <e> <k>@isenumexpr</k> - <v>517</v> + <v>492</v> </e> <e> <k>@ispodexpr</k> @@ -910,7 +910,7 @@ </e> <e> <k>@uuidof</k> - <v>20293</v> + <v>20292</v> </e> <e> <k>@delete_array_expr</k> @@ -926,43 +926,43 @@ </e> <e> <k>@ctordirectinit</k> - <v>111383</v> + <v>111319</v> </e> <e> <k>@ctorvirtualinit</k> - <v>6320</v> + <v>6318</v> </e> <e> <k>@ctorfieldinit</k> - <v>198277</v> + <v>198163</v> </e> <e> <k>@ctordelegatinginit</k> - <v>3304</v> + <v>3302</v> </e> <e> <k>@dtordirectdestruct</k> - <v>41220</v> + <v>41197</v> </e> <e> <k>@dtorvirtualdestruct</k> - <v>4069</v> + <v>4067</v> </e> <e> <k>@dtorfielddestruct</k> - <v>41116</v> + <v>41092</v> </e> <e> <k>@static_cast</k> - <v>214369</v> + <v>214320</v> </e> <e> <k>@reinterpret_cast</k> - <v>30729</v> + <v>31628</v> </e> <e> <k>@const_cast</k> - <v>34971</v> + <v>34584</v> </e> <e> <k>@dynamic_cast</k> @@ -970,11 +970,11 @@ </e> <e> <k>@lambdaexpr</k> - <v>21456</v> + <v>21454</v> </e> <e> <k>@param_ref</k> - <v>235847</v> + <v>234832</v> </e> <e> <k>@noopexpr</k> @@ -982,7 +982,7 @@ </e> <e> <k>@istriviallyconstructibleexpr</k> - <v>1345</v> + <v>1280</v> </e> <e> <k>@isdestructibleexpr</k> @@ -994,7 +994,7 @@ </e> <e> <k>@istriviallydestructibleexpr</k> - <v>827</v> + <v>788</v> </e> <e> <k>@istriviallyassignableexpr</k> @@ -1002,7 +1002,7 @@ </e> <e> <k>@isnothrowassignableexpr</k> - <v>4138</v> + <v>3941</v> </e> <e> <k>@istrivialexpr</k> @@ -1038,7 +1038,7 @@ </e> <e> <k>@isnothrowconstructibleexpr</k> - <v>14278</v> + <v>13597</v> </e> <e> <k>@hasfinalizerexpr</k> @@ -1074,11 +1074,11 @@ </e> <e> <k>@isfinalexpr</k> - <v>1669</v> + <v>1668</v> </e> <e> <k>@noexceptexpr</k> - <v>24664</v> + <v>24558</v> </e> <e> <k>@builtinshufflevector</k> @@ -1090,7 +1090,7 @@ </e> <e> <k>@builtinaddressof</k> - <v>13114</v> + <v>13106</v> </e> <e> <k>@vec_fill</k> @@ -1110,11 +1110,11 @@ </e> <e> <k>@co_await</k> - <v>6</v> + <v>12</v> </e> <e> <k>@co_yield</k> - <v>1</v> + <v>4</v> </e> <e> <k>@isassignable</k> @@ -1250,67 +1250,143 @@ </e> <e> <k>@reuseexpr</k> - <v>333955</v> + <v>372471</v> + </e> + <e> + <k>@istriviallycopyassignable</k> + <v>2</v> + </e> + <e> + <k>@isassignablenopreconditioncheck</k> + <v>3</v> + </e> + <e> + <k>@referencebindstotemporary</k> + <v>2</v> + </e> + <e> + <k>@issameas</k> + <v>2</v> + </e> + <e> + <k>@builtinhasattribute</k> + <v>2</v> + </e> + <e> + <k>@ispointerinterconvertiblewithclass</k> + <v>2</v> + </e> + <e> + <k>@builtinispointerinterconvertiblewithclass</k> + <v>2</v> + </e> + <e> + <k>@iscorrespondingmember</k> + <v>2</v> + </e> + <e> + <k>@builtiniscorrespondingmember</k> + <v>2</v> + </e> + <e> + <k>@isboundedarray</k> + <v>2</v> + </e> + <e> + <k>@isunboundedarray</k> + <v>2</v> + </e> + <e> + <k>@isreferenceable</k> + <v>2</v> + </e> + <e> + <k>@isnothrowconvertible</k> + <v>2</v> + </e> + <e> + <k>@referenceconstructsfromtemporary</k> + <v>2</v> + </e> + <e> + <k>@referenceconvertsfromtemporary</k> + <v>2</v> + </e> + <e> + <k>@isconvertible</k> + <v>2</v> + </e> + <e> + <k>@isvalidwinrttype</k> + <v>1</v> + </e> + <e> + <k>@iswinclass</k> + <v>1</v> + </e> + <e> + <k>@iswininterface</k> + <v>1</v> </e> <e> <k>@lambdacapture</k> - <v>27986</v> + <v>27983</v> </e> <e> <k>@stmt_expr</k> - <v>1486099</v> + <v>1486124</v> </e> <e> <k>@stmt_if</k> - <v>725951</v> + <v>725963</v> </e> <e> <k>@stmt_while</k> - <v>29141</v> + <v>29134</v> </e> <e> <k>@stmt_goto</k> - <v>110696</v> + <v>110698</v> </e> <e> <k>@stmt_label</k> - <v>53144</v> + <v>53145</v> </e> <e> <k>@stmt_return</k> - <v>1285039</v> + <v>1284930</v> </e> <e> <k>@stmt_block</k> - <v>1424038</v> + <v>1423917</v> </e> <e> <k>@stmt_end_test_while</k> - <v>148881</v> + <v>148884</v> </e> <e> <k>@stmt_for</k> - <v>61559</v> + <v>61560</v> </e> <e> <k>@stmt_switch_case</k> - <v>207702</v> + <v>206808</v> </e> <e> <k>@stmt_switch</k> - <v>20787</v> + <v>20788</v> </e> <e> <k>@stmt_asm</k> - <v>109988</v> + <v>109990</v> </e> <e> <k>@stmt_decl</k> - <v>588988</v> + <v>588851</v> </e> <e> <k>@stmt_empty</k> - <v>191895</v> + <v>192673</v> </e> <e> <k>@stmt_continue</k> @@ -1318,11 +1394,11 @@ </e> <e> <k>@stmt_break</k> - <v>103193</v> + <v>103190</v> </e> <e> <k>@stmt_try_block</k> - <v>45069</v> + <v>44876</v> </e> <e> <k>@stmt_microsoft_try</k> @@ -1346,51 +1422,51 @@ </e> <e> <k>@stmt_handler</k> - <v>62736</v> + <v>62466</v> </e> <e> <k>@stmt_constexpr_if</k> - <v>52043</v> + <v>53108</v> </e> <e> <k>@stmt_co_return</k> - <v>2</v> + <v>5</v> </e> <e> <k>@ppd_if</k> - <v>666541</v> + <v>666484</v> </e> <e> <k>@ppd_ifdef</k> - <v>263071</v> + <v>263049</v> </e> <e> <k>@ppd_ifndef</k> - <v>266336</v> + <v>266314</v> </e> <e> <k>@ppd_elif</k> - <v>25187</v> + <v>25185</v> </e> <e> <k>@ppd_else</k> - <v>208964</v> + <v>208946</v> </e> <e> <k>@ppd_endif</k> - <v>1195950</v> + <v>1195848</v> </e> <e> <k>@ppd_plain_include</k> - <v>311114</v> + <v>311088</v> </e> <e> <k>@ppd_define</k> - <v>2407258</v> + <v>2292433</v> </e> <e> <k>@ppd_undef</k> - <v>258407</v> + <v>258385</v> </e> <e> <k>@ppd_include_next</k> @@ -1398,15 +1474,15 @@ </e> <e> <k>@ppd_line</k> - <v>27551</v> + <v>27519</v> </e> <e> <k>@ppd_error</k> - <v>103</v> + <v>98</v> </e> <e> <k>@ppd_pragma</k> - <v>311642</v> + <v>296776</v> </e> <e> <k>@ppd_objc_import</k> @@ -1418,7 +1494,7 @@ </e> <e> <k>@link_target</k> - <v>817</v> + <v>814</v> </e> <e> <k>@xmldtd</k> @@ -1436,23 +1512,23 @@ <k>@xmlnamespace</k> <v>4185</v> </e> - <e> - <k>@xmlcharacters</k> - <v>439958</v> - </e> <e> <k>@xmlcomment</k> <v>26812</v> </e> + <e> + <k>@xmlcharacters</k> + <v>439958</v> + </e> </typesizes> <stats> <relation> <name>compilations</name> - <cardinality>9654</cardinality> + <cardinality>9651</cardinality> <columnsizes> <e> <k>id</k> - <v>9654</v> + <v>9651</v> </e> <e> <k>cwd</k> @@ -1470,7 +1546,7 @@ <b> <a>1</a> <b>2</b> - <v>9654</v> + <v>9651</v> </b> </bs> </hist> @@ -1496,7 +1572,7 @@ </relation> <relation> <name>compilation_args</name> - <cardinality>652584</cardinality> + <cardinality>652594</cardinality> <columnsizes> <e> <k>id</k> @@ -1508,7 +1584,7 @@ </e> <e> <k>arg</k> - <v>34462</v> + <v>34463</v> </e> </columnsizes> <dependencies> @@ -1751,7 +1827,7 @@ <b> <a>2</a> <b>1043</b> - <v>2063</v> + <v>2064</v> </b> </bs> </hist> @@ -1910,7 +1986,7 @@ <b> <a>1</a> <b>2</b> - <v>1757</v> + <v>1758</v> </b> <b> <a>2</a> @@ -1946,7 +2022,7 @@ <b> <a>1</a> <b>2</b> - <v>1757</v> + <v>1758</v> </b> <b> <a>2</a> @@ -2044,7 +2120,7 @@ </e> <e> <k>seconds</k> - <v>9748</v> + <v>9948</v> </e> </columnsizes> <dependencies> @@ -2134,38 +2210,38 @@ </b> <b> <a>5</a> - <b>7</b> - <v>119</v> + <b>8</b> + <v>159</v> </b> <b> - <a>8</a> + <a>9</a> <b>10</b> <v>159</v> </b> <b> <a>10</a> <b>11</b> - <v>79</v> + <v>119</v> </b> <b> <a>11</a> - <b>12</b> - <v>159</v> + <b>14</b> + <v>119</v> </b> <b> - <a>12</a> - <b>17</b> + <a>16</a> + <b>18</b> <v>159</v> </b> <b> - <a>18</a> - <b>22</b> + <a>19</a> + <b>27</b> <v>159</v> </b> <b> - <a>25</a> - <b>98</b> - <v>159</v> + <a>38</a> + <b>96</b> + <v>119</v> </b> </bs> </hist> @@ -2181,7 +2257,7 @@ <b> <a>1</a> <b>2</b> - <v>1757</v> + <v>1758</v> </b> <b> <a>2</a> @@ -2233,12 +2309,12 @@ <b> <a>3</a> <b>4</b> - <v>1438</v> + <v>1318</v> </b> <b> <a>4</a> <b>5</b> - <v>319</v> + <v>439</v> </b> <b> <a>5</a> @@ -2248,27 +2324,27 @@ <b> <a>6</a> <b>7</b> - <v>479</v> + <v>399</v> </b> <b> <a>7</a> <b>8</b> - <v>119</v> + <v>159</v> </b> <b> <a>8</a> - <b>10</b> - <v>279</v> + <b>9</b> + <v>239</v> </b> <b> - <a>10</a> - <b>26</b> - <v>239</v> + <a>9</a> + <b>23</b> + <v>279</v> </b> <b> - <a>26</a> - <b>84</b> - <v>239</v> + <a>25</a> + <b>92</b> + <v>279</v> </b> </bs> </hist> @@ -2316,16 +2392,21 @@ <b> <a>3</a> <b>4</b> - <v>79</v> + <v>39</v> </b> <b> - <a>137</a> - <b>138</b> + <a>4</a> + <b>5</b> <v>39</v> </b> <b> - <a>142</a> - <b>143</b> + <a>136</a> + <b>137</b> + <v>39</v> + </b> + <b> + <a>145</a> + <b>146</b> <v>39</v> </b> </bs> @@ -2342,27 +2423,27 @@ <b> <a>1</a> <b>2</b> - <v>4994</v> + <v>4954</v> </b> <b> <a>2</a> <b>3</b> - <v>2117</v> + <v>2796</v> </b> <b> <a>3</a> <b>4</b> - <v>1278</v> + <v>1118</v> </b> <b> <a>4</a> - <b>5</b> - <v>958</v> + <b>6</b> + <v>918</v> </b> <b> - <a>5</a> + <a>7</a> <b>47</b> - <v>399</v> + <v>159</v> </b> </bs> </hist> @@ -2378,32 +2459,32 @@ <b> <a>1</a> <b>2</b> - <v>4554</v> + <v>4235</v> </b> <b> <a>2</a> <b>3</b> - <v>1997</v> + <v>2317</v> </b> <b> <a>3</a> <b>4</b> - <v>1238</v> + <v>1358</v> </b> <b> <a>4</a> <b>5</b> - <v>839</v> + <v>1158</v> </b> <b> <a>5</a> - <b>7</b> - <v>878</v> + <b>12</b> + <v>759</v> </b> <b> - <a>7</a> - <b>74</b> - <v>239</v> + <a>26</a> + <b>75</b> + <v>119</v> </b> </bs> </hist> @@ -2419,12 +2500,12 @@ <b> <a>1</a> <b>2</b> - <v>8110</v> + <v>8390</v> </b> <b> <a>2</a> <b>3</b> - <v>1638</v> + <v>1558</v> </b> </bs> </hist> @@ -2434,23 +2515,23 @@ </relation> <relation> <name>diagnostic_for</name> - <cardinality>5457</cardinality> + <cardinality>5434</cardinality> <columnsizes> <e> <k>diagnostic</k> - <v>5001</v> + <v>4979</v> </e> <e> <k>compilation</k> - <v>817</v> + <v>814</v> </e> <e> <k>file_number</k> - <v>19</v> + <v>18</v> </e> <e> <k>file_number_diagnostic_number</k> - <v>399</v> + <v>397</v> </e> </columnsizes> <dependencies> @@ -2464,12 +2545,12 @@ <b> <a>1</a> <b>2</b> - <v>4849</v> + <v>4828</v> </b> <b> <a>2</a> <b>7</b> - <v>152</v> + <v>151</v> </b> </bs> </hist> @@ -2485,7 +2566,7 @@ <b> <a>1</a> <b>2</b> - <v>5001</v> + <v>4979</v> </b> </bs> </hist> @@ -2501,7 +2582,7 @@ <b> <a>1</a> <b>2</b> - <v>5001</v> + <v>4979</v> </b> </bs> </hist> @@ -2517,27 +2598,27 @@ <b> <a>5</a> <b>6</b> - <v>608</v> + <v>605</v> </b> <b> <a>7</a> <b>8</b> - <v>76</v> + <v>75</v> </b> <b> <a>9</a> <b>12</b> - <v>57</v> + <v>56</v> </b> <b> <a>13</a> <b>16</b> - <v>38</v> + <v>37</v> </b> <b> <a>21</a> <b>22</b> - <v>38</v> + <v>37</v> </b> </bs> </hist> @@ -2553,7 +2634,7 @@ <b> <a>1</a> <b>2</b> - <v>817</v> + <v>814</v> </b> </bs> </hist> @@ -2569,27 +2650,27 @@ <b> <a>5</a> <b>6</b> - <v>608</v> + <v>605</v> </b> <b> <a>7</a> <b>8</b> - <v>76</v> + <v>75</v> </b> <b> <a>9</a> <b>12</b> - <v>57</v> + <v>56</v> </b> <b> <a>13</a> <b>16</b> - <v>38</v> + <v>37</v> </b> <b> <a>21</a> <b>22</b> - <v>38</v> + <v>37</v> </b> </bs> </hist> @@ -2605,7 +2686,7 @@ <b> <a>263</a> <b>264</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -2621,7 +2702,7 @@ <b> <a>43</a> <b>44</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -2637,7 +2718,7 @@ <b> <a>21</a> <b>22</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -2653,42 +2734,42 @@ <b> <a>2</a> <b>3</b> - <v>114</v> + <v>113</v> </b> <b> <a>3</a> <b>4</b> - <v>38</v> + <v>37</v> </b> <b> <a>4</a> <b>5</b> - <v>38</v> + <v>37</v> </b> <b> <a>5</a> <b>6</b> - <v>38</v> + <v>37</v> </b> <b> <a>7</a> <b>8</b> - <v>38</v> + <v>37</v> </b> <b> <a>11</a> <b>12</b> - <v>38</v> + <v>37</v> </b> <b> <a>37</a> <b>38</b> - <v>76</v> + <v>75</v> </b> <b> <a>43</a> <b>44</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -2704,37 +2785,37 @@ <b> <a>2</a> <b>3</b> - <v>114</v> + <v>113</v> </b> <b> <a>3</a> <b>4</b> - <v>38</v> + <v>37</v> </b> <b> <a>4</a> <b>5</b> - <v>38</v> + <v>37</v> </b> <b> <a>5</a> <b>6</b> - <v>38</v> + <v>37</v> </b> <b> <a>7</a> <b>8</b> - <v>38</v> + <v>37</v> </b> <b> <a>11</a> <b>12</b> - <v>38</v> + <v>37</v> </b> <b> <a>43</a> <b>44</b> - <v>95</v> + <v>94</v> </b> </bs> </hist> @@ -2750,7 +2831,7 @@ <b> <a>1</a> <b>2</b> - <v>399</v> + <v>397</v> </b> </bs> </hist> @@ -2760,19 +2841,19 @@ </relation> <relation> <name>compilation_finished</name> - <cardinality>9654</cardinality> + <cardinality>9651</cardinality> <columnsizes> <e> <k>id</k> - <v>9654</v> + <v>9651</v> </e> <e> <k>cpu_seconds</k> - <v>7763</v> + <v>6990</v> </e> <e> <k>elapsed_seconds</k> - <v>145</v> + <v>134</v> </e> </columnsizes> <dependencies> @@ -2786,7 +2867,7 @@ <b> <a>1</a> <b>2</b> - <v>9654</v> + <v>9651</v> </b> </bs> </hist> @@ -2802,7 +2883,7 @@ <b> <a>1</a> <b>2</b> - <v>9654</v> + <v>9651</v> </b> </bs> </hist> @@ -2818,17 +2899,17 @@ <b> <a>1</a> <b>2</b> - <v>6510</v> + <v>5457</v> </b> <b> <a>2</a> <b>3</b> - <v>872</v> + <v>1073</v> </b> <b> <a>3</a> - <b>14</b> - <v>380</v> + <b>16</b> + <v>458</v> </b> </bs> </hist> @@ -2844,12 +2925,12 @@ <b> <a>1</a> <b>2</b> - <v>7461</v> + <v>6341</v> </b> <b> <a>2</a> <b>3</b> - <v>302</v> + <v>648</v> </b> </bs> </hist> @@ -2865,17 +2946,7 @@ <b> <a>2</a> <b>3</b> - <v>22</v> - </b> - <b> - <a>3</a> - <b>4</b> - <v>11</v> - </b> - <b> - <a>6</a> - <b>7</b> - <v>11</v> + <v>33</v> </b> <b> <a>7</a> @@ -2888,38 +2959,38 @@ <v>11</v> </b> <b> - <a>9</a> - <b>10</b> + <a>10</a> + <b>11</b> <v>11</v> </b> <b> - <a>37</a> - <b>38</b> + <a>11</a> + <b>12</b> <v>11</v> </b> <b> - <a>47</a> - <b>48</b> + <a>54</a> + <b>55</b> <v>11</v> </b> <b> - <a>118</a> - <b>119</b> + <a>156</a> + <b>157</b> <v>11</v> </b> <b> - <a>140</a> - <b>141</b> + <a>173</a> + <b>174</b> <v>11</v> </b> <b> - <a>229</a> - <b>230</b> + <a>177</a> + <b>178</b> <v>11</v> </b> <b> - <a>255</a> - <b>256</b> + <a>261</a> + <b>262</b> <v>11</v> </b> </bs> @@ -2936,17 +3007,7 @@ <b> <a>2</a> <b>3</b> - <v>22</v> - </b> - <b> - <a>3</a> - <b>4</b> - <v>11</v> - </b> - <b> - <a>6</a> - <b>7</b> - <v>11</v> + <v>33</v> </b> <b> <a>7</a> @@ -2959,38 +3020,38 @@ <v>11</v> </b> <b> - <a>9</a> - <b>10</b> + <a>10</a> + <b>11</b> <v>11</v> </b> <b> - <a>37</a> - <b>38</b> + <a>11</a> + <b>12</b> <v>11</v> </b> <b> - <a>47</a> - <b>48</b> + <a>48</a> + <b>49</b> <v>11</v> </b> <b> - <a>97</a> - <b>98</b> + <a>109</a> + <b>110</b> <v>11</v> </b> <b> - <a>112</a> - <b>113</b> + <a>120</a> + <b>121</b> <v>11</v> </b> <b> - <a>183</a> - <b>184</b> + <a>132</a> + <b>133</b> <v>11</v> </b> <b> - <a>208</a> - <b>209</b> + <a>232</a> + <b>233</b> <v>11</v> </b> </bs> @@ -4763,31 +4824,31 @@ </relation> <relation> <name>locations_default</name> - <cardinality>29787737</cardinality> + <cardinality>29785199</cardinality> <columnsizes> <e> <k>id</k> - <v>29787737</v> + <v>29785199</v> </e> <e> <k>container</k> - <v>123139</v> + <v>123129</v> </e> <e> <k>startLine</k> - <v>2093378</v> + <v>2093200</v> </e> <e> <k>startColumn</k> - <v>36848</v> + <v>36845</v> </e> <e> <k>endLine</k> - <v>2097576</v> + <v>2097398</v> </e> <e> <k>endColumn</k> - <v>48043</v> + <v>48039</v> </e> </columnsizes> <dependencies> @@ -4801,7 +4862,7 @@ <b> <a>1</a> <b>2</b> - <v>29787737</v> + <v>29785199</v> </b> </bs> </hist> @@ -4817,7 +4878,7 @@ <b> <a>1</a> <b>2</b> - <v>29787737</v> + <v>29785199</v> </b> </bs> </hist> @@ -4833,7 +4894,7 @@ <b> <a>1</a> <b>2</b> - <v>29787737</v> + <v>29785199</v> </b> </bs> </hist> @@ -4849,7 +4910,7 @@ <b> <a>1</a> <b>2</b> - <v>29787737</v> + <v>29785199</v> </b> </bs> </hist> @@ -4865,7 +4926,7 @@ <b> <a>1</a> <b>2</b> - <v>29787737</v> + <v>29785199</v> </b> </bs> </hist> @@ -4881,62 +4942,62 @@ <b> <a>1</a> <b>11</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>11</a> <b>18</b> - <v>10261</v> + <v>10260</v> </b> <b> <a>18</a> <b>30</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>30</a> <b>42</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>43</a> <b>61</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>61</a> <b>79</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>80</a> <b>106</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>109</a> <b>149</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>149</a> <b>199</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>206</a> <b>292</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>305</a> <b>469</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>482</a> <b>850</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>939</a> @@ -4957,67 +5018,67 @@ <b> <a>1</a> <b>8</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>8</a> <b>13</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>13</a> <b>20</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>20</a> <b>32</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>32</a> <b>43</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>44</a> <b>61</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>62</a> <b>72</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>73</a> <b>93</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>97</a> <b>128</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>128</a> <b>180</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>180</a> <b>267</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>277</a> <b>414</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>439</a> <b>1465</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>1557</a> @@ -5038,62 +5099,62 @@ <b> <a>1</a> <b>4</b> - <v>8862</v> + <v>8861</v> </b> <b> <a>4</a> <b>5</b> - <v>7929</v> + <v>7928</v> </b> <b> <a>5</a> <b>6</b> - <v>7463</v> + <v>7462</v> </b> <b> <a>6</a> <b>8</b> - <v>11194</v> + <v>11193</v> </b> <b> <a>8</a> <b>10</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>10</a> <b>15</b> - <v>10728</v> + <v>10727</v> </b> <b> <a>15</a> <b>23</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>23</a> <b>28</b> - <v>11194</v> + <v>11193</v> </b> <b> <a>28</a> <b>34</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>34</a> <b>44</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>44</a> <b>55</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>55</a> <b>66</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>66</a> @@ -5114,67 +5175,67 @@ <b> <a>1</a> <b>8</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>8</a> <b>13</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>13</a> <b>20</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>20</a> <b>32</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>32</a> <b>43</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>43</a> <b>60</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>61</a> <b>71</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>72</a> <b>93</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>94</a> <b>127</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>128</a> <b>179</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>180</a> <b>268</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>278</a> <b>413</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>437</a> <b>1465</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>1554</a> @@ -5195,67 +5256,67 @@ <b> <a>1</a> <b>9</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>9</a> <b>13</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>13</a> <b>18</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>18</a> <b>26</b> - <v>10261</v> + <v>10260</v> </b> <b> <a>27</a> <b>33</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>33</a> <b>39</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>39</a> <b>47</b> - <v>10261</v> + <v>10260</v> </b> <b> <a>47</a> <b>54</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>54</a> <b>60</b> - <v>10261</v> + <v>10260</v> </b> <b> <a>60</a> <b>66</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>66</a> <b>74</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>74</a> <b>78</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>78</a> <b>90</b> - <v>6996</v> + <v>6995</v> </b> </bs> </hist> @@ -5271,52 +5332,52 @@ <b> <a>1</a> <b>2</b> - <v>581183</v> + <v>581133</v> </b> <b> <a>2</a> <b>3</b> - <v>314846</v> + <v>314819</v> </b> <b> <a>3</a> <b>4</b> - <v>194971</v> + <v>194954</v> </b> <b> <a>4</a> <b>6</b> - <v>162320</v> + <v>162306</v> </b> <b> <a>6</a> <b>10</b> - <v>183310</v> + <v>183294</v> </b> <b> <a>10</a> <b>16</b> - <v>161854</v> + <v>161840</v> </b> <b> <a>16</a> <b>25</b> - <v>168384</v> + <v>168370</v> </b> <b> <a>25</a> <b>45</b> - <v>157189</v> + <v>157176</v> </b> <b> <a>45</a> <b>160</b> - <v>157656</v> + <v>157643</v> </b> <b> <a>160</a> <b>265</b> - <v>11660</v> + <v>11659</v> </b> </bs> </hist> @@ -5332,42 +5393,42 @@ <b> <a>1</a> <b>2</b> - <v>870375</v> + <v>870301</v> </b> <b> <a>2</a> <b>3</b> - <v>273333</v> + <v>273310</v> </b> <b> <a>3</a> <b>5</b> - <v>193572</v> + <v>193555</v> </b> <b> <a>5</a> <b>8</b> - <v>173515</v> + <v>173500</v> </b> <b> <a>8</a> <b>13</b> - <v>187974</v> + <v>187958</v> </b> <b> <a>13</a> <b>20</b> - <v>160921</v> + <v>160907</v> </b> <b> <a>20</a> <b>51</b> - <v>159522</v> + <v>159508</v> </b> <b> <a>51</a> <b>265</b> - <v>74163</v> + <v>74157</v> </b> </bs> </hist> @@ -5383,47 +5444,47 @@ <b> <a>1</a> <b>2</b> - <v>611501</v> + <v>611449</v> </b> <b> <a>2</a> <b>3</b> - <v>312980</v> + <v>312954</v> </b> <b> <a>3</a> <b>4</b> - <v>198236</v> + <v>198219</v> </b> <b> <a>4</a> <b>6</b> - <v>182844</v> + <v>182828</v> </b> <b> <a>6</a> <b>9</b> - <v>173048</v> + <v>173034</v> </b> <b> <a>9</a> <b>13</b> - <v>163253</v> + <v>163239</v> </b> <b> <a>13</a> <b>19</b> - <v>173981</v> + <v>173966</v> </b> <b> <a>19</a> <b>29</b> - <v>165119</v> + <v>165105</v> </b> <b> <a>29</a> <b>52</b> - <v>112411</v> + <v>112402</v> </b> </bs> </hist> @@ -5439,22 +5500,22 @@ <b> <a>1</a> <b>2</b> - <v>1530386</v> + <v>1530256</v> </b> <b> <a>2</a> <b>3</b> - <v>348430</v> + <v>348400</v> </b> <b> <a>3</a> <b>5</b> - <v>161854</v> + <v>161840</v> </b> <b> <a>5</a> <b>16</b> - <v>52707</v> + <v>52703</v> </b> </bs> </hist> @@ -5470,47 +5531,47 @@ <b> <a>1</a> <b>2</b> - <v>585847</v> + <v>585797</v> </b> <b> <a>2</a> <b>3</b> - <v>316245</v> + <v>316218</v> </b> <b> <a>3</a> <b>4</b> - <v>197770</v> + <v>197753</v> </b> <b> <a>4</a> <b>6</b> - <v>168384</v> + <v>168370</v> </b> <b> <a>6</a> <b>10</b> - <v>191706</v> + <v>191690</v> </b> <b> <a>10</a> <b>15</b> - <v>165585</v> + <v>165571</v> </b> <b> <a>15</a> <b>22</b> - <v>167918</v> + <v>167903</v> </b> <b> <a>22</a> <b>34</b> - <v>164186</v> + <v>164172</v> </b> <b> <a>34</a> <b>66</b> - <v>135733</v> + <v>135722</v> </b> </bs> </hist> @@ -5612,7 +5673,7 @@ <b> <a>23</a> <b>35</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>38</a> @@ -5632,7 +5693,7 @@ <b> <a>73</a> <b>84</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>84</a> @@ -5642,12 +5703,12 @@ <b> <a>96</a> <b>101</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>101</a> <b>105</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>107</a> @@ -5850,12 +5911,12 @@ <b> <a>7</a> <b>11</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>11</a> <b>16</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>16</a> @@ -5865,7 +5926,7 @@ <b> <a>22</a> <b>24</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>24</a> @@ -5875,12 +5936,12 @@ <b> <a>29</a> <b>34</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>34</a> <b>41</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>41</a> @@ -5921,52 +5982,52 @@ <b> <a>1</a> <b>2</b> - <v>591444</v> + <v>591394</v> </b> <b> <a>2</a> <b>3</b> - <v>306916</v> + <v>306890</v> </b> <b> <a>3</a> <b>4</b> - <v>198236</v> + <v>198219</v> </b> <b> <a>4</a> <b>6</b> - <v>159522</v> + <v>159508</v> </b> <b> <a>6</a> <b>10</b> - <v>182844</v> + <v>182828</v> </b> <b> <a>10</a> <b>16</b> - <v>160455</v> + <v>160441</v> </b> <b> <a>16</a> <b>25</b> - <v>170716</v> + <v>170702</v> </b> <b> <a>25</a> <b>45</b> - <v>158122</v> + <v>158109</v> </b> <b> <a>45</a> <b>160</b> - <v>158122</v> + <v>158109</v> </b> <b> <a>160</a> <b>265</b> - <v>11194</v> + <v>11193</v> </b> </bs> </hist> @@ -5982,47 +6043,47 @@ <b> <a>1</a> <b>2</b> - <v>885767</v> + <v>885692</v> </b> <b> <a>2</a> <b>3</b> - <v>259806</v> + <v>259784</v> </b> <b> <a>3</a> <b>4</b> - <v>125005</v> + <v>124995</v> </b> <b> <a>4</a> <b>6</b> - <v>140864</v> + <v>140852</v> </b> <b> <a>6</a> <b>10</b> - <v>184709</v> + <v>184694</v> </b> <b> <a>10</a> <b>15</b> - <v>168384</v> + <v>168370</v> </b> <b> <a>15</a> <b>26</b> - <v>163253</v> + <v>163239</v> </b> <b> <a>26</a> <b>120</b> - <v>158122</v> + <v>158109</v> </b> <b> <a>121</a> <b>265</b> - <v>11660</v> + <v>11659</v> </b> </bs> </hist> @@ -6038,22 +6099,22 @@ <b> <a>1</a> <b>2</b> - <v>1528054</v> + <v>1527924</v> </b> <b> <a>2</a> <b>3</b> - <v>341433</v> + <v>341404</v> </b> <b> <a>3</a> <b>5</b> - <v>170716</v> + <v>170702</v> </b> <b> <a>5</a> <b>10</b> - <v>57372</v> + <v>57367</v> </b> </bs> </hist> @@ -6069,47 +6130,47 @@ <b> <a>1</a> <b>2</b> - <v>622696</v> + <v>622643</v> </b> <b> <a>2</a> <b>3</b> - <v>303185</v> + <v>303159</v> </b> <b> <a>3</a> <b>4</b> - <v>201501</v> + <v>201484</v> </b> <b> <a>4</a> <b>6</b> - <v>183777</v> + <v>183761</v> </b> <b> <a>6</a> <b>9</b> - <v>169783</v> + <v>169769</v> </b> <b> <a>9</a> <b>13</b> - <v>166518</v> + <v>166504</v> </b> <b> <a>13</a> <b>19</b> - <v>174914</v> + <v>174899</v> </b> <b> <a>19</a> <b>29</b> - <v>160921</v> + <v>160907</v> </b> <b> <a>29</a> <b>52</b> - <v>114277</v> + <v>114267</v> </b> </bs> </hist> @@ -6125,47 +6186,47 @@ <b> <a>1</a> <b>2</b> - <v>597975</v> + <v>597924</v> </b> <b> <a>2</a> <b>3</b> - <v>306916</v> + <v>306890</v> </b> <b> <a>3</a> <b>4</b> - <v>196370</v> + <v>196354</v> </b> <b> <a>4</a> <b>6</b> - <v>169317</v> + <v>169302</v> </b> <b> <a>6</a> <b>9</b> - <v>154857</v> + <v>154844</v> </b> <b> <a>9</a> <b>14</b> - <v>168384</v> + <v>168370</v> </b> <b> <a>14</a> <b>21</b> - <v>178646</v> + <v>178630</v> </b> <b> <a>21</a> <b>32</b> - <v>163253</v> + <v>163239</v> </b> <b> <a>32</a> <b>60</b> - <v>158122</v> + <v>158109</v> </b> <b> <a>60</a> @@ -6262,7 +6323,7 @@ <b> <a>1</a> <b>2</b> - <v>5597</v> + <v>5596</v> </b> <b> <a>2</a> @@ -6338,7 +6399,7 @@ <b> <a>1</a> <b>2</b> - <v>5597</v> + <v>5596</v> </b> <b> <a>2</a> @@ -6449,17 +6510,17 @@ <b> <a>35</a> <b>39</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>39</a> <b>42</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>42</a> <b>44</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>44</a> @@ -6490,7 +6551,7 @@ <b> <a>1</a> <b>2</b> - <v>5597</v> + <v>5596</v> </b> <b> <a>2</a> @@ -6560,11 +6621,11 @@ </relation> <relation> <name>locations_stmt</name> - <cardinality>3820076</cardinality> + <cardinality>3820138</cardinality> <columnsizes> <e> <k>id</k> - <v>3820076</v> + <v>3820138</v> </e> <e> <k>container</k> @@ -6572,7 +6633,7 @@ </e> <e> <k>startLine</k> - <v>200182</v> + <v>200185</v> </e> <e> <k>startColumn</k> @@ -6580,7 +6641,7 @@ </e> <e> <k>endLine</k> - <v>194437</v> + <v>194441</v> </e> <e> <k>endColumn</k> @@ -6598,7 +6659,7 @@ <b> <a>1</a> <b>2</b> - <v>3820076</v> + <v>3820138</v> </b> </bs> </hist> @@ -6614,7 +6675,7 @@ <b> <a>1</a> <b>2</b> - <v>3820076</v> + <v>3820138</v> </b> </bs> </hist> @@ -6630,7 +6691,7 @@ <b> <a>1</a> <b>2</b> - <v>3820076</v> + <v>3820138</v> </b> </bs> </hist> @@ -6646,7 +6707,7 @@ <b> <a>1</a> <b>2</b> - <v>3820076</v> + <v>3820138</v> </b> </bs> </hist> @@ -6662,7 +6723,7 @@ <b> <a>1</a> <b>2</b> - <v>3820076</v> + <v>3820138</v> </b> </bs> </hist> @@ -7063,12 +7124,12 @@ <b> <a>1</a> <b>2</b> - <v>21576</v> + <v>21577</v> </b> <b> <a>2</a> <b>3</b> - <v>15317</v> + <v>15318</v> </b> <b> <a>3</a> @@ -7113,7 +7174,7 @@ <b> <a>37</a> <b>45</b> - <v>15111</v> + <v>15112</v> </b> <b> <a>45</a> @@ -7154,7 +7215,7 @@ <b> <a>4</a> <b>6</b> - <v>14411</v> + <v>14412</v> </b> <b> <a>6</a> @@ -7184,7 +7245,7 @@ <b> <a>29</a> <b>36</b> - <v>16017</v> + <v>16018</v> </b> <b> <a>36</a> @@ -7194,7 +7255,7 @@ <b> <a>44</a> <b>54</b> - <v>15667</v> + <v>15668</v> </b> <b> <a>54</a> @@ -7220,7 +7281,7 @@ <b> <a>2</a> <b>3</b> - <v>20876</v> + <v>20877</v> </b> <b> <a>3</a> @@ -7250,7 +7311,7 @@ <b> <a>8</a> <b>9</b> - <v>20423</v> + <v>20424</v> </b> <b> <a>9</a> @@ -7281,17 +7342,17 @@ <b> <a>1</a> <b>2</b> - <v>34650</v> + <v>34651</v> </b> <b> <a>2</a> <b>3</b> - <v>25838</v> + <v>25839</v> </b> <b> <a>3</a> <b>4</b> - <v>18467</v> + <v>18468</v> </b> <b> <a>4</a> @@ -7336,7 +7397,7 @@ <b> <a>12</a> <b>14</b> - <v>15811</v> + <v>15812</v> </b> <b> <a>14</a> @@ -7357,12 +7418,12 @@ <b> <a>1</a> <b>2</b> - <v>22173</v> + <v>22174</v> </b> <b> <a>2</a> <b>3</b> - <v>16223</v> + <v>16224</v> </b> <b> <a>3</a> @@ -7377,17 +7438,17 @@ <b> <a>6</a> <b>8</b> - <v>14720</v> + <v>14721</v> </b> <b> <a>8</a> <b>10</b> - <v>13217</v> + <v>13218</v> </b> <b> <a>10</a> <b>14</b> - <v>18323</v> + <v>18324</v> </b> <b> <a>14</a> @@ -7813,7 +7874,7 @@ <b> <a>3</a> <b>4</b> - <v>11508</v> + <v>11509</v> </b> <b> <a>4</a> @@ -7823,7 +7884,7 @@ <b> <a>6</a> <b>8</b> - <v>12517</v> + <v>12518</v> </b> <b> <a>8</a> @@ -7838,7 +7899,7 @@ <b> <a>15</a> <b>21</b> - <v>16120</v> + <v>16121</v> </b> <b> <a>21</a> @@ -7848,12 +7909,12 @@ <b> <a>27</a> <b>34</b> - <v>14967</v> + <v>14968</v> </b> <b> <a>34</a> <b>42</b> - <v>15770</v> + <v>15771</v> </b> <b> <a>42</a> @@ -7884,7 +7945,7 @@ <b> <a>2</a> <b>3</b> - <v>16161</v> + <v>16162</v> </b> <b> <a>3</a> @@ -7904,7 +7965,7 @@ <b> <a>8</a> <b>11</b> - <v>15914</v> + <v>15915</v> </b> <b> <a>11</a> @@ -7914,7 +7975,7 @@ <b> <a>16</a> <b>20</b> - <v>14617</v> + <v>14618</v> </b> <b> <a>20</a> @@ -7950,7 +8011,7 @@ <b> <a>1</a> <b>2</b> - <v>32529</v> + <v>32530</v> </b> <b> <a>2</a> @@ -8026,12 +8087,12 @@ <b> <a>2</a> <b>3</b> - <v>20423</v> + <v>20424</v> </b> <b> <a>3</a> <b>4</b> - <v>16861</v> + <v>16862</v> </b> <b> <a>4</a> @@ -8046,7 +8107,7 @@ <b> <a>6</a> <b>7</b> - <v>20464</v> + <v>20465</v> </b> <b> <a>7</a> @@ -8056,7 +8117,7 @@ <b> <a>8</a> <b>9</b> - <v>18776</v> + <v>18777</v> </b> <b> <a>9</a> @@ -8097,7 +8158,7 @@ <b> <a>3</a> <b>4</b> - <v>12558</v> + <v>12559</v> </b> <b> <a>4</a> @@ -8132,7 +8193,7 @@ <b> <a>19</a> <b>22</b> - <v>14061</v> + <v>14062</v> </b> <b> <a>22</a> @@ -8542,11 +8603,11 @@ </relation> <relation> <name>locations_expr</name> - <cardinality>13188614</cardinality> + <cardinality>13188829</cardinality> <columnsizes> <e> <k>id</k> - <v>13188614</v> + <v>13188829</v> </e> <e> <k>container</k> @@ -8554,7 +8615,7 @@ </e> <e> <k>startLine</k> - <v>192235</v> + <v>192238</v> </e> <e> <k>startColumn</k> @@ -8562,7 +8623,7 @@ </e> <e> <k>endLine</k> - <v>192214</v> + <v>192217</v> </e> <e> <k>endColumn</k> @@ -8580,7 +8641,7 @@ <b> <a>1</a> <b>2</b> - <v>13188614</v> + <v>13188829</v> </b> </bs> </hist> @@ -8596,7 +8657,7 @@ <b> <a>1</a> <b>2</b> - <v>13188614</v> + <v>13188829</v> </b> </bs> </hist> @@ -8612,7 +8673,7 @@ <b> <a>1</a> <b>2</b> - <v>13188614</v> + <v>13188829</v> </b> </bs> </hist> @@ -8628,7 +8689,7 @@ <b> <a>1</a> <b>2</b> - <v>13188614</v> + <v>13188829</v> </b> </bs> </hist> @@ -8644,7 +8705,7 @@ <b> <a>1</a> <b>2</b> - <v>13188614</v> + <v>13188829</v> </b> </bs> </hist> @@ -9065,7 +9126,7 @@ <b> <a>5</a> <b>9</b> - <v>16511</v> + <v>16512</v> </b> <b> <a>9</a> @@ -9146,7 +9207,7 @@ <b> <a>3</a> <b>4</b> - <v>11364</v> + <v>11365</v> </b> <b> <a>4</a> @@ -9161,7 +9222,7 @@ <b> <a>8</a> <b>11</b> - <v>16470</v> + <v>16471</v> </b> <b> <a>11</a> @@ -9171,7 +9232,7 @@ <b> <a>16</a> <b>21</b> - <v>16470</v> + <v>16471</v> </b> <b> <a>21</a> @@ -9186,7 +9247,7 @@ <b> <a>35</a> <b>43</b> - <v>15873</v> + <v>15874</v> </b> <b> <a>43</a> @@ -9217,7 +9278,7 @@ <b> <a>7</a> <b>11</b> - <v>16717</v> + <v>16718</v> </b> <b> <a>11</a> @@ -9257,7 +9318,7 @@ <b> <a>44</a> <b>49</b> - <v>16923</v> + <v>16924</v> </b> <b> <a>49</a> @@ -9278,17 +9339,17 @@ <b> <a>1</a> <b>2</b> - <v>102119</v> + <v>102120</v> </b> <b> <a>2</a> <b>3</b> - <v>44697</v> + <v>44698</v> </b> <b> <a>3</a> <b>4</b> - <v>27691</v> + <v>27692</v> </b> <b> <a>4</a> @@ -9334,7 +9395,7 @@ <b> <a>16</a> <b>21</b> - <v>16470</v> + <v>16471</v> </b> <b> <a>21</a> @@ -9344,7 +9405,7 @@ <b> <a>27</a> <b>33</b> - <v>16470</v> + <v>16471</v> </b> <b> <a>33</a> @@ -9354,12 +9415,12 @@ <b> <a>38</a> <b>43</b> - <v>15564</v> + <v>15565</v> </b> <b> <a>43</a> <b>47</b> - <v>14720</v> + <v>14721</v> </b> <b> <a>47</a> @@ -9775,12 +9836,12 @@ <b> <a>1</a> <b>5</b> - <v>16161</v> + <v>16162</v> </b> <b> <a>5</a> <b>9</b> - <v>16511</v> + <v>16512</v> </b> <b> <a>9</a> @@ -9790,22 +9851,22 @@ <b> <a>15</a> <b>23</b> - <v>15111</v> + <v>15112</v> </b> <b> <a>23</a> <b>32</b> - <v>15667</v> + <v>15668</v> </b> <b> <a>32</a> <b>44</b> - <v>14761</v> + <v>14762</v> </b> <b> <a>44</a> <b>60</b> - <v>14514</v> + <v>14515</v> </b> <b> <a>60</a> @@ -9861,7 +9922,7 @@ <b> <a>3</a> <b>4</b> - <v>11364</v> + <v>11365</v> </b> <b> <a>4</a> @@ -9906,7 +9967,7 @@ <b> <a>40</a> <b>49</b> - <v>14617</v> + <v>14618</v> </b> <b> <a>49</a> @@ -9927,17 +9988,17 @@ <b> <a>1</a> <b>2</b> - <v>95633</v> + <v>95635</v> </b> <b> <a>2</a> <b>3</b> - <v>50091</v> + <v>50092</v> </b> <b> <a>3</a> <b>4</b> - <v>29420</v> + <v>29421</v> </b> <b> <a>4</a> @@ -9973,7 +10034,7 @@ <b> <a>7</a> <b>11</b> - <v>16511</v> + <v>16512</v> </b> <b> <a>11</a> @@ -10003,12 +10064,12 @@ <b> <a>36</a> <b>40</b> - <v>15317</v> + <v>15318</v> </b> <b> <a>40</a> <b>44</b> - <v>16470</v> + <v>16471</v> </b> <b> <a>44</a> @@ -10039,7 +10100,7 @@ <b> <a>4</a> <b>7</b> - <v>16820</v> + <v>16821</v> </b> <b> <a>7</a> @@ -10069,12 +10130,12 @@ <b> <a>32</a> <b>38</b> - <v>17520</v> + <v>17521</v> </b> <b> <a>38</a> <b>43</b> - <v>16161</v> + <v>16162</v> </b> <b> <a>43</a> @@ -10474,23 +10535,23 @@ </relation> <relation> <name>numlines</name> - <cardinality>1382525</cardinality> + <cardinality>1382407</cardinality> <columnsizes> <e> <k>element_id</k> - <v>1375529</v> + <v>1375411</v> </e> <e> <k>num_lines</k> - <v>101683</v> + <v>101675</v> </e> <e> <k>num_code</k> - <v>84891</v> + <v>84884</v> </e> <e> <k>num_comment</k> - <v>59704</v> + <v>59699</v> </e> </columnsizes> <dependencies> @@ -10504,12 +10565,12 @@ <b> <a>1</a> <b>2</b> - <v>1368532</v> + <v>1368415</v> </b> <b> <a>2</a> <b>3</b> - <v>6996</v> + <v>6995</v> </b> </bs> </hist> @@ -10525,7 +10586,7 @@ <b> <a>1</a> <b>2</b> - <v>1369465</v> + <v>1369348</v> </b> <b> <a>2</a> @@ -10546,7 +10607,7 @@ <b> <a>1</a> <b>2</b> - <v>1375529</v> + <v>1375411</v> </b> </bs> </hist> @@ -10562,22 +10623,22 @@ <b> <a>1</a> <b>2</b> - <v>68100</v> + <v>68094</v> </b> <b> <a>2</a> <b>3</b> - <v>12127</v> + <v>12126</v> </b> <b> <a>3</a> <b>4</b> - <v>7463</v> + <v>7462</v> </b> <b> <a>4</a> <b>21</b> - <v>7929</v> + <v>7928</v> </b> <b> <a>29</a> @@ -10598,12 +10659,12 @@ <b> <a>1</a> <b>2</b> - <v>70432</v> + <v>70426</v> </b> <b> <a>2</a> <b>3</b> - <v>12127</v> + <v>12126</v> </b> <b> <a>3</a> @@ -10613,7 +10674,7 @@ <b> <a>4</a> <b>6</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>6</a> @@ -10634,22 +10695,22 @@ <b> <a>1</a> <b>2</b> - <v>69499</v> + <v>69493</v> </b> <b> <a>2</a> <b>3</b> - <v>14926</v> + <v>14924</v> </b> <b> <a>3</a> <b>4</b> - <v>10728</v> + <v>10727</v> </b> <b> <a>4</a> <b>7</b> - <v>6530</v> + <v>6529</v> </b> </bs> </hist> @@ -10665,27 +10726,27 @@ <b> <a>1</a> <b>2</b> - <v>52707</v> + <v>52703</v> </b> <b> <a>2</a> <b>3</b> - <v>14459</v> + <v>14458</v> </b> <b> <a>3</a> <b>5</b> - <v>6530</v> + <v>6529</v> </b> <b> <a>5</a> <b>42</b> - <v>6530</v> + <v>6529</v> </b> <b> <a>44</a> <b>922</b> - <v>4664</v> + <v>4663</v> </b> </bs> </hist> @@ -10701,12 +10762,12 @@ <b> <a>1</a> <b>2</b> - <v>52707</v> + <v>52703</v> </b> <b> <a>2</a> <b>3</b> - <v>16791</v> + <v>16790</v> </b> <b> <a>3</a> @@ -10716,7 +10777,7 @@ <b> <a>5</a> <b>8</b> - <v>6530</v> + <v>6529</v> </b> <b> <a>8</a> @@ -10737,17 +10798,17 @@ <b> <a>1</a> <b>2</b> - <v>53174</v> + <v>53169</v> </b> <b> <a>2</a> <b>3</b> - <v>15858</v> + <v>15857</v> </b> <b> <a>3</a> <b>5</b> - <v>7463</v> + <v>7462</v> </b> <b> <a>5</a> @@ -10757,7 +10818,7 @@ <b> <a>7</a> <b>10</b> - <v>3265</v> + <v>3264</v> </b> </bs> </hist> @@ -10773,12 +10834,12 @@ <b> <a>1</a> <b>2</b> - <v>34516</v> + <v>34513</v> </b> <b> <a>2</a> <b>3</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>3</a> @@ -10788,7 +10849,7 @@ <b> <a>4</a> <b>6</b> - <v>4664</v> + <v>4663</v> </b> <b> <a>6</a> @@ -10814,12 +10875,12 @@ <b> <a>1</a> <b>2</b> - <v>34516</v> + <v>34513</v> </b> <b> <a>2</a> <b>3</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>3</a> @@ -10829,17 +10890,17 @@ <b> <a>4</a> <b>6</b> - <v>4664</v> + <v>4663</v> </b> <b> <a>6</a> <b>8</b> - <v>4664</v> + <v>4663</v> </b> <b> <a>10</a> <b>38</b> - <v>2332</v> + <v>2331</v> </b> </bs> </hist> @@ -10855,12 +10916,12 @@ <b> <a>1</a> <b>2</b> - <v>34516</v> + <v>34513</v> </b> <b> <a>2</a> <b>3</b> - <v>9328</v> + <v>9327</v> </b> <b> <a>3</a> @@ -10870,17 +10931,17 @@ <b> <a>4</a> <b>6</b> - <v>4664</v> + <v>4663</v> </b> <b> <a>6</a> <b>10</b> - <v>4664</v> + <v>4663</v> </b> <b> <a>10</a> <b>37</b> - <v>2332</v> + <v>2331</v> </b> </bs> </hist> @@ -10890,31 +10951,31 @@ </relation> <relation> <name>diagnostics</name> - <cardinality>5001</cardinality> + <cardinality>4979</cardinality> <columnsizes> <e> <k>id</k> - <v>5001</v> + <v>4979</v> </e> <e> <k>severity</k> - <v>19</v> + <v>18</v> </e> <e> <k>error_tag</k> - <v>38</v> + <v>37</v> </e> <e> <k>error_message</k> - <v>399</v> + <v>397</v> </e> <e> <k>full_error_message</k> - <v>4202</v> + <v>4184</v> </e> <e> <k>location</k> - <v>171</v> + <v>170</v> </e> </columnsizes> <dependencies> @@ -10928,7 +10989,7 @@ <b> <a>1</a> <b>2</b> - <v>5001</v> + <v>4979</v> </b> </bs> </hist> @@ -10944,7 +11005,7 @@ <b> <a>1</a> <b>2</b> - <v>5001</v> + <v>4979</v> </b> </bs> </hist> @@ -10960,7 +11021,7 @@ <b> <a>1</a> <b>2</b> - <v>5001</v> + <v>4979</v> </b> </bs> </hist> @@ -10976,7 +11037,7 @@ <b> <a>1</a> <b>2</b> - <v>5001</v> + <v>4979</v> </b> </bs> </hist> @@ -10992,7 +11053,7 @@ <b> <a>1</a> <b>2</b> - <v>5001</v> + <v>4979</v> </b> </bs> </hist> @@ -11008,7 +11069,7 @@ <b> <a>263</a> <b>264</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11024,7 +11085,7 @@ <b> <a>2</a> <b>3</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11040,7 +11101,7 @@ <b> <a>21</a> <b>22</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11056,7 +11117,7 @@ <b> <a>221</a> <b>222</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11072,7 +11133,7 @@ <b> <a>9</a> <b>10</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11088,12 +11149,12 @@ <b> <a>43</a> <b>44</b> - <v>19</v> + <v>18</v> </b> <b> <a>220</a> <b>221</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11109,7 +11170,7 @@ <b> <a>1</a> <b>2</b> - <v>38</v> + <v>37</v> </b> </bs> </hist> @@ -11125,12 +11186,12 @@ <b> <a>1</a> <b>2</b> - <v>19</v> + <v>18</v> </b> <b> <a>20</a> <b>21</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11146,12 +11207,12 @@ <b> <a>1</a> <b>2</b> - <v>19</v> + <v>18</v> </b> <b> <a>220</a> <b>221</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11167,12 +11228,12 @@ <b> <a>1</a> <b>2</b> - <v>19</v> + <v>18</v> </b> <b> <a>8</a> <b>9</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11188,27 +11249,27 @@ <b> <a>1</a> <b>2</b> - <v>114</v> + <v>113</v> </b> <b> <a>2</a> <b>3</b> - <v>152</v> + <v>151</v> </b> <b> <a>3</a> <b>4</b> - <v>76</v> + <v>75</v> </b> <b> <a>43</a> <b>44</b> - <v>19</v> + <v>18</v> </b> <b> <a>93</a> <b>94</b> - <v>38</v> + <v>37</v> </b> </bs> </hist> @@ -11224,7 +11285,7 @@ <b> <a>1</a> <b>2</b> - <v>399</v> + <v>397</v> </b> </bs> </hist> @@ -11240,7 +11301,7 @@ <b> <a>1</a> <b>2</b> - <v>399</v> + <v>397</v> </b> </bs> </hist> @@ -11256,22 +11317,22 @@ <b> <a>1</a> <b>2</b> - <v>133</v> + <v>132</v> </b> <b> <a>2</a> <b>3</b> - <v>152</v> + <v>151</v> </b> <b> <a>3</a> <b>4</b> - <v>76</v> + <v>75</v> </b> <b> <a>93</a> <b>94</b> - <v>38</v> + <v>37</v> </b> </bs> </hist> @@ -11287,22 +11348,22 @@ <b> <a>1</a> <b>2</b> - <v>171</v> + <v>170</v> </b> <b> <a>2</a> <b>3</b> - <v>114</v> + <v>113</v> </b> <b> <a>3</a> <b>4</b> - <v>76</v> + <v>75</v> </b> <b> <a>4</a> <b>5</b> - <v>38</v> + <v>37</v> </b> </bs> </hist> @@ -11318,12 +11379,12 @@ <b> <a>1</a> <b>2</b> - <v>4183</v> + <v>4165</v> </b> <b> <a>43</a> <b>44</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11339,7 +11400,7 @@ <b> <a>1</a> <b>2</b> - <v>4202</v> + <v>4184</v> </b> </bs> </hist> @@ -11355,7 +11416,7 @@ <b> <a>1</a> <b>2</b> - <v>4202</v> + <v>4184</v> </b> </bs> </hist> @@ -11371,7 +11432,7 @@ <b> <a>1</a> <b>2</b> - <v>4202</v> + <v>4184</v> </b> </bs> </hist> @@ -11387,7 +11448,7 @@ <b> <a>1</a> <b>2</b> - <v>4202</v> + <v>4184</v> </b> </bs> </hist> @@ -11403,22 +11464,22 @@ <b> <a>6</a> <b>7</b> - <v>38</v> + <v>37</v> </b> <b> <a>22</a> <b>23</b> - <v>38</v> + <v>37</v> </b> <b> <a>41</a> <b>42</b> - <v>76</v> + <v>75</v> </b> <b> <a>43</a> <b>44</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -11434,7 +11495,7 @@ <b> <a>1</a> <b>2</b> - <v>171</v> + <v>170</v> </b> </bs> </hist> @@ -11450,7 +11511,7 @@ <b> <a>1</a> <b>2</b> - <v>171</v> + <v>170</v> </b> </bs> </hist> @@ -11466,22 +11527,22 @@ <b> <a>1</a> <b>2</b> - <v>19</v> + <v>18</v> </b> <b> <a>3</a> <b>4</b> - <v>38</v> + <v>37</v> </b> <b> <a>5</a> <b>6</b> - <v>38</v> + <v>37</v> </b> <b> <a>6</a> <b>7</b> - <v>76</v> + <v>75</v> </b> </bs> </hist> @@ -11497,22 +11558,22 @@ <b> <a>1</a> <b>2</b> - <v>19</v> + <v>18</v> </b> <b> <a>6</a> <b>7</b> - <v>38</v> + <v>37</v> </b> <b> <a>22</a> <b>23</b> - <v>38</v> + <v>37</v> </b> <b> <a>41</a> <b>42</b> - <v>76</v> + <v>75</v> </b> </bs> </hist> @@ -11522,15 +11583,15 @@ </relation> <relation> <name>files</name> - <cardinality>123139</cardinality> + <cardinality>123129</cardinality> <columnsizes> <e> <k>id</k> - <v>123139</v> + <v>123129</v> </e> <e> <k>name</k> - <v>123139</v> + <v>123129</v> </e> </columnsizes> <dependencies> @@ -11544,7 +11605,7 @@ <b> <a>1</a> <b>2</b> - <v>123139</v> + <v>123129</v> </b> </bs> </hist> @@ -11560,7 +11621,7 @@ <b> <a>1</a> <b>2</b> - <v>123139</v> + <v>123129</v> </b> </bs> </hist> @@ -11570,15 +11631,15 @@ </relation> <relation> <name>folders</name> - <cardinality>16325</cardinality> + <cardinality>16323</cardinality> <columnsizes> <e> <k>id</k> - <v>16325</v> + <v>16323</v> </e> <e> <k>name</k> - <v>16325</v> + <v>16323</v> </e> </columnsizes> <dependencies> @@ -11592,7 +11653,7 @@ <b> <a>1</a> <b>2</b> - <v>16325</v> + <v>16323</v> </b> </bs> </hist> @@ -11608,7 +11669,7 @@ <b> <a>1</a> <b>2</b> - <v>16325</v> + <v>16323</v> </b> </bs> </hist> @@ -11618,15 +11679,15 @@ </relation> <relation> <name>containerparent</name> - <cardinality>138532</cardinality> + <cardinality>138520</cardinality> <columnsizes> <e> <k>parent</k> - <v>16325</v> + <v>16323</v> </e> <e> <k>child</k> - <v>138532</v> + <v>138520</v> </e> </columnsizes> <dependencies> @@ -11640,12 +11701,12 @@ <b> <a>1</a> <b>2</b> - <v>7463</v> + <v>7462</v> </b> <b> <a>2</a> <b>3</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>3</a> @@ -11681,7 +11742,7 @@ <b> <a>1</a> <b>2</b> - <v>138532</v> + <v>138520</v> </b> </bs> </hist> @@ -11691,11 +11752,11 @@ </relation> <relation> <name>fileannotations</name> - <cardinality>5083033</cardinality> + <cardinality>5081854</cardinality> <columnsizes> <e> <k>id</k> - <v>4855</v> + <v>4853</v> </e> <e> <k>kind</k> @@ -11703,11 +11764,11 @@ </e> <e> <k>name</k> - <v>54277</v> + <v>54265</v> </e> <e> <k>value</k> - <v>45630</v> + <v>45619</v> </e> </columnsizes> <dependencies> @@ -11726,7 +11787,7 @@ <b> <a>2</a> <b>3</b> - <v>4687</v> + <v>4686</v> </b> </bs> </hist> @@ -11942,62 +12003,62 @@ <b> <a>1</a> <b>2</b> - <v>8781</v> + <v>8779</v> </b> <b> <a>2</a> <b>3</b> - <v>6163</v> + <v>6162</v> </b> <b> <a>3</a> <b>5</b> - <v>4139</v> + <v>4138</v> </b> <b> <a>5</a> <b>9</b> - <v>4228</v> + <v>4227</v> </b> <b> <a>9</a> <b>14</b> - <v>3948</v> + <v>3947</v> </b> <b> <a>14</a> <b>18</b> - <v>4139</v> + <v>4138</v> </b> <b> <a>18</a> <b>20</b> - <v>4676</v> + <v>4674</v> </b> <b> <a>20</a> <b>34</b> - <v>4183</v> + <v>4182</v> </b> <b> <a>34</a> <b>128</b> - <v>4463</v> + <v>4462</v> </b> <b> <a>128</a> <b>229</b> - <v>4083</v> + <v>4082</v> </b> <b> <a>229</a> <b>387</b> - <v>4206</v> + <v>4205</v> </b> <b> <a>387</a> <b>434</b> - <v>1264</v> + <v>1263</v> </b> </bs> </hist> @@ -12013,7 +12074,7 @@ <b> <a>1</a> <b>2</b> - <v>54277</v> + <v>54265</v> </b> </bs> </hist> @@ -12029,57 +12090,57 @@ <b> <a>1</a> <b>2</b> - <v>8792</v> + <v>8790</v> </b> <b> <a>2</a> <b>3</b> - <v>7987</v> + <v>7985</v> </b> <b> <a>3</a> <b>4</b> - <v>2539</v> + <v>2538</v> </b> <b> <a>4</a> <b>6</b> - <v>4474</v> + <v>4473</v> </b> <b> <a>6</a> <b>9</b> - <v>4094</v> + <v>4093</v> </b> <b> <a>9</a> <b>14</b> - <v>4172</v> + <v>4171</v> </b> <b> <a>14</a> <b>17</b> - <v>4094</v> + <v>4093</v> </b> <b> <a>17</a> <b>22</b> - <v>4552</v> + <v>4551</v> </b> <b> <a>22</a> <b>41</b> - <v>4172</v> + <v>4171</v> </b> <b> <a>41</a> <b>82</b> - <v>4127</v> + <v>4126</v> </b> <b> <a>82</a> <b>157</b> - <v>4071</v> + <v>4070</v> </b> <b> <a>158</a> @@ -12100,7 +12161,7 @@ <b> <a>1</a> <b>2</b> - <v>7092</v> + <v>7090</v> </b> <b> <a>2</a> @@ -12110,12 +12171,12 @@ <b> <a>5</a> <b>8</b> - <v>3300</v> + <v>3299</v> </b> <b> <a>8</a> <b>15</b> - <v>3501</v> + <v>3500</v> </b> <b> <a>15</a> @@ -12125,12 +12186,12 @@ <b> <a>17</a> <b>19</b> - <v>4105</v> + <v>4104</v> </b> <b> <a>19</a> <b>34</b> - <v>3300</v> + <v>3299</v> </b> <b> <a>34</a> @@ -12140,12 +12201,12 @@ <b> <a>189</a> <b>201</b> - <v>3579</v> + <v>3578</v> </b> <b> <a>201</a> <b>266</b> - <v>3523</v> + <v>3522</v> </b> <b> <a>266</a> @@ -12155,7 +12216,7 @@ <b> <a>322</a> <b>399</b> - <v>3915</v> + <v>3914</v> </b> <b> <a>399</a> @@ -12176,7 +12237,7 @@ <b> <a>1</a> <b>2</b> - <v>45619</v> + <v>45608</v> </b> <b> <a>2</a> @@ -12197,7 +12258,7 @@ <b> <a>1</a> <b>2</b> - <v>7114</v> + <v>7113</v> </b> <b> <a>2</a> @@ -12207,12 +12268,12 @@ <b> <a>5</a> <b>8</b> - <v>3479</v> + <v>3478</v> </b> <b> <a>8</a> <b>15</b> - <v>3523</v> + <v>3522</v> </b> <b> <a>15</a> @@ -12222,22 +12283,22 @@ <b> <a>17</a> <b>19</b> - <v>3557</v> + <v>3556</v> </b> <b> <a>19</a> <b>29</b> - <v>3479</v> + <v>3478</v> </b> <b> <a>29</a> <b>39</b> - <v>3635</v> + <v>3634</v> </b> <b> <a>39</a> <b>48</b> - <v>3579</v> + <v>3578</v> </b> <b> <a>48</a> @@ -12247,12 +12308,12 @@ <b> <a>74</a> <b>102</b> - <v>3423</v> + <v>3422</v> </b> <b> <a>102</a> <b>119</b> - <v>3568</v> + <v>3567</v> </b> <b> <a>119</a> @@ -12267,15 +12328,15 @@ </relation> <relation> <name>inmacroexpansion</name> - <cardinality>109784721</cardinality> + <cardinality>109786483</cardinality> <columnsizes> <e> <k>id</k> - <v>18028276</v> + <v>18028566</v> </e> <e> <k>inv</k> - <v>2700307</v> + <v>2700352</v> </e> </columnsizes> <dependencies> @@ -12289,37 +12350,37 @@ <b> <a>1</a> <b>3</b> - <v>1582036</v> + <v>1582063</v> </b> <b> <a>3</a> <b>5</b> - <v>1077853</v> + <v>1077870</v> </b> <b> <a>5</a> <b>6</b> - <v>1184943</v> + <v>1184962</v> </b> <b> <a>6</a> <b>7</b> - <v>4820169</v> + <v>4820246</v> </b> <b> <a>7</a> <b>8</b> - <v>6386284</v> + <v>6386387</v> </b> <b> <a>8</a> <b>9</b> - <v>2605386</v> + <v>2605427</v> </b> <b> <a>9</a> <b>21</b> - <v>371602</v> + <v>371608</v> </b> </bs> </hist> @@ -12335,32 +12396,32 @@ <b> <a>1</a> <b>2</b> - <v>378443</v> + <v>378450</v> </b> <b> <a>2</a> <b>3</b> - <v>544126</v> + <v>544144</v> </b> <b> <a>3</a> <b>4</b> - <v>351533</v> + <v>351538</v> </b> <b> <a>4</a> <b>7</b> - <v>200669</v> + <v>200672</v> </b> <b> <a>7</a> <b>8</b> - <v>207162</v> + <v>207166</v> </b> <b> <a>8</a> <b>9</b> - <v>241901</v> + <v>241904</v> </b> <b> <a>9</a> @@ -12370,22 +12431,22 @@ <b> <a>10</a> <b>11</b> - <v>325503</v> + <v>325508</v> </b> <b> <a>11</a> <b>337</b> - <v>224867</v> + <v>224861</v> </b> <b> <a>339</a> <b>423</b> - <v>206363</v> + <v>206367</v> </b> <b> <a>423</a> <b>7616</b> - <v>17525</v> + <v>17526</v> </b> </bs> </hist> @@ -12395,15 +12456,15 @@ </relation> <relation> <name>affectedbymacroexpansion</name> - <cardinality>35690892</cardinality> + <cardinality>35691465</cardinality> <columnsizes> <e> <k>id</k> - <v>5157002</v> + <v>5157087</v> </e> <e> <k>inv</k> - <v>2784914</v> + <v>2784960</v> </e> </columnsizes> <dependencies> @@ -12417,37 +12478,37 @@ <b> <a>1</a> <b>2</b> - <v>2816076</v> + <v>2816122</v> </b> <b> <a>2</a> <b>3</b> - <v>560157</v> + <v>560166</v> </b> <b> <a>3</a> <b>4</b> - <v>264920</v> + <v>264924</v> </b> <b> <a>4</a> <b>5</b> - <v>565823</v> + <v>565832</v> </b> <b> <a>5</a> <b>12</b> - <v>391923</v> + <v>391929</v> </b> <b> <a>12</a> <b>50</b> - <v>407422</v> + <v>407428</v> </b> <b> <a>50</a> <b>9900</b> - <v>150680</v> + <v>150682</v> </b> </bs> </hist> @@ -12463,62 +12524,62 @@ <b> <a>1</a> <b>4</b> - <v>229127</v> + <v>229132</v> </b> <b> <a>4</a> <b>7</b> - <v>231800</v> + <v>231804</v> </b> <b> <a>7</a> <b>9</b> - <v>220489</v> + <v>220493</v> </b> <b> <a>9</a> <b>12</b> - <v>251100</v> + <v>251104</v> </b> <b> <a>12</a> <b>13</b> - <v>333995</v> + <v>334000</v> </b> <b> <a>13</a> <b>14</b> - <v>165596</v> + <v>165599</v> </b> <b> <a>14</a> <b>15</b> - <v>298859</v> + <v>298864</v> </b> <b> <a>15</a> <b>16</b> - <v>121849</v> + <v>121851</v> </b> <b> <a>16</a> <b>17</b> - <v>276622</v> + <v>276627</v> </b> <b> <a>17</a> <b>18</b> - <v>146948</v> + <v>146950</v> </b> <b> <a>18</a> <b>20</b> - <v>252148</v> + <v>252152</v> </b> <b> <a>20</a> <b>25</b> - <v>208989</v> + <v>208993</v> </b> <b> <a>25</a> @@ -12533,19 +12594,19 @@ </relation> <relation> <name>macroinvocations</name> - <cardinality>33190389</cardinality> + <cardinality>33182692</cardinality> <columnsizes> <e> <k>id</k> - <v>33190389</v> + <v>33182692</v> </e> <e> <k>macro_id</k> - <v>78765</v> + <v>78746</v> </e> <e> <k>location</k> - <v>753510</v> + <v>753335</v> </e> <e> <k>kind</k> @@ -12563,7 +12624,7 @@ <b> <a>1</a> <b>2</b> - <v>33190389</v> + <v>33182692</v> </b> </bs> </hist> @@ -12579,7 +12640,7 @@ <b> <a>1</a> <b>2</b> - <v>33190389</v> + <v>33182692</v> </b> </bs> </hist> @@ -12595,7 +12656,7 @@ <b> <a>1</a> <b>2</b> - <v>33190389</v> + <v>33182692</v> </b> </bs> </hist> @@ -12611,57 +12672,57 @@ <b> <a>1</a> <b>2</b> - <v>16108</v> + <v>16105</v> </b> <b> <a>2</a> <b>3</b> - <v>16421</v> + <v>16418</v> </b> <b> <a>3</a> <b>4</b> - <v>3087</v> + <v>3086</v> </b> <b> <a>4</a> <b>5</b> - <v>5224</v> + <v>5222</v> </b> <b> <a>5</a> <b>8</b> - <v>5638</v> + <v>5636</v> </b> <b> <a>8</a> <b>13</b> - <v>6051</v> + <v>6050</v> </b> <b> <a>13</a> <b>26</b> - <v>6119</v> + <v>6117</v> </b> <b> <a>26</a> <b>61</b> - <v>6007</v> + <v>6005</v> </b> <b> <a>61</a> <b>199</b> - <v>5917</v> + <v>5916</v> </b> <b> <a>199</a> <b>1697</b> - <v>5962</v> + <v>5961</v> </b> <b> <a>1716</a> <b>168807</b> - <v>2226</v> + <v>2225</v> </b> </bs> </hist> @@ -12677,37 +12738,37 @@ <b> <a>1</a> <b>2</b> - <v>42084</v> + <v>42074</v> </b> <b> <a>2</a> <b>3</b> - <v>10302</v> + <v>10300</v> </b> <b> <a>3</a> <b>4</b> - <v>5112</v> + <v>5111</v> </b> <b> <a>4</a> <b>6</b> - <v>6779</v> + <v>6777</v> </b> <b> <a>6</a> <b>13</b> - <v>6421</v> + <v>6419</v> </b> <b> <a>13</a> <b>66</b> - <v>5951</v> + <v>5949</v> </b> <b> <a>66</a> <b>3614</b> - <v>2114</v> + <v>2113</v> </b> </bs> </hist> @@ -12723,12 +12784,12 @@ <b> <a>1</a> <b>2</b> - <v>73082</v> + <v>73065</v> </b> <b> <a>2</a> <b>3</b> - <v>5682</v> + <v>5681</v> </b> </bs> </hist> @@ -12744,37 +12805,37 @@ <b> <a>1</a> <b>2</b> - <v>278681</v> + <v>278617</v> </b> <b> <a>2</a> <b>3</b> - <v>168090</v> + <v>168051</v> </b> <b> <a>3</a> <b>4</b> - <v>70117</v> + <v>70101</v> </b> <b> <a>4</a> <b>5</b> - <v>59747</v> + <v>59734</v> </b> <b> <a>5</a> <b>9</b> - <v>69759</v> + <v>69743</v> </b> <b> <a>9</a> <b>21</b> - <v>58573</v> + <v>58559</v> </b> <b> <a>21</a> <b>244764</b> - <v>48538</v> + <v>48527</v> </b> </bs> </hist> @@ -12790,12 +12851,12 @@ <b> <a>1</a> <b>2</b> - <v>707756</v> + <v>707592</v> </b> <b> <a>2</a> <b>350</b> - <v>45753</v> + <v>45742</v> </b> </bs> </hist> @@ -12811,7 +12872,7 @@ <b> <a>1</a> <b>2</b> - <v>753510</v> + <v>753335</v> </b> </bs> </hist> @@ -12884,15 +12945,15 @@ </relation> <relation> <name>macroparent</name> - <cardinality>29680455</cardinality> + <cardinality>29673573</cardinality> <columnsizes> <e> <k>id</k> - <v>29680455</v> + <v>29673573</v> </e> <e> <k>parent_id</k> - <v>23077000</v> + <v>23071649</v> </e> </columnsizes> <dependencies> @@ -12906,7 +12967,7 @@ <b> <a>1</a> <b>2</b> - <v>29680455</v> + <v>29673573</v> </b> </bs> </hist> @@ -12922,17 +12983,17 @@ <b> <a>1</a> <b>2</b> - <v>17830675</v> + <v>17826541</v> </b> <b> <a>2</a> <b>3</b> - <v>4419217</v> + <v>4418192</v> </b> <b> <a>3</a> <b>88</b> - <v>827107</v> + <v>826915</v> </b> </bs> </hist> @@ -12942,15 +13003,15 @@ </relation> <relation> <name>macrolocationbind</name> - <cardinality>4043998</cardinality> + <cardinality>4044068</cardinality> <columnsizes> <e> <k>id</k> - <v>2831290</v> + <v>2831338</v> </e> <e> <k>location</k> - <v>2021169</v> + <v>2021204</v> </e> </columnsizes> <dependencies> @@ -12964,22 +13025,22 @@ <b> <a>1</a> <b>2</b> - <v>2230032</v> + <v>2230070</v> </b> <b> <a>2</a> <b>3</b> - <v>341142</v> + <v>341148</v> </b> <b> <a>3</a> <b>7</b> - <v>230537</v> + <v>230540</v> </b> <b> <a>7</a> <b>57</b> - <v>29578</v> + <v>29579</v> </b> </bs> </hist> @@ -12995,22 +13056,22 @@ <b> <a>1</a> <b>2</b> - <v>1611104</v> + <v>1611131</v> </b> <b> <a>2</a> <b>3</b> - <v>177691</v> + <v>177694</v> </b> <b> <a>3</a> <b>8</b> - <v>156877</v> + <v>156880</v> </b> <b> <a>8</a> <b>723</b> - <v>75496</v> + <v>75498</v> </b> </bs> </hist> @@ -13020,11 +13081,11 @@ </relation> <relation> <name>macro_argument_unexpanded</name> - <cardinality>83786944</cardinality> + <cardinality>83767514</cardinality> <columnsizes> <e> <k>invocation</k> - <v>25979141</v> + <v>25973117</v> </e> <e> <k>argument_index</k> @@ -13032,7 +13093,7 @@ </e> <e> <k>text</k> - <v>315429</v> + <v>315356</v> </e> </columnsizes> <dependencies> @@ -13046,22 +13107,22 @@ <b> <a>1</a> <b>2</b> - <v>7366004</v> + <v>7364296</v> </b> <b> <a>2</a> <b>3</b> - <v>10578205</v> + <v>10575752</v> </b> <b> <a>3</a> <b>4</b> - <v>6083801</v> + <v>6082391</v> </b> <b> <a>4</a> <b>67</b> - <v>1951130</v> + <v>1950677</v> </b> </bs> </hist> @@ -13077,22 +13138,22 @@ <b> <a>1</a> <b>2</b> - <v>7435529</v> + <v>7433804</v> </b> <b> <a>2</a> <b>3</b> - <v>10723430</v> + <v>10720943</v> </b> <b> <a>3</a> <b>4</b> - <v>5918977</v> + <v>5917605</v> </b> <b> <a>4</a> <b>67</b> - <v>1901204</v> + <v>1900763</v> </b> </bs> </hist> @@ -13160,57 +13221,57 @@ <b> <a>1</a> <b>2</b> - <v>34756</v> + <v>34748</v> </b> <b> <a>2</a> <b>3</b> - <v>60709</v> + <v>60695</v> </b> <b> <a>3</a> <b>4</b> - <v>17585</v> + <v>17581</v> </b> <b> <a>4</a> <b>5</b> - <v>44657</v> + <v>44646</v> </b> <b> <a>5</a> <b>7</b> - <v>23704</v> + <v>23699</v> </b> <b> <a>7</a> <b>12</b> - <v>18357</v> + <v>18353</v> </b> <b> <a>12</a> <b>16</b> - <v>21422</v> + <v>21417</v> </b> <b> <a>16</a> <b>23</b> - <v>24756</v> + <v>24750</v> </b> <b> <a>23</a> <b>42</b> - <v>24107</v> + <v>24101</v> </b> <b> <a>42</a> <b>129</b> - <v>23861</v> + <v>23855</v> </b> <b> <a>129</a> <b>522417</b> - <v>21511</v> + <v>21506</v> </b> </bs> </hist> @@ -13226,17 +13287,17 @@ <b> <a>1</a> <b>2</b> - <v>228118</v> + <v>228065</v> </b> <b> <a>2</a> <b>3</b> - <v>77120</v> + <v>77102</v> </b> <b> <a>3</a> <b>9</b> - <v>10191</v> + <v>10188</v> </b> </bs> </hist> @@ -13246,11 +13307,11 @@ </relation> <relation> <name>macro_argument_expanded</name> - <cardinality>83786944</cardinality> + <cardinality>83767514</cardinality> <columnsizes> <e> <k>invocation</k> - <v>25979141</v> + <v>25973117</v> </e> <e> <k>argument_index</k> @@ -13258,7 +13319,7 @@ </e> <e> <k>text</k> - <v>191157</v> + <v>191113</v> </e> </columnsizes> <dependencies> @@ -13272,22 +13333,22 @@ <b> <a>1</a> <b>2</b> - <v>7366004</v> + <v>7364296</v> </b> <b> <a>2</a> <b>3</b> - <v>10578205</v> + <v>10575752</v> </b> <b> <a>3</a> <b>4</b> - <v>6083801</v> + <v>6082391</v> </b> <b> <a>4</a> <b>67</b> - <v>1951130</v> + <v>1950677</v> </b> </bs> </hist> @@ -13303,22 +13364,22 @@ <b> <a>1</a> <b>2</b> - <v>10593150</v> + <v>10590693</v> </b> <b> <a>2</a> <b>3</b> - <v>9119085</v> + <v>9116971</v> </b> <b> <a>3</a> <b>4</b> - <v>5161172</v> + <v>5159975</v> </b> <b> <a>4</a> <b>9</b> - <v>1105732</v> + <v>1105476</v> </b> </bs> </hist> @@ -13386,22 +13447,22 @@ <b> <a>1</a> <b>2</b> - <v>20605</v> + <v>20601</v> </b> <b> <a>2</a> <b>3</b> - <v>36971</v> + <v>36963</v> </b> <b> <a>3</a> <b>4</b> - <v>8982</v> + <v>8980</v> </b> <b> <a>4</a> <b>5</b> - <v>16231</v> + <v>16228</v> </b> <b> <a>5</a> @@ -13411,37 +13472,37 @@ <b> <a>6</a> <b>7</b> - <v>22641</v> + <v>22636</v> </b> <b> <a>7</a> <b>9</b> - <v>14665</v> + <v>14662</v> </b> <b> <a>9</a> <b>14</b> - <v>11936</v> + <v>11933</v> </b> <b> <a>14</a> <b>19</b> - <v>14419</v> + <v>14416</v> </b> <b> <a>19</a> <b>48</b> - <v>14341</v> + <v>14337</v> </b> <b> <a>48</a> <b>151</b> - <v>14352</v> + <v>14349</v> </b> <b> <a>152</a> <b>1060462</b> - <v>13614</v> + <v>13610</v> </b> </bs> </hist> @@ -13457,17 +13518,17 @@ <b> <a>1</a> <b>2</b> - <v>96742</v> + <v>96719</v> </b> <b> <a>2</a> <b>3</b> - <v>80141</v> + <v>80122</v> </b> <b> <a>3</a> <b>66</b> - <v>14274</v> + <v>14270</v> </b> </bs> </hist> @@ -13477,19 +13538,19 @@ </relation> <relation> <name>functions</name> - <cardinality>4646200</cardinality> + <cardinality>4645804</cardinality> <columnsizes> <e> <k>id</k> - <v>4646200</v> + <v>4645804</v> </e> <e> <k>name</k> - <v>1917064</v> + <v>1916901</v> </e> <e> <k>kind</k> - <v>3265</v> + <v>3264</v> </e> </columnsizes> <dependencies> @@ -13503,7 +13564,7 @@ <b> <a>1</a> <b>2</b> - <v>4646200</v> + <v>4645804</v> </b> </bs> </hist> @@ -13519,7 +13580,7 @@ <b> <a>1</a> <b>2</b> - <v>4646200</v> + <v>4645804</v> </b> </bs> </hist> @@ -13535,22 +13596,22 @@ <b> <a>1</a> <b>2</b> - <v>1504266</v> + <v>1504138</v> </b> <b> <a>2</a> <b>3</b> - <v>152059</v> + <v>152046</v> </b> <b> <a>3</a> <b>5</b> - <v>150193</v> + <v>150180</v> </b> <b> <a>5</a> <b>1676</b> - <v>110546</v> + <v>110536</v> </b> </bs> </hist> @@ -13566,7 +13627,7 @@ <b> <a>1</a> <b>2</b> - <v>1916598</v> + <v>1916435</v> </b> <b> <a>2</a> @@ -13673,15 +13734,15 @@ </relation> <relation> <name>function_entry_point</name> - <cardinality>1156769</cardinality> + <cardinality>1156670</cardinality> <columnsizes> <e> <k>id</k> - <v>1146973</v> + <v>1146876</v> </e> <e> <k>entry_point</k> - <v>1156769</v> + <v>1156670</v> </e> </columnsizes> <dependencies> @@ -13695,12 +13756,12 @@ <b> <a>1</a> <b>2</b> - <v>1137178</v> + <v>1137081</v> </b> <b> <a>2</a> <b>3</b> - <v>9795</v> + <v>9794</v> </b> </bs> </hist> @@ -13716,7 +13777,7 @@ <b> <a>1</a> <b>2</b> - <v>1156769</v> + <v>1156670</v> </b> </bs> </hist> @@ -13726,15 +13787,15 @@ </relation> <relation> <name>function_return_type</name> - <cardinality>4651331</cardinality> + <cardinality>4650935</cardinality> <columnsizes> <e> <k>id</k> - <v>4646200</v> + <v>4645804</v> </e> <e> <k>return_type</k> - <v>987451</v> + <v>987367</v> </e> </columnsizes> <dependencies> @@ -13748,7 +13809,7 @@ <b> <a>1</a> <b>2</b> - <v>4641069</v> + <v>4640674</v> </b> <b> <a>2</a> @@ -13769,22 +13830,22 @@ <b> <a>1</a> <b>2</b> - <v>510284</v> + <v>510240</v> </b> <b> <a>2</a> <b>3</b> - <v>375949</v> + <v>375917</v> </b> <b> <a>3</a> <b>10</b> - <v>75096</v> + <v>75090</v> </b> <b> <a>10</a> <b>2516</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -13794,23 +13855,23 @@ </relation> <relation> <name>coroutine</name> - <cardinality>2</cardinality> + <cardinality>6</cardinality> <columnsizes> <e> <k>function</k> - <v>2</v> + <v>6</v> </e> <e> <k>traits</k> - <v>1</v> + <v>3</v> </e> <e> <k>handle</k> - <v>2</v> + <v>6</v> </e> <e> <k>promise</k> - <v>2</v> + <v>6</v> </e> </columnsizes> <dependencies> @@ -13824,7 +13885,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -13840,7 +13901,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -13856,7 +13917,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -13869,11 +13930,21 @@ <hist> <budget>12</budget> <bs> + <b> + <a>1</a> + <b>2</b> + <v>1</v> + </b> <b> <a>2</a> <b>3</b> <v>1</v> </b> + <b> + <a>3</a> + <b>4</b> + <v>1</v> + </b> </bs> </hist> </val> @@ -13885,11 +13956,21 @@ <hist> <budget>12</budget> <bs> + <b> + <a>1</a> + <b>2</b> + <v>1</v> + </b> <b> <a>2</a> <b>3</b> <v>1</v> </b> + <b> + <a>3</a> + <b>4</b> + <v>1</v> + </b> </bs> </hist> </val> @@ -13901,11 +13982,21 @@ <hist> <budget>12</budget> <bs> + <b> + <a>1</a> + <b>2</b> + <v>1</v> + </b> <b> <a>2</a> <b>3</b> <v>1</v> </b> + <b> + <a>3</a> + <b>4</b> + <v>1</v> + </b> </bs> </hist> </val> @@ -13920,7 +14011,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -13936,7 +14027,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -13952,7 +14043,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -13968,7 +14059,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -13984,7 +14075,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -14000,7 +14091,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -14010,11 +14101,11 @@ </relation> <relation> <name>coroutine_new</name> - <cardinality>2</cardinality> + <cardinality>6</cardinality> <columnsizes> <e> <k>function</k> - <v>2</v> + <v>6</v> </e> <e> <k>new</k> @@ -14032,7 +14123,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -14046,8 +14137,8 @@ <budget>12</budget> <bs> <b> - <a>2</a> - <b>3</b> + <a>6</a> + <b>7</b> <v>1</v> </b> </bs> @@ -14058,11 +14149,11 @@ </relation> <relation> <name>coroutine_delete</name> - <cardinality>2</cardinality> + <cardinality>6</cardinality> <columnsizes> <e> <k>function</k> - <v>2</v> + <v>6</v> </e> <e> <k>delete</k> @@ -14080,7 +14171,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>6</v> </b> </bs> </hist> @@ -14094,8 +14185,8 @@ <budget>12</budget> <bs> <b> - <a>2</a> - <b>3</b> + <a>6</a> + <b>7</b> <v>1</v> </b> </bs> @@ -14106,59 +14197,59 @@ </relation> <relation> <name>purefunctions</name> - <cardinality>100915</cardinality> + <cardinality>100911</cardinality> <columnsizes> <e> <k>id</k> - <v>100915</v> + <v>100911</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>function_deleted</name> - <cardinality>137599</cardinality> + <cardinality>137587</cardinality> <columnsizes> <e> <k>id</k> - <v>137599</v> + <v>137587</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>function_defaulted</name> - <cardinality>73697</cardinality> + <cardinality>73691</cardinality> <columnsizes> <e> <k>id</k> - <v>73697</v> + <v>73691</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>function_prototyped</name> - <cardinality>4554311</cardinality> + <cardinality>4553923</cardinality> <columnsizes> <e> <k>id</k> - <v>4554311</v> + <v>4553923</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>member_function_this_type</name> - <cardinality>545957</cardinality> + <cardinality>545645</cardinality> <columnsizes> <e> <k>id</k> - <v>545957</v> + <v>545645</v> </e> <e> <k>this_type</k> - <v>187389</v> + <v>187282</v> </e> </columnsizes> <dependencies> @@ -14172,7 +14263,7 @@ <b> <a>1</a> <b>2</b> - <v>545957</v> + <v>545645</v> </b> </bs> </hist> @@ -14188,32 +14279,32 @@ <b> <a>1</a> <b>2</b> - <v>67657</v> + <v>67619</v> </b> <b> <a>2</a> <b>3</b> - <v>44838</v> + <v>44812</v> </b> <b> <a>3</a> <b>4</b> - <v>30193</v> + <v>30176</v> </b> <b> <a>4</a> <b>5</b> - <v>15340</v> + <v>15331</v> </b> <b> <a>5</a> <b>7</b> - <v>15375</v> + <v>15366</v> </b> <b> <a>7</a> <b>66</b> - <v>13983</v> + <v>13975</v> </b> </bs> </hist> @@ -14223,27 +14314,27 @@ </relation> <relation> <name>fun_decls</name> - <cardinality>5015153</cardinality> + <cardinality>5014726</cardinality> <columnsizes> <e> <k>id</k> - <v>5010023</v> + <v>5009596</v> </e> <e> <k>function</k> - <v>4502537</v> + <v>4502153</v> </e> <e> <k>type_id</k> - <v>986052</v> + <v>985968</v> </e> <e> <k>name</k> - <v>1819579</v> + <v>1819424</v> </e> <e> <k>location</k> - <v>3418532</v> + <v>3418241</v> </e> </columnsizes> <dependencies> @@ -14257,7 +14348,7 @@ <b> <a>1</a> <b>2</b> - <v>5010023</v> + <v>5009596</v> </b> </bs> </hist> @@ -14273,7 +14364,7 @@ <b> <a>1</a> <b>2</b> - <v>5004892</v> + <v>5004465</v> </b> <b> <a>2</a> @@ -14294,7 +14385,7 @@ <b> <a>1</a> <b>2</b> - <v>5010023</v> + <v>5009596</v> </b> </bs> </hist> @@ -14310,7 +14401,7 @@ <b> <a>1</a> <b>2</b> - <v>5010023</v> + <v>5009596</v> </b> </bs> </hist> @@ -14326,17 +14417,17 @@ <b> <a>1</a> <b>2</b> - <v>4073879</v> + <v>4073532</v> </b> <b> <a>2</a> <b>3</b> - <v>355893</v> + <v>355862</v> </b> <b> <a>3</a> <b>7</b> - <v>72764</v> + <v>72758</v> </b> </bs> </hist> @@ -14352,12 +14443,12 @@ <b> <a>1</a> <b>2</b> - <v>4462889</v> + <v>4462509</v> </b> <b> <a>2</a> <b>3</b> - <v>39647</v> + <v>39643</v> </b> </bs> </hist> @@ -14373,7 +14464,7 @@ <b> <a>1</a> <b>2</b> - <v>4502537</v> + <v>4502153</v> </b> </bs> </hist> @@ -14389,12 +14480,12 @@ <b> <a>1</a> <b>2</b> - <v>4130318</v> + <v>4129966</v> </b> <b> <a>2</a> <b>4</b> - <v>371285</v> + <v>371253</v> </b> <b> <a>5</a> @@ -14415,22 +14506,22 @@ <b> <a>1</a> <b>2</b> - <v>435654</v> + <v>435617</v> </b> <b> <a>2</a> <b>3</b> - <v>438452</v> + <v>438415</v> </b> <b> <a>3</a> <b>8</b> - <v>75096</v> + <v>75090</v> </b> <b> <a>8</a> <b>2761</b> - <v>36848</v> + <v>36845</v> </b> </bs> </hist> @@ -14446,22 +14537,22 @@ <b> <a>1</a> <b>2</b> - <v>519613</v> + <v>519568</v> </b> <b> <a>2</a> <b>3</b> - <v>367554</v> + <v>367522</v> </b> <b> <a>3</a> <b>11</b> - <v>75563</v> + <v>75556</v> </b> <b> <a>11</a> <b>2477</b> - <v>23321</v> + <v>23319</v> </b> </bs> </hist> @@ -14477,17 +14568,17 @@ <b> <a>1</a> <b>2</b> - <v>858714</v> + <v>858641</v> </b> <b> <a>2</a> <b>5</b> - <v>89556</v> + <v>89548</v> </b> <b> <a>5</a> <b>823</b> - <v>37781</v> + <v>37778</v> </b> </bs> </hist> @@ -14503,22 +14594,22 @@ <b> <a>1</a> <b>2</b> - <v>754698</v> + <v>754634</v> </b> <b> <a>2</a> <b>3</b> - <v>131535</v> + <v>131524</v> </b> <b> <a>3</a> <b>10</b> - <v>74630</v> + <v>74623</v> </b> <b> <a>10</a> <b>2030</b> - <v>25187</v> + <v>25185</v> </b> </bs> </hist> @@ -14534,27 +14625,27 @@ <b> <a>1</a> <b>2</b> - <v>1234664</v> + <v>1234559</v> </b> <b> <a>2</a> <b>3</b> - <v>266803</v> + <v>266780</v> </b> <b> <a>3</a> <b>4</b> - <v>80693</v> + <v>80687</v> </b> <b> <a>4</a> <b>6</b> - <v>136666</v> + <v>136655</v> </b> <b> <a>6</a> <b>1710</b> - <v>100750</v> + <v>100742</v> </b> </bs> </hist> @@ -14570,22 +14661,22 @@ <b> <a>1</a> <b>2</b> - <v>1413777</v> + <v>1413656</v> </b> <b> <a>2</a> <b>3</b> - <v>151126</v> + <v>151113</v> </b> <b> <a>3</a> <b>5</b> - <v>144129</v> + <v>144117</v> </b> <b> <a>5</a> <b>1660</b> - <v>110546</v> + <v>110536</v> </b> </bs> </hist> @@ -14601,17 +14692,17 @@ <b> <a>1</a> <b>2</b> - <v>1601285</v> + <v>1601149</v> </b> <b> <a>2</a> <b>4</b> - <v>134800</v> + <v>134789</v> </b> <b> <a>4</a> <b>930</b> - <v>83492</v> + <v>83485</v> </b> </bs> </hist> @@ -14627,27 +14718,27 @@ <b> <a>1</a> <b>2</b> - <v>1255654</v> + <v>1255547</v> </b> <b> <a>2</a> <b>3</b> - <v>293390</v> + <v>293365</v> </b> <b> <a>3</a> <b>4</b> - <v>79761</v> + <v>79754</v> </b> <b> <a>4</a> <b>8</b> - <v>137599</v> + <v>137587</v> </b> <b> <a>8</a> <b>653</b> - <v>53174</v> + <v>53169</v> </b> </bs> </hist> @@ -14663,17 +14754,17 @@ <b> <a>1</a> <b>2</b> - <v>2962355</v> + <v>2962102</v> </b> <b> <a>2</a> <b>4</b> - <v>296188</v> + <v>296163</v> </b> <b> <a>4</a> <b>55</b> - <v>159988</v> + <v>159975</v> </b> </bs> </hist> @@ -14689,17 +14780,17 @@ <b> <a>1</a> <b>2</b> - <v>3029522</v> + <v>3029264</v> </b> <b> <a>2</a> <b>6</b> - <v>262605</v> + <v>262582</v> </b> <b> <a>6</a> <b>55</b> - <v>126405</v> + <v>126394</v> </b> </bs> </hist> @@ -14715,12 +14806,12 @@ <b> <a>1</a> <b>2</b> - <v>3208634</v> + <v>3208361</v> </b> <b> <a>2</a> <b>25</b> - <v>209897</v> + <v>209879</v> </b> </bs> </hist> @@ -14736,12 +14827,12 @@ <b> <a>1</a> <b>2</b> - <v>3246416</v> + <v>3246139</v> </b> <b> <a>2</a> <b>13</b> - <v>172116</v> + <v>172101</v> </b> </bs> </hist> @@ -14751,22 +14842,22 @@ </relation> <relation> <name>fun_def</name> - <cardinality>1935256</cardinality> + <cardinality>1935091</cardinality> <columnsizes> <e> <k>id</k> - <v>1935256</v> + <v>1935091</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>fun_specialized</name> - <cardinality>26120</cardinality> + <cardinality>26118</cardinality> <columnsizes> <e> <k>id</k> - <v>26120</v> + <v>26118</v> </e> </columnsizes> <dependencies/> @@ -14784,11 +14875,11 @@ </relation> <relation> <name>fun_decl_specifiers</name> - <cardinality>2904050</cardinality> + <cardinality>2903802</cardinality> <columnsizes> <e> <k>id</k> - <v>1688043</v> + <v>1687899</v> </e> <e> <k>name</k> @@ -14806,17 +14897,17 @@ <b> <a>1</a> <b>2</b> - <v>490693</v> + <v>490652</v> </b> <b> <a>2</a> <b>3</b> - <v>1178691</v> + <v>1178591</v> </b> <b> <a>3</a> <b>4</b> - <v>18657</v> + <v>18655</v> </b> </bs> </hist> @@ -14988,26 +15079,26 @@ </relation> <relation> <name>fun_decl_empty_throws</name> - <cardinality>1933856</cardinality> + <cardinality>1933692</cardinality> <columnsizes> <e> <k>fun_decl</k> - <v>1933856</v> + <v>1933692</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>fun_decl_noexcept</name> - <cardinality>60528</cardinality> + <cardinality>61680</cardinality> <columnsizes> <e> <k>fun_decl</k> - <v>60528</v> + <v>61680</v> </e> <e> <k>constant</k> - <v>60424</v> + <v>61582</v> </e> </columnsizes> <dependencies> @@ -15021,7 +15112,7 @@ <b> <a>1</a> <b>2</b> - <v>60528</v> + <v>61680</v> </b> </bs> </hist> @@ -15037,12 +15128,12 @@ <b> <a>1</a> <b>2</b> - <v>60321</v> + <v>61483</v> </b> <b> <a>2</a> <b>3</b> - <v>103</v> + <v>98</v> </b> </bs> </hist> @@ -15052,22 +15143,22 @@ </relation> <relation> <name>fun_decl_empty_noexcept</name> - <cardinality>869909</cardinality> + <cardinality>869834</cardinality> <columnsizes> <e> <k>fun_decl</k> - <v>869909</v> + <v>869834</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>fun_decl_typedef_type</name> - <cardinality>2867</cardinality> + <cardinality>2864</cardinality> <columnsizes> <e> <k>fun_decl</k> - <v>2867</v> + <v>2864</v> </e> <e> <k>typedeftype_id</k> @@ -15085,7 +15176,7 @@ <b> <a>1</a> <b>2</b> - <v>2867</v> + <v>2864</v> </b> </bs> </hist> @@ -15161,19 +15252,19 @@ </relation> <relation> <name>param_decl_bind</name> - <cardinality>7380000</cardinality> + <cardinality>7379371</cardinality> <columnsizes> <e> <k>id</k> - <v>7380000</v> + <v>7379371</v> </e> <e> <k>index</k> - <v>7929</v> + <v>7928</v> </e> <e> <k>fun_decl</k> - <v>4223140</v> + <v>4222780</v> </e> </columnsizes> <dependencies> @@ -15187,7 +15278,7 @@ <b> <a>1</a> <b>2</b> - <v>7380000</v> + <v>7379371</v> </b> </bs> </hist> @@ -15203,7 +15294,7 @@ <b> <a>1</a> <b>2</b> - <v>7380000</v> + <v>7379371</v> </b> </bs> </hist> @@ -15381,22 +15472,22 @@ <b> <a>1</a> <b>2</b> - <v>2363447</v> + <v>2363245</v> </b> <b> <a>2</a> <b>3</b> - <v>1060682</v> + <v>1060592</v> </b> <b> <a>3</a> <b>4</b> - <v>502354</v> + <v>502312</v> </b> <b> <a>4</a> <b>18</b> - <v>296655</v> + <v>296630</v> </b> </bs> </hist> @@ -15412,22 +15503,22 @@ <b> <a>1</a> <b>2</b> - <v>2363447</v> + <v>2363245</v> </b> <b> <a>2</a> <b>3</b> - <v>1060682</v> + <v>1060592</v> </b> <b> <a>3</a> <b>4</b> - <v>502354</v> + <v>502312</v> </b> <b> <a>4</a> <b>18</b> - <v>296655</v> + <v>296630</v> </b> </bs> </hist> @@ -15437,27 +15528,27 @@ </relation> <relation> <name>var_decls</name> - <cardinality>8494323</cardinality> + <cardinality>8493599</cardinality> <columnsizes> <e> <k>id</k> - <v>8423424</v> + <v>8422707</v> </e> <e> <k>variable</k> - <v>7412184</v> + <v>7411553</v> </e> <e> <k>type_id</k> - <v>2384436</v> + <v>2384233</v> </e> <e> <k>name</k> - <v>667007</v> + <v>666951</v> </e> <e> <k>location</k> - <v>5307144</v> + <v>5306692</v> </e> </columnsizes> <dependencies> @@ -15471,7 +15562,7 @@ <b> <a>1</a> <b>2</b> - <v>8423424</v> + <v>8422707</v> </b> </bs> </hist> @@ -15487,12 +15578,12 @@ <b> <a>1</a> <b>2</b> - <v>8355324</v> + <v>8354612</v> </b> <b> <a>2</a> <b>3</b> - <v>68100</v> + <v>68094</v> </b> </bs> </hist> @@ -15508,7 +15599,7 @@ <b> <a>1</a> <b>2</b> - <v>8423424</v> + <v>8422707</v> </b> </bs> </hist> @@ -15524,7 +15615,7 @@ <b> <a>1</a> <b>2</b> - <v>8420626</v> + <v>8419908</v> </b> <b> <a>2</a> @@ -15545,17 +15636,17 @@ <b> <a>1</a> <b>2</b> - <v>6560933</v> + <v>6560374</v> </b> <b> <a>2</a> <b>3</b> - <v>697792</v> + <v>697733</v> </b> <b> <a>3</a> <b>7</b> - <v>153458</v> + <v>153445</v> </b> </bs> </hist> @@ -15571,12 +15662,12 @@ <b> <a>1</a> <b>2</b> - <v>7241001</v> + <v>7240384</v> </b> <b> <a>2</a> <b>4</b> - <v>171183</v> + <v>171168</v> </b> </bs> </hist> @@ -15592,12 +15683,12 @@ <b> <a>1</a> <b>2</b> - <v>7296974</v> + <v>7296352</v> </b> <b> <a>2</a> <b>3</b> - <v>115210</v> + <v>115200</v> </b> </bs> </hist> @@ -15613,12 +15704,12 @@ <b> <a>1</a> <b>2</b> - <v>6867383</v> + <v>6866798</v> </b> <b> <a>2</a> <b>4</b> - <v>544800</v> + <v>544754</v> </b> </bs> </hist> @@ -15634,27 +15725,27 @@ <b> <a>1</a> <b>2</b> - <v>1469283</v> + <v>1469158</v> </b> <b> <a>2</a> <b>3</b> - <v>509351</v> + <v>509308</v> </b> <b> <a>3</a> <b>4</b> - <v>97952</v> + <v>97943</v> </b> <b> <a>4</a> <b>7</b> - <v>187042</v> + <v>187026</v> </b> <b> <a>7</a> <b>762</b> - <v>120807</v> + <v>120797</v> </b> </bs> </hist> @@ -15670,22 +15761,22 @@ <b> <a>1</a> <b>2</b> - <v>1602684</v> + <v>1602548</v> </b> <b> <a>2</a> <b>3</b> - <v>484630</v> + <v>484588</v> </b> <b> <a>3</a> <b>7</b> - <v>186575</v> + <v>186559</v> </b> <b> <a>7</a> <b>724</b> - <v>110546</v> + <v>110536</v> </b> </bs> </hist> @@ -15701,17 +15792,17 @@ <b> <a>1</a> <b>2</b> - <v>1877417</v> + <v>1877257</v> </b> <b> <a>2</a> <b>3</b> - <v>384812</v> + <v>384779</v> </b> <b> <a>3</a> <b>128</b> - <v>122207</v> + <v>122196</v> </b> </bs> </hist> @@ -15727,22 +15818,22 @@ <b> <a>1</a> <b>2</b> - <v>1705301</v> + <v>1705156</v> </b> <b> <a>2</a> <b>3</b> - <v>401604</v> + <v>401569</v> </b> <b> <a>3</a> <b>8</b> - <v>188441</v> + <v>188425</v> </b> <b> <a>8</a> <b>592</b> - <v>89089</v> + <v>89082</v> </b> </bs> </hist> @@ -15758,37 +15849,37 @@ <b> <a>1</a> <b>2</b> - <v>340967</v> + <v>340937</v> </b> <b> <a>2</a> <b>3</b> - <v>86757</v> + <v>86750</v> </b> <b> <a>3</a> <b>4</b> - <v>48509</v> + <v>48505</v> </b> <b> <a>4</a> <b>6</b> - <v>51774</v> + <v>51770</v> </b> <b> <a>6</a> <b>12</b> - <v>52241</v> + <v>52236</v> </b> <b> <a>12</a> <b>33</b> - <v>50375</v> + <v>50371</v> </b> <b> <a>34</a> <b>3223</b> - <v>36382</v> + <v>36379</v> </b> </bs> </hist> @@ -15804,37 +15895,37 @@ <b> <a>1</a> <b>2</b> - <v>368486</v> + <v>368455</v> </b> <b> <a>2</a> <b>3</b> - <v>77895</v> + <v>77888</v> </b> <b> <a>3</a> <b>4</b> - <v>45244</v> + <v>45240</v> </b> <b> <a>4</a> <b>6</b> - <v>49442</v> + <v>49438</v> </b> <b> <a>6</a> <b>14</b> - <v>53174</v> + <v>53169</v> </b> <b> <a>14</a> <b>56</b> - <v>50841</v> + <v>50837</v> </b> <b> <a>56</a> <b>3140</b> - <v>21922</v> + <v>21920</v> </b> </bs> </hist> @@ -15850,27 +15941,27 @@ <b> <a>1</a> <b>2</b> - <v>456643</v> + <v>456605</v> </b> <b> <a>2</a> <b>3</b> - <v>93754</v> + <v>93746</v> </b> <b> <a>3</a> <b>5</b> - <v>46643</v> + <v>46639</v> </b> <b> <a>5</a> <b>19</b> - <v>50841</v> + <v>50837</v> </b> <b> <a>19</a> <b>1927</b> - <v>19124</v> + <v>19122</v> </b> </bs> </hist> @@ -15886,32 +15977,32 @@ <b> <a>1</a> <b>2</b> - <v>378748</v> + <v>378716</v> </b> <b> <a>2</a> <b>3</b> - <v>90489</v> + <v>90481</v> </b> <b> <a>3</a> <b>5</b> - <v>59704</v> + <v>59699</v> </b> <b> <a>5</a> <b>9</b> - <v>51308</v> + <v>51303</v> </b> <b> <a>9</a> <b>21</b> - <v>50375</v> + <v>50371</v> </b> <b> <a>21</a> <b>1010</b> - <v>36382</v> + <v>36379</v> </b> </bs> </hist> @@ -15927,17 +16018,17 @@ <b> <a>1</a> <b>2</b> - <v>4492275</v> + <v>4491892</v> </b> <b> <a>2</a> <b>3</b> - <v>531274</v> + <v>531228</v> </b> <b> <a>3</a> <b>1735</b> - <v>283595</v> + <v>283570</v> </b> </bs> </hist> @@ -15953,17 +16044,17 @@ <b> <a>1</a> <b>2</b> - <v>4881285</v> + <v>4880869</v> </b> <b> <a>2</a> <b>17</b> - <v>415130</v> + <v>415095</v> </b> <b> <a>17</a> <b>1731</b> - <v>10728</v> + <v>10727</v> </b> </bs> </hist> @@ -15979,12 +16070,12 @@ <b> <a>1</a> <b>2</b> - <v>4957315</v> + <v>4956893</v> </b> <b> <a>2</a> <b>1513</b> - <v>349829</v> + <v>349799</v> </b> </bs> </hist> @@ -16000,12 +16091,12 @@ <b> <a>1</a> <b>2</b> - <v>5297815</v> + <v>5297364</v> </b> <b> <a>2</a> <b>6</b> - <v>9328</v> + <v>9327</v> </b> </bs> </hist> @@ -16015,26 +16106,26 @@ </relation> <relation> <name>var_def</name> - <cardinality>4024903</cardinality> + <cardinality>4024560</cardinality> <columnsizes> <e> <k>id</k> - <v>4024903</v> + <v>4024560</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>var_decl_specifiers</name> - <cardinality>310648</cardinality> + <cardinality>378249</cardinality> <columnsizes> <e> <k>id</k> - <v>310648</v> + <v>378249</v> </e> <e> <k>name</k> - <v>1399</v> + <v>1865</v> </e> </columnsizes> <dependencies> @@ -16048,7 +16139,7 @@ <b> <a>1</a> <b>2</b> - <v>310648</v> + <v>378249</v> </b> </bs> </hist> @@ -16071,6 +16162,11 @@ <b>67</b> <v>466</v> </b> + <b> + <a>145</a> + <b>146</b> + <v>466</v> + </b> <b> <a>585</a> <b>586</b> @@ -16095,19 +16191,19 @@ </relation> <relation> <name>type_decls</name> - <cardinality>3242218</cardinality> + <cardinality>3280187</cardinality> <columnsizes> <e> <k>id</k> - <v>3242218</v> + <v>3280187</v> </e> <e> <k>type_id</k> - <v>3191843</v> + <v>3229815</v> </e> <e> <k>location</k> - <v>3163390</v> + <v>3163120</v> </e> </columnsizes> <dependencies> @@ -16121,7 +16217,7 @@ <b> <a>1</a> <b>2</b> - <v>3242218</v> + <v>3280187</v> </b> </bs> </hist> @@ -16137,7 +16233,7 @@ <b> <a>1</a> <b>2</b> - <v>3242218</v> + <v>3280187</v> </b> </bs> </hist> @@ -16153,12 +16249,12 @@ <b> <a>1</a> <b>2</b> - <v>3150330</v> + <v>3188306</v> </b> <b> <a>2</a> <b>5</b> - <v>41513</v> + <v>41509</v> </b> </bs> </hist> @@ -16174,12 +16270,12 @@ <b> <a>1</a> <b>2</b> - <v>3150330</v> + <v>3188306</v> </b> <b> <a>2</a> <b>5</b> - <v>41513</v> + <v>41509</v> </b> </bs> </hist> @@ -16195,12 +16291,12 @@ <b> <a>1</a> <b>2</b> - <v>3123276</v> + <v>3110884</v> </b> <b> <a>2</a> <b>20</b> - <v>40113</v> + <v>52236</v> </b> </bs> </hist> @@ -16216,12 +16312,12 @@ <b> <a>1</a> <b>2</b> - <v>3123276</v> + <v>3110884</v> </b> <b> <a>2</a> <b>20</b> - <v>40113</v> + <v>52236</v> </b> </bs> </hist> @@ -16231,33 +16327,33 @@ </relation> <relation> <name>type_def</name> - <cardinality>2624653</cardinality> + <cardinality>2639354</cardinality> <columnsizes> <e> <k>id</k> - <v>2624653</v> + <v>2639354</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>type_decl_top</name> - <cardinality>743037</cardinality> + <cardinality>742974</cardinality> <columnsizes> <e> <k>type_decl</k> - <v>743037</v> + <v>742974</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>namespace_decls</name> - <cardinality>311523</cardinality> + <cardinality>311514</cardinality> <columnsizes> <e> <k>id</k> - <v>311523</v> + <v>311514</v> </e> <e> <k>namespace_id</k> @@ -16265,11 +16361,11 @@ </e> <e> <k>location</k> - <v>311523</v> + <v>311514</v> </e> <e> <k>bodylocation</k> - <v>311523</v> + <v>311514</v> </e> </columnsizes> <dependencies> @@ -16283,7 +16379,7 @@ <b> <a>1</a> <b>2</b> - <v>311523</v> + <v>311514</v> </b> </bs> </hist> @@ -16299,7 +16395,7 @@ <b> <a>1</a> <b>2</b> - <v>311523</v> + <v>311514</v> </b> </bs> </hist> @@ -16315,7 +16411,7 @@ <b> <a>1</a> <b>2</b> - <v>311523</v> + <v>311514</v> </b> </bs> </hist> @@ -16529,7 +16625,7 @@ <b> <a>1</a> <b>2</b> - <v>311523</v> + <v>311514</v> </b> </bs> </hist> @@ -16545,7 +16641,7 @@ <b> <a>1</a> <b>2</b> - <v>311523</v> + <v>311514</v> </b> </bs> </hist> @@ -16561,7 +16657,7 @@ <b> <a>1</a> <b>2</b> - <v>311523</v> + <v>311514</v> </b> </bs> </hist> @@ -16577,7 +16673,7 @@ <b> <a>1</a> <b>2</b> - <v>311523</v> + <v>311514</v> </b> </bs> </hist> @@ -16593,7 +16689,7 @@ <b> <a>1</a> <b>2</b> - <v>311523</v> + <v>311514</v> </b> </bs> </hist> @@ -16609,7 +16705,7 @@ <b> <a>1</a> <b>2</b> - <v>311523</v> + <v>311514</v> </b> </bs> </hist> @@ -16619,19 +16715,19 @@ </relation> <relation> <name>usings</name> - <cardinality>369419</cardinality> + <cardinality>369388</cardinality> <columnsizes> <e> <k>id</k> - <v>369419</v> + <v>369388</v> </e> <e> <k>element_id</k> - <v>315312</v> + <v>315286</v> </e> <e> <k>location</k> - <v>247679</v> + <v>247658</v> </e> </columnsizes> <dependencies> @@ -16645,7 +16741,7 @@ <b> <a>1</a> <b>2</b> - <v>369419</v> + <v>369388</v> </b> </bs> </hist> @@ -16661,7 +16757,7 @@ <b> <a>1</a> <b>2</b> - <v>369419</v> + <v>369388</v> </b> </bs> </hist> @@ -16677,12 +16773,12 @@ <b> <a>1</a> <b>2</b> - <v>263071</v> + <v>263049</v> </b> <b> <a>2</a> <b>3</b> - <v>50841</v> + <v>50837</v> </b> <b> <a>3</a> @@ -16703,12 +16799,12 @@ <b> <a>1</a> <b>2</b> - <v>263071</v> + <v>263049</v> </b> <b> <a>2</a> <b>3</b> - <v>50841</v> + <v>50837</v> </b> <b> <a>3</a> @@ -16729,22 +16825,22 @@ <b> <a>1</a> <b>2</b> - <v>202434</v> + <v>202417</v> </b> <b> <a>2</a> <b>4</b> - <v>10728</v> + <v>10727</v> </b> <b> <a>4</a> <b>5</b> - <v>31251</v> + <v>31248</v> </b> <b> <a>5</a> <b>11</b> - <v>3265</v> + <v>3264</v> </b> </bs> </hist> @@ -16760,22 +16856,22 @@ <b> <a>1</a> <b>2</b> - <v>202434</v> + <v>202417</v> </b> <b> <a>2</a> <b>4</b> - <v>10728</v> + <v>10727</v> </b> <b> <a>4</a> <b>5</b> - <v>31251</v> + <v>31248</v> </b> <b> <a>5</a> <b>11</b> - <v>3265</v> + <v>3264</v> </b> </bs> </hist> @@ -16785,15 +16881,15 @@ </relation> <relation> <name>using_container</name> - <cardinality>462579</cardinality> + <cardinality>462471</cardinality> <columnsizes> <e> <k>parent</k> - <v>10951</v> + <v>10949</v> </e> <e> <k>child</k> - <v>293313</v> + <v>293245</v> </e> </columnsizes> <dependencies> @@ -16807,7 +16903,7 @@ <b> <a>1</a> <b>2</b> - <v>3266</v> + <v>3265</v> </b> <b> <a>2</a> @@ -16822,7 +16918,7 @@ <b> <a>6</a> <b>7</b> - <v>2472</v> + <v>2471</v> </b> <b> <a>7</a> @@ -16842,7 +16938,7 @@ <b> <a>179</a> <b>183</b> - <v>850</v> + <v>849</v> </b> <b> <a>201</a> @@ -16863,22 +16959,22 @@ <b> <a>1</a> <b>2</b> - <v>216338</v> + <v>216288</v> </b> <b> <a>2</a> <b>3</b> - <v>51257</v> + <v>51245</v> </b> <b> <a>3</a> <b>11</b> - <v>23603</v> + <v>23598</v> </b> <b> <a>13</a> <b>41</b> - <v>2114</v> + <v>2113</v> </b> </bs> </hist> @@ -16888,19 +16984,19 @@ </relation> <relation> <name>static_asserts</name> - <cardinality>134652</cardinality> + <cardinality>134648</cardinality> <columnsizes> <e> <k>id</k> - <v>134652</v> + <v>134648</v> </e> <e> <k>condition</k> - <v>134652</v> + <v>134648</v> </e> <e> <k>message</k> - <v>30221</v> + <v>30220</v> </e> <e> <k>location</k> @@ -16922,7 +17018,7 @@ <b> <a>1</a> <b>2</b> - <v>134652</v> + <v>134648</v> </b> </bs> </hist> @@ -16938,7 +17034,7 @@ <b> <a>1</a> <b>2</b> - <v>134652</v> + <v>134648</v> </b> </bs> </hist> @@ -16954,7 +17050,7 @@ <b> <a>1</a> <b>2</b> - <v>134652</v> + <v>134648</v> </b> </bs> </hist> @@ -16970,7 +17066,7 @@ <b> <a>1</a> <b>2</b> - <v>134652</v> + <v>134648</v> </b> </bs> </hist> @@ -16986,7 +17082,7 @@ <b> <a>1</a> <b>2</b> - <v>134652</v> + <v>134648</v> </b> </bs> </hist> @@ -17002,7 +17098,7 @@ <b> <a>1</a> <b>2</b> - <v>134652</v> + <v>134648</v> </b> </bs> </hist> @@ -17018,7 +17114,7 @@ <b> <a>1</a> <b>2</b> - <v>134652</v> + <v>134648</v> </b> </bs> </hist> @@ -17034,7 +17130,7 @@ <b> <a>1</a> <b>2</b> - <v>134652</v> + <v>134648</v> </b> </bs> </hist> @@ -17153,7 +17249,7 @@ <b> <a>1</a> <b>2</b> - <v>23664</v> + <v>23663</v> </b> <b> <a>2</a> @@ -17189,12 +17285,12 @@ <b> <a>1</a> <b>2</b> - <v>3288</v> + <v>3287</v> </b> <b> <a>2</a> <b>3</b> - <v>2831</v> + <v>2830</v> </b> <b> <a>3</a> @@ -17229,7 +17325,7 @@ <b> <a>17</a> <b>18</b> - <v>3434</v> + <v>3433</v> </b> <b> <a>19</a> @@ -17250,12 +17346,12 @@ <b> <a>1</a> <b>2</b> - <v>3288</v> + <v>3287</v> </b> <b> <a>2</a> <b>3</b> - <v>2831</v> + <v>2830</v> </b> <b> <a>3</a> @@ -17290,7 +17386,7 @@ <b> <a>17</a> <b>18</b> - <v>3434</v> + <v>3433</v> </b> <b> <a>19</a> @@ -17321,7 +17417,7 @@ <b> <a>3</a> <b>4</b> - <v>6081</v> + <v>6080</v> </b> <b> <a>4</a> @@ -17357,7 +17453,7 @@ <b> <a>4</a> <b>5</b> - <v>3707</v> + <v>3706</v> </b> <b> <a>5</a> @@ -17496,23 +17592,23 @@ </relation> <relation> <name>params</name> - <cardinality>6740045</cardinality> + <cardinality>6739471</cardinality> <columnsizes> <e> <k>id</k> - <v>6576325</v> + <v>6575765</v> </e> <e> <k>function</k> - <v>3879840</v> + <v>3879510</v> </e> <e> <k>index</k> - <v>7929</v> + <v>7928</v> </e> <e> <k>type_id</k> - <v>2188998</v> + <v>2188812</v> </e> </columnsizes> <dependencies> @@ -17526,7 +17622,7 @@ <b> <a>1</a> <b>2</b> - <v>6576325</v> + <v>6575765</v> </b> </bs> </hist> @@ -17542,7 +17638,7 @@ <b> <a>1</a> <b>2</b> - <v>6576325</v> + <v>6575765</v> </b> </bs> </hist> @@ -17558,12 +17654,12 @@ <b> <a>1</a> <b>2</b> - <v>6452719</v> + <v>6452169</v> </b> <b> <a>2</a> <b>4</b> - <v>123606</v> + <v>123595</v> </b> </bs> </hist> @@ -17579,22 +17675,22 @@ <b> <a>1</a> <b>2</b> - <v>2257099</v> + <v>2256906</v> </b> <b> <a>2</a> <b>3</b> - <v>952002</v> + <v>951921</v> </b> <b> <a>3</a> <b>4</b> - <v>429590</v> + <v>429553</v> </b> <b> <a>4</a> <b>18</b> - <v>241149</v> + <v>241128</v> </b> </bs> </hist> @@ -17610,22 +17706,22 @@ <b> <a>1</a> <b>2</b> - <v>2257099</v> + <v>2256906</v> </b> <b> <a>2</a> <b>3</b> - <v>952002</v> + <v>951921</v> </b> <b> <a>3</a> <b>4</b> - <v>429590</v> + <v>429553</v> </b> <b> <a>4</a> <b>18</b> - <v>241149</v> + <v>241128</v> </b> </bs> </hist> @@ -17641,22 +17737,22 @@ <b> <a>1</a> <b>2</b> - <v>2555153</v> + <v>2554936</v> </b> <b> <a>2</a> <b>3</b> - <v>826063</v> + <v>825993</v> </b> <b> <a>3</a> <b>4</b> - <v>346097</v> + <v>346068</v> </b> <b> <a>4</a> <b>12</b> - <v>152525</v> + <v>152512</v> </b> </bs> </hist> @@ -17910,22 +18006,22 @@ <b> <a>1</a> <b>2</b> - <v>1488407</v> + <v>1488280</v> </b> <b> <a>2</a> <b>3</b> - <v>440318</v> + <v>440281</v> </b> <b> <a>3</a> <b>8</b> - <v>170250</v> + <v>170235</v> </b> <b> <a>8</a> <b>518</b> - <v>90022</v> + <v>90015</v> </b> </bs> </hist> @@ -17941,22 +18037,22 @@ <b> <a>1</a> <b>2</b> - <v>1708100</v> + <v>1707954</v> </b> <b> <a>2</a> <b>3</b> - <v>248145</v> + <v>248124</v> </b> <b> <a>3</a> <b>9</b> - <v>168384</v> + <v>168370</v> </b> <b> <a>9</a> <b>502</b> - <v>64368</v> + <v>64363</v> </b> </bs> </hist> @@ -17972,17 +18068,17 @@ <b> <a>1</a> <b>2</b> - <v>1761740</v> + <v>1761590</v> </b> <b> <a>2</a> <b>3</b> - <v>348430</v> + <v>348400</v> </b> <b> <a>3</a> <b>13</b> - <v>78828</v> + <v>78821</v> </b> </bs> </hist> @@ -17992,15 +18088,15 @@ </relation> <relation> <name>overrides</name> - <cardinality>125864</cardinality> + <cardinality>125718</cardinality> <columnsizes> <e> <k>new</k> - <v>122888</v> + <v>122746</v> </e> <e> <k>old</k> - <v>9753</v> + <v>9742</v> </e> </columnsizes> <dependencies> @@ -18014,12 +18110,12 @@ <b> <a>1</a> <b>2</b> - <v>119920</v> + <v>119782</v> </b> <b> <a>2</a> <b>4</b> - <v>2967</v> + <v>2964</v> </b> </bs> </hist> @@ -18035,32 +18131,32 @@ <b> <a>1</a> <b>2</b> - <v>4293</v> + <v>4288</v> </b> <b> <a>2</a> <b>3</b> - <v>2100</v> + <v>2098</v> </b> <b> <a>3</a> <b>4</b> - <v>925</v> + <v>924</v> </b> <b> <a>4</a> <b>5</b> - <v>458</v> + <v>457</v> </b> <b> <a>5</a> <b>7</b> - <v>850</v> + <v>849</v> </b> <b> <a>7</a> <b>23</b> - <v>762</v> + <v>761</v> </b> <b> <a>25</a> @@ -18075,19 +18171,19 @@ </relation> <relation> <name>membervariables</name> - <cardinality>1056548</cardinality> + <cardinality>1056565</cardinality> <columnsizes> <e> <k>id</k> - <v>1054750</v> + <v>1054767</v> </e> <e> <k>type_id</k> - <v>327744</v> + <v>327749</v> </e> <e> <k>name</k> - <v>451642</v> + <v>451649</v> </e> </columnsizes> <dependencies> @@ -18101,7 +18197,7 @@ <b> <a>1</a> <b>2</b> - <v>1053032</v> + <v>1053049</v> </b> <b> <a>2</a> @@ -18122,7 +18218,7 @@ <b> <a>1</a> <b>2</b> - <v>1054750</v> + <v>1054767</v> </b> </bs> </hist> @@ -18138,17 +18234,17 @@ <b> <a>1</a> <b>2</b> - <v>243041</v> + <v>243045</v> </b> <b> <a>2</a> <b>3</b> - <v>51900</v> + <v>51901</v> </b> <b> <a>3</a> <b>10</b> - <v>25530</v> + <v>25531</v> </b> <b> <a>10</a> @@ -18169,17 +18265,17 @@ <b> <a>1</a> <b>2</b> - <v>255267</v> + <v>255271</v> </b> <b> <a>2</a> <b>3</b> - <v>46466</v> + <v>46467</v> </b> <b> <a>3</a> <b>40</b> - <v>24611</v> + <v>24612</v> </b> <b> <a>41</a> @@ -18200,17 +18296,17 @@ <b> <a>1</a> <b>2</b> - <v>295341</v> + <v>295346</v> </b> <b> <a>2</a> <b>3</b> - <v>86540</v> + <v>86542</v> </b> <b> <a>3</a> <b>5</b> - <v>41192</v> + <v>41193</v> </b> <b> <a>5</a> @@ -18231,12 +18327,12 @@ <b> <a>1</a> <b>2</b> - <v>367858</v> + <v>367864</v> </b> <b> <a>2</a> <b>3</b> - <v>51740</v> + <v>51741</v> </b> <b> <a>3</a> @@ -18422,19 +18518,19 @@ </relation> <relation> <name>localvariables</name> - <cardinality>576895</cardinality> + <cardinality>576915</cardinality> <columnsizes> <e> <k>id</k> - <v>576895</v> + <v>576915</v> </e> <e> <k>type_id</k> - <v>37592</v> + <v>37715</v> </e> <e> <k>name</k> - <v>90648</v> + <v>90543</v> </e> </columnsizes> <dependencies> @@ -18448,7 +18544,7 @@ <b> <a>1</a> <b>2</b> - <v>576895</v> + <v>576915</v> </b> </bs> </hist> @@ -18464,7 +18560,7 @@ <b> <a>1</a> <b>2</b> - <v>576895</v> + <v>576915</v> </b> </bs> </hist> @@ -18480,17 +18576,17 @@ <b> <a>1</a> <b>2</b> - <v>21032</v> + <v>21174</v> </b> <b> <a>2</a> <b>3</b> - <v>5372</v> + <v>5362</v> </b> <b> <a>3</a> <b>4</b> - <v>2459</v> + <v>2456</v> </b> <b> <a>4</a> @@ -18500,12 +18596,12 @@ <b> <a>7</a> <b>18</b> - <v>2855</v> + <v>2847</v> </b> <b> <a>18</a> - <b>15849</b> - <v>2492</v> + <b>15850</b> + <v>2493</v> </b> </bs> </hist> @@ -18521,27 +18617,27 @@ <b> <a>1</a> <b>2</b> - <v>26775</v> + <v>26907</v> </b> <b> <a>2</a> <b>3</b> - <v>4568</v> + <v>4562</v> </b> <b> <a>3</a> <b>5</b> - <v>2917</v> + <v>2918</v> </b> <b> <a>5</a> - <b>31</b> - <v>2821</v> + <b>33</b> + <v>2835</v> </b> <b> - <a>31</a> + <a>33</a> <b>3455</b> - <v>508</v> + <v>491</v> </b> </bs> </hist> @@ -18557,27 +18653,27 @@ <b> <a>1</a> <b>2</b> - <v>57094</v> + <v>57028</v> </b> <b> <a>2</a> <b>3</b> - <v>14300</v> + <v>14284</v> </b> <b> <a>3</a> <b>5</b> - <v>8319</v> + <v>8309</v> </b> <b> <a>5</a> <b>15</b> - <v>6989</v> + <v>6981</v> </b> <b> <a>15</a> <b>5178</b> - <v>3943</v> + <v>3938</v> </b> </bs> </hist> @@ -18593,17 +18689,17 @@ <b> <a>1</a> <b>2</b> - <v>76576</v> + <v>76488</v> </b> <b> <a>2</a> <b>3</b> - <v>7419</v> + <v>7410</v> </b> <b> <a>3</a> <b>1486</b> - <v>6652</v> + <v>6644</v> </b> </bs> </hist> @@ -18613,15 +18709,15 @@ </relation> <relation> <name>autoderivation</name> - <cardinality>147957</cardinality> + <cardinality>149570</cardinality> <columnsizes> <e> <k>var</k> - <v>147957</v> + <v>149570</v> </e> <e> <k>derivation_type</k> - <v>517</v> + <v>492</v> </e> </columnsizes> <dependencies> @@ -18635,7 +18731,7 @@ <b> <a>1</a> <b>2</b> - <v>147957</v> + <v>149570</v> </b> </bs> </hist> @@ -18649,29 +18745,29 @@ <budget>12</budget> <bs> <b> - <a>33</a> - <b>34</b> - <v>103</v> + <a>34</a> + <b>35</b> + <v>98</v> </b> <b> - <a>91</a> - <b>92</b> - <v>103</v> + <a>101</a> + <b>102</b> + <v>98</v> </b> <b> - <a>354</a> - <b>355</b> - <v>103</v> + <a>377</a> + <b>378</b> + <v>98</v> </b> <b> - <a>392</a> - <b>393</b> - <v>103</v> + <a>411</a> + <b>412</b> + <v>98</v> </b> <b> - <a>560</a> - <b>561</b> - <v>103</v> + <a>595</a> + <b>596</b> + <v>98</v> </b> </bs> </hist> @@ -18681,15 +18777,15 @@ </relation> <relation> <name>orphaned_variables</name> - <cardinality>37359</cardinality> + <cardinality>37338</cardinality> <columnsizes> <e> <k>var</k> - <v>37359</v> + <v>37338</v> </e> <e> <k>function</k> - <v>32837</v> + <v>32818</v> </e> </columnsizes> <dependencies> @@ -18703,7 +18799,7 @@ <b> <a>1</a> <b>2</b> - <v>37359</v> + <v>37338</v> </b> </bs> </hist> @@ -18719,12 +18815,12 @@ <b> <a>1</a> <b>2</b> - <v>30785</v> + <v>30767</v> </b> <b> <a>2</a> <b>47</b> - <v>2052</v> + <v>2051</v> </b> </bs> </hist> @@ -18734,11 +18830,11 @@ </relation> <relation> <name>enumconstants</name> - <cardinality>241682</cardinality> + <cardinality>241686</cardinality> <columnsizes> <e> <k>id</k> - <v>241682</v> + <v>241686</v> </e> <e> <k>parent</k> @@ -18754,11 +18850,11 @@ </e> <e> <k>name</k> - <v>241403</v> + <v>241407</v> </e> <e> <k>location</k> - <v>221585</v> + <v>221589</v> </e> </columnsizes> <dependencies> @@ -18772,7 +18868,7 @@ <b> <a>1</a> <b>2</b> - <v>241682</v> + <v>241686</v> </b> </bs> </hist> @@ -18788,7 +18884,7 @@ <b> <a>1</a> <b>2</b> - <v>241682</v> + <v>241686</v> </b> </bs> </hist> @@ -18804,7 +18900,7 @@ <b> <a>1</a> <b>2</b> - <v>241682</v> + <v>241686</v> </b> </bs> </hist> @@ -18820,7 +18916,7 @@ <b> <a>1</a> <b>2</b> - <v>241682</v> + <v>241686</v> </b> </bs> </hist> @@ -18836,7 +18932,7 @@ <b> <a>1</a> <b>2</b> - <v>241682</v> + <v>241686</v> </b> </bs> </hist> @@ -19137,12 +19233,12 @@ <b> <a>3</a> <b>4</b> - <v>1757</v> + <v>1758</v> </b> <b> <a>4</a> <b>5</b> - <v>878</v> + <v>879</v> </b> <b> <a>5</a> @@ -19157,7 +19253,7 @@ <b> <a>12</a> <b>20</b> - <v>878</v> + <v>879</v> </b> <b> <a>20</a> @@ -19193,12 +19289,12 @@ <b> <a>3</a> <b>4</b> - <v>1757</v> + <v>1758</v> </b> <b> <a>4</a> <b>5</b> - <v>878</v> + <v>879</v> </b> <b> <a>5</a> @@ -19213,7 +19309,7 @@ <b> <a>12</a> <b>20</b> - <v>878</v> + <v>879</v> </b> <b> <a>20</a> @@ -19265,12 +19361,12 @@ <b> <a>3</a> <b>4</b> - <v>1757</v> + <v>1758</v> </b> <b> <a>4</a> <b>5</b> - <v>878</v> + <v>879</v> </b> <b> <a>5</a> @@ -19285,7 +19381,7 @@ <b> <a>12</a> <b>20</b> - <v>878</v> + <v>879</v> </b> <b> <a>20</a> @@ -19321,12 +19417,12 @@ <b> <a>3</a> <b>4</b> - <v>1757</v> + <v>1758</v> </b> <b> <a>4</a> <b>5</b> - <v>878</v> + <v>879</v> </b> <b> <a>5</a> @@ -19341,7 +19437,7 @@ <b> <a>12</a> <b>20</b> - <v>878</v> + <v>879</v> </b> <b> <a>20</a> @@ -19447,7 +19543,7 @@ <b> <a>1</a> <b>2</b> - <v>241123</v> + <v>241127</v> </b> <b> <a>2</a> @@ -19468,7 +19564,7 @@ <b> <a>1</a> <b>2</b> - <v>241123</v> + <v>241127</v> </b> <b> <a>2</a> @@ -19489,7 +19585,7 @@ <b> <a>1</a> <b>2</b> - <v>241403</v> + <v>241407</v> </b> </bs> </hist> @@ -19505,7 +19601,7 @@ <b> <a>1</a> <b>2</b> - <v>241403</v> + <v>241407</v> </b> </bs> </hist> @@ -19521,7 +19617,7 @@ <b> <a>1</a> <b>2</b> - <v>241123</v> + <v>241127</v> </b> <b> <a>2</a> @@ -19542,7 +19638,7 @@ <b> <a>1</a> <b>2</b> - <v>220826</v> + <v>220830</v> </b> <b> <a>2</a> @@ -19563,7 +19659,7 @@ <b> <a>1</a> <b>2</b> - <v>221585</v> + <v>221589</v> </b> </bs> </hist> @@ -19579,7 +19675,7 @@ <b> <a>1</a> <b>2</b> - <v>220826</v> + <v>220830</v> </b> <b> <a>2</a> @@ -19600,7 +19696,7 @@ <b> <a>1</a> <b>2</b> - <v>221585</v> + <v>221589</v> </b> </bs> </hist> @@ -19616,7 +19712,7 @@ <b> <a>1</a> <b>2</b> - <v>220826</v> + <v>220830</v> </b> <b> <a>2</a> @@ -19631,23 +19727,23 @@ </relation> <relation> <name>builtintypes</name> - <cardinality>26120</cardinality> + <cardinality>26118</cardinality> <columnsizes> <e> <k>id</k> - <v>26120</v> + <v>26118</v> </e> <e> <k>name</k> - <v>26120</v> + <v>26118</v> </e> <e> <k>kind</k> - <v>26120</v> + <v>26118</v> </e> <e> <k>size</k> - <v>3265</v> + <v>3264</v> </e> <e> <k>sign</k> @@ -19655,7 +19751,7 @@ </e> <e> <k>alignment</k> - <v>2332</v> + <v>2331</v> </e> </columnsizes> <dependencies> @@ -19669,7 +19765,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19685,7 +19781,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19701,7 +19797,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19717,7 +19813,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19733,7 +19829,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19749,7 +19845,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19765,7 +19861,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19781,7 +19877,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19797,7 +19893,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19813,7 +19909,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19829,7 +19925,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19845,7 +19941,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19861,7 +19957,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19877,7 +19973,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -19893,7 +19989,7 @@ <b> <a>1</a> <b>2</b> - <v>26120</v> + <v>26118</v> </b> </bs> </hist> @@ -20052,7 +20148,7 @@ <b> <a>3</a> <b>4</b> - <v>2332</v> + <v>2331</v> </b> </bs> </hist> @@ -20312,7 +20408,7 @@ <b> <a>2</a> <b>3</b> - <v>2332</v> + <v>2331</v> </b> </bs> </hist> @@ -20328,7 +20424,7 @@ <b> <a>3</a> <b>4</b> - <v>2332</v> + <v>2331</v> </b> </bs> </hist> @@ -20338,15 +20434,15 @@ </relation> <relation> <name>derivedtypes</name> - <cardinality>4330887</cardinality> + <cardinality>4330518</cardinality> <columnsizes> <e> <k>id</k> - <v>4330887</v> + <v>4330518</v> </e> <e> <k>name</k> - <v>2161012</v> + <v>2160828</v> </e> <e> <k>kind</k> @@ -20354,7 +20450,7 @@ </e> <e> <k>type_id</k> - <v>2670830</v> + <v>2670603</v> </e> </columnsizes> <dependencies> @@ -20368,7 +20464,7 @@ <b> <a>1</a> <b>2</b> - <v>4330887</v> + <v>4330518</v> </b> </bs> </hist> @@ -20384,7 +20480,7 @@ <b> <a>1</a> <b>2</b> - <v>4330887</v> + <v>4330518</v> </b> </bs> </hist> @@ -20400,7 +20496,7 @@ <b> <a>1</a> <b>2</b> - <v>4330887</v> + <v>4330518</v> </b> </bs> </hist> @@ -20416,17 +20512,17 @@ <b> <a>1</a> <b>2</b> - <v>1899340</v> + <v>1899178</v> </b> <b> <a>2</a> <b>5</b> - <v>164653</v> + <v>164638</v> </b> <b> <a>5</a> <b>1153</b> - <v>97019</v> + <v>97011</v> </b> </bs> </hist> @@ -20442,7 +20538,7 @@ <b> <a>1</a> <b>2</b> - <v>2160079</v> + <v>2159895</v> </b> <b> <a>2</a> @@ -20463,17 +20559,17 @@ <b> <a>1</a> <b>2</b> - <v>1899340</v> + <v>1899178</v> </b> <b> <a>2</a> <b>5</b> - <v>164653</v> + <v>164638</v> </b> <b> <a>5</a> <b>1135</b> - <v>97019</v> + <v>97011</v> </b> </bs> </hist> @@ -20612,22 +20708,22 @@ <b> <a>1</a> <b>2</b> - <v>1651194</v> + <v>1651053</v> </b> <b> <a>2</a> <b>3</b> - <v>560193</v> + <v>560145</v> </b> <b> <a>3</a> <b>4</b> - <v>354027</v> + <v>353997</v> </b> <b> <a>4</a> <b>72</b> - <v>105415</v> + <v>105406</v> </b> </bs> </hist> @@ -20643,22 +20739,22 @@ <b> <a>1</a> <b>2</b> - <v>1662389</v> + <v>1662247</v> </b> <b> <a>2</a> <b>3</b> - <v>552730</v> + <v>552683</v> </b> <b> <a>3</a> <b>4</b> - <v>351228</v> + <v>351198</v> </b> <b> <a>4</a> <b>72</b> - <v>104482</v> + <v>104473</v> </b> </bs> </hist> @@ -20674,22 +20770,22 @@ <b> <a>1</a> <b>2</b> - <v>1655392</v> + <v>1655251</v> </b> <b> <a>2</a> <b>3</b> - <v>563924</v> + <v>563876</v> </b> <b> <a>3</a> <b>4</b> - <v>353094</v> + <v>353064</v> </b> <b> <a>4</a> <b>6</b> - <v>98418</v> + <v>98410</v> </b> </bs> </hist> @@ -20699,11 +20795,11 @@ </relation> <relation> <name>pointerishsize</name> - <cardinality>3210500</cardinality> + <cardinality>3210227</cardinality> <columnsizes> <e> <k>id</k> - <v>3210500</v> + <v>3210227</v> </e> <e> <k>size</k> @@ -20725,7 +20821,7 @@ <b> <a>1</a> <b>2</b> - <v>3210500</v> + <v>3210227</v> </b> </bs> </hist> @@ -20741,7 +20837,7 @@ <b> <a>1</a> <b>2</b> - <v>3210500</v> + <v>3210227</v> </b> </bs> </hist> @@ -20815,19 +20911,19 @@ </relation> <relation> <name>arraysizes</name> - <cardinality>88157</cardinality> + <cardinality>88149</cardinality> <columnsizes> <e> <k>id</k> - <v>88157</v> + <v>88149</v> </e> <e> <k>num_elements</k> - <v>31717</v> + <v>31715</v> </e> <e> <k>bytesize</k> - <v>33117</v> + <v>33114</v> </e> <e> <k>alignment</k> @@ -20845,7 +20941,7 @@ <b> <a>1</a> <b>2</b> - <v>88157</v> + <v>88149</v> </b> </bs> </hist> @@ -20861,7 +20957,7 @@ <b> <a>1</a> <b>2</b> - <v>88157</v> + <v>88149</v> </b> </bs> </hist> @@ -20877,7 +20973,7 @@ <b> <a>1</a> <b>2</b> - <v>88157</v> + <v>88149</v> </b> </bs> </hist> @@ -20898,7 +20994,7 @@ <b> <a>2</a> <b>3</b> - <v>23788</v> + <v>23786</v> </b> <b> <a>3</a> @@ -20929,12 +21025,12 @@ <b> <a>1</a> <b>2</b> - <v>26587</v> + <v>26584</v> </b> <b> <a>2</a> <b>3</b> - <v>2332</v> + <v>2331</v> </b> <b> <a>3</a> @@ -20955,7 +21051,7 @@ <b> <a>1</a> <b>2</b> - <v>26587</v> + <v>26584</v> </b> <b> <a>2</a> @@ -20965,7 +21061,7 @@ <b> <a>3</a> <b>5</b> - <v>2332</v> + <v>2331</v> </b> </bs> </hist> @@ -20986,17 +21082,17 @@ <b> <a>2</a> <b>3</b> - <v>23788</v> + <v>23786</v> </b> <b> <a>3</a> <b>4</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>4</a> <b>6</b> - <v>2332</v> + <v>2331</v> </b> <b> <a>7</a> @@ -21017,7 +21113,7 @@ <b> <a>1</a> <b>2</b> - <v>27519</v> + <v>27517</v> </b> <b> <a>2</a> @@ -21043,12 +21139,12 @@ <b> <a>1</a> <b>2</b> - <v>27519</v> + <v>27517</v> </b> <b> <a>2</a> <b>3</b> - <v>4664</v> + <v>4663</v> </b> <b> <a>4</a> @@ -21151,15 +21247,15 @@ </relation> <relation> <name>typedefbase</name> - <cardinality>1672135</cardinality> + <cardinality>1671747</cardinality> <columnsizes> <e> <k>id</k> - <v>1672135</v> + <v>1671747</v> </e> <e> <k>type_id</k> - <v>787114</v> + <v>786932</v> </e> </columnsizes> <dependencies> @@ -21173,7 +21269,7 @@ <b> <a>1</a> <b>2</b> - <v>1672135</v> + <v>1671747</v> </b> </bs> </hist> @@ -21189,22 +21285,22 @@ <b> <a>1</a> <b>2</b> - <v>612558</v> + <v>612416</v> </b> <b> <a>2</a> <b>3</b> - <v>82557</v> + <v>82538</v> </b> <b> <a>3</a> <b>6</b> - <v>61481</v> + <v>61467</v> </b> <b> <a>6</a> <b>5437</b> - <v>30517</v> + <v>30510</v> </b> </bs> </hist> @@ -21214,23 +21310,23 @@ </relation> <relation> <name>decltypes</name> - <cardinality>165808</cardinality> + <cardinality>165094</cardinality> <columnsizes> <e> <k>id</k> - <v>16658</v> + <v>16587</v> </e> <e> <k>expr</k> - <v>165808</v> + <v>165094</v> </e> <e> <k>base_type</k> - <v>9945</v> + <v>9903</v> </e> <e> <k>parentheses_would_change_meaning</k> - <v>19</v> + <v>18</v> </e> </columnsizes> <dependencies> @@ -21244,37 +21340,37 @@ <b> <a>1</a> <b>2</b> - <v>5077</v> + <v>5055</v> </b> <b> <a>2</a> <b>3</b> - <v>6180</v> + <v>6153</v> </b> <b> <a>3</a> <b>5</b> - <v>1102</v> + <v>1098</v> </b> <b> <a>5</a> <b>12</b> - <v>1293</v> + <v>1287</v> </b> <b> <a>12</a> <b>18</b> - <v>1350</v> + <v>1344</v> </b> <b> <a>18</a> <b>46</b> - <v>1255</v> + <v>1249</v> </b> <b> <a>51</a> <b>740</b> - <v>399</v> + <v>397</v> </b> </bs> </hist> @@ -21290,7 +21386,7 @@ <b> <a>1</a> <b>2</b> - <v>16658</v> + <v>16587</v> </b> </bs> </hist> @@ -21306,7 +21402,7 @@ <b> <a>1</a> <b>2</b> - <v>16658</v> + <v>16587</v> </b> </bs> </hist> @@ -21322,7 +21418,7 @@ <b> <a>1</a> <b>2</b> - <v>165808</v> + <v>165094</v> </b> </bs> </hist> @@ -21338,7 +21434,7 @@ <b> <a>1</a> <b>2</b> - <v>165808</v> + <v>165094</v> </b> </bs> </hist> @@ -21354,7 +21450,7 @@ <b> <a>1</a> <b>2</b> - <v>165808</v> + <v>165094</v> </b> </bs> </hist> @@ -21370,17 +21466,17 @@ <b> <a>1</a> <b>2</b> - <v>7226</v> + <v>7195</v> </b> <b> <a>2</a> <b>3</b> - <v>2263</v> + <v>2253</v> </b> <b> <a>4</a> <b>149</b> - <v>456</v> + <v>454</v> </b> </bs> </hist> @@ -21396,37 +21492,37 @@ <b> <a>1</a> <b>2</b> - <v>722</v> + <v>719</v> </b> <b> <a>2</a> <b>3</b> - <v>6123</v> + <v>6097</v> </b> <b> <a>3</a> <b>4</b> - <v>342</v> + <v>340</v> </b> <b> <a>4</a> <b>5</b> - <v>969</v> + <v>965</v> </b> <b> <a>5</a> <b>7</b> - <v>760</v> + <v>757</v> </b> <b> <a>7</a> <b>32</b> - <v>798</v> + <v>795</v> </b> <b> <a>32</a> <b>3888</b> - <v>228</v> + <v>227</v> </b> </bs> </hist> @@ -21442,7 +21538,7 @@ <b> <a>1</a> <b>2</b> - <v>9945</v> + <v>9903</v> </b> </bs> </hist> @@ -21458,7 +21554,7 @@ <b> <a>876</a> <b>877</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -21474,7 +21570,7 @@ <b> <a>8719</a> <b>8720</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -21490,7 +21586,7 @@ <b> <a>523</a> <b>524</b> - <v>19</v> + <v>18</v> </b> </bs> </hist> @@ -21500,15 +21596,15 @@ </relation> <relation> <name>usertypes</name> - <cardinality>5230182</cardinality> + <cardinality>5228803</cardinality> <columnsizes> <e> <k>id</k> - <v>5230182</v> + <v>5228803</v> </e> <e> <k>name</k> - <v>1351274</v> + <v>1351159</v> </e> <e> <k>kind</k> @@ -21526,7 +21622,7 @@ <b> <a>1</a> <b>2</b> - <v>5230182</v> + <v>5228803</v> </b> </bs> </hist> @@ -21542,7 +21638,7 @@ <b> <a>1</a> <b>2</b> - <v>5230182</v> + <v>5228803</v> </b> </bs> </hist> @@ -21558,27 +21654,27 @@ <b> <a>1</a> <b>2</b> - <v>982787</v> + <v>982703</v> </b> <b> <a>2</a> <b>3</b> - <v>153458</v> + <v>153445</v> </b> <b> <a>3</a> <b>7</b> - <v>104482</v> + <v>104473</v> </b> <b> <a>7</a> <b>61</b> - <v>101683</v> + <v>101675</v> </b> <b> <a>65</a> <b>874</b> - <v>8862</v> + <v>8861</v> </b> </bs> </hist> @@ -21594,17 +21690,17 @@ <b> <a>1</a> <b>2</b> - <v>1210876</v> + <v>1210772</v> </b> <b> <a>2</a> <b>3</b> - <v>125005</v> + <v>125461</v> </b> <b> <a>3</a> <b>7</b> - <v>15392</v> + <v>14924</v> </b> </bs> </hist> @@ -21638,8 +21734,8 @@ <v>466</v> </b> <b> - <a>135</a> - <b>136</b> + <a>133</a> + <b>134</b> <v>466</v> </b> <b> @@ -21704,8 +21800,8 @@ <v>466</v> </b> <b> - <a>43</a> - <b>44</b> + <a>41</a> + <b>42</b> <v>466</v> </b> <b> @@ -21746,19 +21842,19 @@ </relation> <relation> <name>usertypesize</name> - <cardinality>1705768</cardinality> + <cardinality>1704689</cardinality> <columnsizes> <e> <k>id</k> - <v>1705768</v> + <v>1704689</v> </e> <e> <k>size</k> - <v>13526</v> + <v>13525</v> </e> <e> <k>alignment</k> - <v>2332</v> + <v>2331</v> </e> </columnsizes> <dependencies> @@ -21772,7 +21868,7 @@ <b> <a>1</a> <b>2</b> - <v>1705768</v> + <v>1704689</v> </b> </bs> </hist> @@ -21788,7 +21884,7 @@ <b> <a>1</a> <b>2</b> - <v>1705768</v> + <v>1704689</v> </b> </bs> </hist> @@ -21804,7 +21900,7 @@ <b> <a>1</a> <b>2</b> - <v>3265</v> + <v>3264</v> </b> <b> <a>2</a> @@ -21843,7 +21939,7 @@ </b> <b> <a>740</a> - <b>2472</b> + <b>2470</b> <v>932</v> </b> </bs> @@ -21860,7 +21956,7 @@ <b> <a>1</a> <b>2</b> - <v>10261</v> + <v>10260</v> </b> <b> <a>2</a> @@ -21904,8 +22000,8 @@ <v>466</v> </b> <b> - <a>3211</a> - <b>3212</b> + <a>3209</a> + <b>3210</b> <v>466</v> </b> </bs> @@ -21952,26 +22048,26 @@ </relation> <relation> <name>usertype_final</name> - <cardinality>9415</cardinality> + <cardinality>8966</cardinality> <columnsizes> <e> <k>id</k> - <v>9415</v> + <v>8966</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>usertype_uuid</name> - <cardinality>36638</cardinality> + <cardinality>36637</cardinality> <columnsizes> <e> <k>id</k> - <v>36638</v> + <v>36637</v> </e> <e> <k>uuid</k> - <v>36264</v> + <v>36263</v> </e> </columnsizes> <dependencies> @@ -21985,7 +22081,7 @@ <b> <a>1</a> <b>2</b> - <v>36638</v> + <v>36637</v> </b> </bs> </hist> @@ -22001,7 +22097,7 @@ <b> <a>1</a> <b>2</b> - <v>35889</v> + <v>35888</v> </b> <b> <a>2</a> @@ -22016,15 +22112,15 @@ </relation> <relation> <name>mangled_name</name> - <cardinality>9478043</cardinality> + <cardinality>9476303</cardinality> <columnsizes> <e> <k>id</k> - <v>9478043</v> + <v>9476303</v> </e> <e> <k>mangled_name</k> - <v>6448521</v> + <v>6447972</v> </e> <e> <k>is_complete</k> @@ -22042,7 +22138,7 @@ <b> <a>1</a> <b>2</b> - <v>9478043</v> + <v>9476303</v> </b> </bs> </hist> @@ -22058,7 +22154,7 @@ <b> <a>1</a> <b>2</b> - <v>9478043</v> + <v>9476303</v> </b> </bs> </hist> @@ -22074,12 +22170,12 @@ <b> <a>1</a> <b>2</b> - <v>6167725</v> + <v>6167199</v> </b> <b> <a>2</a> <b>874</b> - <v>280796</v> + <v>280772</v> </b> </bs> </hist> @@ -22095,7 +22191,7 @@ <b> <a>1</a> <b>2</b> - <v>6448521</v> + <v>6447972</v> </b> </bs> </hist> @@ -22109,8 +22205,8 @@ <budget>12</budget> <bs> <b> - <a>20320</a> - <b>20321</b> + <a>20318</a> + <b>20319</b> <v>466</v> </b> </bs> @@ -22137,59 +22233,59 @@ </relation> <relation> <name>is_pod_class</name> - <cardinality>530515</cardinality> + <cardinality>530392</cardinality> <columnsizes> <e> <k>id</k> - <v>530515</v> + <v>530392</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>is_standard_layout_class</name> - <cardinality>1253788</cardinality> + <cardinality>1252748</cardinality> <columnsizes> <e> <k>id</k> - <v>1253788</v> + <v>1252748</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>is_complete</name> - <cardinality>1645130</cardinality> + <cardinality>1644057</cardinality> <columnsizes> <e> <k>id</k> - <v>1645130</v> + <v>1644057</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>is_class_template</name> - <cardinality>397872</cardinality> + <cardinality>397838</cardinality> <columnsizes> <e> <k>id</k> - <v>397872</v> + <v>397838</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>class_instantiation</name> - <cardinality>1088668</cardinality> + <cardinality>1088576</cardinality> <columnsizes> <e> <k>to</k> - <v>1088668</v> + <v>1088576</v> </e> <e> <k>from</k> - <v>168384</v> + <v>168370</v> </e> </columnsizes> <dependencies> @@ -22203,7 +22299,7 @@ <b> <a>1</a> <b>2</b> - <v>1088668</v> + <v>1088576</v> </b> </bs> </hist> @@ -22219,42 +22315,42 @@ <b> <a>1</a> <b>2</b> - <v>59704</v> + <v>59699</v> </b> <b> <a>2</a> <b>3</b> - <v>29385</v> + <v>29383</v> </b> <b> <a>3</a> <b>4</b> - <v>15858</v> + <v>15857</v> </b> <b> <a>4</a> <b>5</b> - <v>13060</v> + <v>13059</v> </b> <b> <a>5</a> <b>6</b> - <v>9795</v> + <v>9794</v> </b> <b> <a>6</a> <b>10</b> - <v>12593</v> + <v>12592</v> </b> <b> <a>10</a> <b>16</b> - <v>13060</v> + <v>13059</v> </b> <b> <a>16</a> <b>70</b> - <v>13526</v> + <v>13525</v> </b> <b> <a>70</a> @@ -22269,11 +22365,11 @@ </relation> <relation> <name>class_template_argument</name> - <cardinality>2857953</cardinality> + <cardinality>2857290</cardinality> <columnsizes> <e> <k>type_id</k> - <v>1304340</v> + <v>1304038</v> </e> <e> <k>index</k> @@ -22281,7 +22377,7 @@ </e> <e> <k>arg_type</k> - <v>832912</v> + <v>832719</v> </e> </columnsizes> <dependencies> @@ -22295,27 +22391,27 @@ <b> <a>1</a> <b>2</b> - <v>536388</v> + <v>536264</v> </b> <b> <a>2</a> <b>3</b> - <v>395940</v> + <v>395848</v> </b> <b> <a>3</a> <b>4</b> - <v>229337</v> + <v>229284</v> </b> <b> <a>4</a> <b>7</b> - <v>119283</v> + <v>119255</v> </b> <b> <a>7</a> <b>113</b> - <v>23391</v> + <v>23385</v> </b> </bs> </hist> @@ -22331,22 +22427,22 @@ <b> <a>1</a> <b>2</b> - <v>562800</v> + <v>562669</v> </b> <b> <a>2</a> <b>3</b> - <v>407082</v> + <v>406987</v> </b> <b> <a>3</a> <b>4</b> - <v>242660</v> + <v>242604</v> </b> <b> <a>4</a> <b>113</b> - <v>91797</v> + <v>91776</v> </b> </bs> </hist> @@ -22454,27 +22550,27 @@ <b> <a>1</a> <b>2</b> - <v>518534</v> + <v>518414</v> </b> <b> <a>2</a> <b>3</b> - <v>172856</v> + <v>172815</v> </b> <b> <a>3</a> <b>4</b> - <v>50865</v> + <v>50853</v> </b> <b> <a>4</a> <b>10</b> - <v>63495</v> + <v>63480</v> </b> <b> <a>10</a> <b>10265</b> - <v>27161</v> + <v>27154</v> </b> </bs> </hist> @@ -22490,17 +22586,17 @@ <b> <a>1</a> <b>2</b> - <v>734146</v> + <v>733975</v> </b> <b> <a>2</a> <b>3</b> - <v>80599</v> + <v>80581</v> </b> <b> <a>3</a> <b>22</b> - <v>18167</v> + <v>18162</v> </b> </bs> </hist> @@ -22510,11 +22606,11 @@ </relation> <relation> <name>class_template_argument_value</name> - <cardinality>494891</cardinality> + <cardinality>494849</cardinality> <columnsizes> <e> <k>type_id</k> - <v>304584</v> + <v>304558</v> </e> <e> <k>index</k> @@ -22522,7 +22618,7 @@ </e> <e> <k>arg_value</k> - <v>494891</v> + <v>494849</v> </e> </columnsizes> <dependencies> @@ -22536,12 +22632,12 @@ <b> <a>1</a> <b>2</b> - <v>249544</v> + <v>249523</v> </b> <b> <a>2</a> <b>3</b> - <v>53174</v> + <v>53169</v> </b> <b> <a>3</a> @@ -22562,22 +22658,22 @@ <b> <a>1</a> <b>2</b> - <v>189374</v> + <v>189358</v> </b> <b> <a>2</a> <b>3</b> - <v>81160</v> + <v>81153</v> </b> <b> <a>3</a> <b>4</b> - <v>12127</v> + <v>12126</v> </b> <b> <a>4</a> <b>9</b> - <v>21922</v> + <v>21920</v> </b> </bs> </hist> @@ -22655,7 +22751,7 @@ <b> <a>1</a> <b>2</b> - <v>494891</v> + <v>494849</v> </b> </bs> </hist> @@ -22671,7 +22767,7 @@ <b> <a>1</a> <b>2</b> - <v>494891</v> + <v>494849</v> </b> </bs> </hist> @@ -22681,15 +22777,15 @@ </relation> <relation> <name>is_proxy_class_for</name> - <cardinality>62969</cardinality> + <cardinality>62031</cardinality> <columnsizes> <e> <k>id</k> - <v>62969</v> + <v>62031</v> </e> <e> <k>templ_param_id</k> - <v>62969</v> + <v>62031</v> </e> </columnsizes> <dependencies> @@ -22703,7 +22799,7 @@ <b> <a>1</a> <b>2</b> - <v>62969</v> + <v>62031</v> </b> </bs> </hist> @@ -22719,7 +22815,7 @@ <b> <a>1</a> <b>2</b> - <v>62969</v> + <v>62031</v> </b> </bs> </hist> @@ -22729,19 +22825,19 @@ </relation> <relation> <name>type_mentions</name> - <cardinality>4029338</cardinality> + <cardinality>4029404</cardinality> <columnsizes> <e> <k>id</k> - <v>4029338</v> + <v>4029404</v> </e> <e> <k>type_id</k> - <v>198212</v> + <v>198215</v> </e> <e> <k>location</k> - <v>3995817</v> + <v>3995882</v> </e> <e> <k>kind</k> @@ -22759,7 +22855,7 @@ <b> <a>1</a> <b>2</b> - <v>4029338</v> + <v>4029404</v> </b> </bs> </hist> @@ -22775,7 +22871,7 @@ <b> <a>1</a> <b>2</b> - <v>4029338</v> + <v>4029404</v> </b> </bs> </hist> @@ -22791,7 +22887,7 @@ <b> <a>1</a> <b>2</b> - <v>4029338</v> + <v>4029404</v> </b> </bs> </hist> @@ -22807,7 +22903,7 @@ <b> <a>1</a> <b>2</b> - <v>97608</v> + <v>97609</v> </b> <b> <a>2</a> @@ -22832,7 +22928,7 @@ <b> <a>7</a> <b>12</b> - <v>15861</v> + <v>15862</v> </b> <b> <a>12</a> @@ -22858,7 +22954,7 @@ <b> <a>1</a> <b>2</b> - <v>97608</v> + <v>97609</v> </b> <b> <a>2</a> @@ -22883,7 +22979,7 @@ <b> <a>7</a> <b>12</b> - <v>15861</v> + <v>15862</v> </b> <b> <a>12</a> @@ -22909,7 +23005,7 @@ <b> <a>1</a> <b>2</b> - <v>198212</v> + <v>198215</v> </b> </bs> </hist> @@ -22925,12 +23021,12 @@ <b> <a>1</a> <b>2</b> - <v>3962295</v> + <v>3962360</v> </b> <b> <a>2</a> <b>3</b> - <v>33521</v> + <v>33522</v> </b> </bs> </hist> @@ -22946,12 +23042,12 @@ <b> <a>1</a> <b>2</b> - <v>3962295</v> + <v>3962360</v> </b> <b> <a>2</a> <b>3</b> - <v>33521</v> + <v>33522</v> </b> </bs> </hist> @@ -22967,7 +23063,7 @@ <b> <a>1</a> <b>2</b> - <v>3995817</v> + <v>3995882</v> </b> </bs> </hist> @@ -23025,26 +23121,26 @@ </relation> <relation> <name>is_function_template</name> - <cardinality>1401649</cardinality> + <cardinality>1401530</cardinality> <columnsizes> <e> <k>id</k> - <v>1401649</v> + <v>1401530</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>function_instantiation</name> - <cardinality>894647</cardinality> + <cardinality>894135</cardinality> <columnsizes> <e> <k>to</k> - <v>894647</v> + <v>894135</v> </e> <e> <k>from</k> - <v>144220</v> + <v>144138</v> </e> </columnsizes> <dependencies> @@ -23058,7 +23154,7 @@ <b> <a>1</a> <b>2</b> - <v>894647</v> + <v>894135</v> </b> </bs> </hist> @@ -23074,27 +23170,27 @@ <b> <a>1</a> <b>2</b> - <v>100008</v> + <v>99951</v> </b> <b> <a>2</a> <b>3</b> - <v>14227</v> + <v>14219</v> </b> <b> <a>3</a> <b>6</b> - <v>11861</v> + <v>11855</v> </b> <b> <a>6</a> <b>21</b> - <v>11896</v> + <v>11889</v> </b> <b> <a>22</a> <b>870</b> - <v>6226</v> + <v>6223</v> </b> </bs> </hist> @@ -23104,11 +23200,11 @@ </relation> <relation> <name>function_template_argument</name> - <cardinality>2310067</cardinality> + <cardinality>2308747</cardinality> <columnsizes> <e> <k>function_id</k> - <v>1319621</v> + <v>1318866</v> </e> <e> <k>index</k> @@ -23116,7 +23212,7 @@ </e> <e> <k>arg_type</k> - <v>300789</v> + <v>300617</v> </e> </columnsizes> <dependencies> @@ -23130,22 +23226,22 @@ <b> <a>1</a> <b>2</b> - <v>673411</v> + <v>673026</v> </b> <b> <a>2</a> <b>3</b> - <v>389910</v> + <v>389687</v> </b> <b> <a>3</a> <b>4</b> - <v>186519</v> + <v>186413</v> </b> <b> <a>4</a> <b>15</b> - <v>69779</v> + <v>69739</v> </b> </bs> </hist> @@ -23161,22 +23257,22 @@ <b> <a>1</a> <b>2</b> - <v>690804</v> + <v>690409</v> </b> <b> <a>2</a> <b>3</b> - <v>399684</v> + <v>399456</v> </b> <b> <a>3</a> <b>4</b> - <v>166622</v> + <v>166527</v> </b> <b> <a>4</a> <b>9</b> - <v>62509</v> + <v>62473</v> </b> </bs> </hist> @@ -23324,32 +23420,32 @@ <b> <a>1</a> <b>2</b> - <v>184258</v> + <v>184153</v> </b> <b> <a>2</a> <b>3</b> - <v>44038</v> + <v>44013</v> </b> <b> <a>3</a> <b>5</b> - <v>23167</v> + <v>23153</v> </b> <b> <a>5</a> <b>16</b> - <v>23201</v> + <v>23188</v> </b> <b> <a>16</a> <b>107</b> - <v>22714</v> + <v>22701</v> </b> <b> <a>108</a> <b>957</b> - <v>3408</v> + <v>3407</v> </b> </bs> </hist> @@ -23365,17 +23461,17 @@ <b> <a>1</a> <b>2</b> - <v>271048</v> + <v>270893</v> </b> <b> <a>2</a> <b>4</b> - <v>25671</v> + <v>25656</v> </b> <b> <a>4</a> <b>17</b> - <v>4069</v> + <v>4067</v> </b> </bs> </hist> @@ -23385,11 +23481,11 @@ </relation> <relation> <name>function_template_argument_value</name> - <cardinality>358464</cardinality> + <cardinality>358259</cardinality> <columnsizes> <e> <k>function_id</k> - <v>192467</v> + <v>192357</v> </e> <e> <k>index</k> @@ -23397,7 +23493,7 @@ </e> <e> <k>arg_value</k> - <v>355855</v> + <v>355651</v> </e> </columnsizes> <dependencies> @@ -23411,12 +23507,12 @@ <b> <a>1</a> <b>2</b> - <v>183215</v> + <v>183110</v> </b> <b> <a>2</a> <b>8</b> - <v>9252</v> + <v>9247</v> </b> </bs> </hist> @@ -23432,17 +23528,17 @@ <b> <a>1</a> <b>2</b> - <v>175875</v> + <v>175774</v> </b> <b> <a>2</a> <b>31</b> - <v>15096</v> + <v>15088</v> </b> <b> <a>32</a> <b>97</b> - <v>1495</v> + <v>1494</v> </b> </bs> </hist> @@ -23580,12 +23676,12 @@ <b> <a>1</a> <b>2</b> - <v>353246</v> + <v>353044</v> </b> <b> <a>2</a> <b>3</b> - <v>2608</v> + <v>2607</v> </b> </bs> </hist> @@ -23601,7 +23697,7 @@ <b> <a>1</a> <b>2</b> - <v>355855</v> + <v>355651</v> </b> </bs> </hist> @@ -23611,26 +23707,26 @@ </relation> <relation> <name>is_variable_template</name> - <cardinality>46973</cardinality> + <cardinality>40299</cardinality> <columnsizes> <e> <k>id</k> - <v>46973</v> + <v>40299</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>variable_instantiation</name> - <cardinality>171237</cardinality> + <cardinality>178341</cardinality> <columnsizes> <e> <k>to</k> - <v>171237</v> + <v>178341</v> </e> <e> <k>from</k> - <v>25659</v> + <v>24829</v> </e> </columnsizes> <dependencies> @@ -23644,7 +23740,7 @@ <b> <a>1</a> <b>2</b> - <v>171237</v> + <v>178341</v> </b> </bs> </hist> @@ -23660,42 +23756,42 @@ <b> <a>1</a> <b>2</b> - <v>13761</v> + <v>12217</v> </b> <b> <a>2</a> <b>3</b> - <v>2586</v> + <v>2857</v> </b> <b> <a>3</a> <b>4</b> - <v>1241</v> + <v>1182</v> </b> <b> <a>4</a> <b>6</b> - <v>1862</v> + <v>2167</v> </b> <b> <a>6</a> <b>8</b> - <v>1345</v> + <v>1280</v> </b> <b> <a>8</a> - <b>12</b> - <v>2172</v> + <b>11</b> + <v>2069</v> </b> <b> - <a>12</a> - <b>38</b> - <v>1965</v> + <a>11</a> + <b>31</b> + <v>1872</v> </b> <b> - <a>46</a> - <b>278</b> - <v>724</v> + <a>33</a> + <b>291</b> + <v>1182</v> </b> </bs> </hist> @@ -23705,19 +23801,19 @@ </relation> <relation> <name>variable_template_argument</name> - <cardinality>308331</cardinality> + <cardinality>322099</cardinality> <columnsizes> <e> <k>variable_id</k> - <v>162132</v> + <v>169671</v> </e> <e> <k>index</k> - <v>1758</v> + <v>1675</v> </e> <e> <k>arg_type</k> - <v>169995</v> + <v>175287</v> </e> </columnsizes> <dependencies> @@ -23731,22 +23827,22 @@ <b> <a>1</a> <b>2</b> - <v>82980</v> + <v>86017</v> </b> <b> <a>2</a> <b>3</b> - <v>50491</v> + <v>54192</v> </b> <b> <a>3</a> <b>4</b> - <v>18624</v> + <v>19213</v> </b> <b> <a>4</a> <b>17</b> - <v>10036</v> + <v>10247</v> </b> </bs> </hist> @@ -23762,22 +23858,22 @@ <b> <a>1</a> <b>2</b> - <v>87636</v> + <v>90353</v> </b> <b> <a>2</a> <b>3</b> - <v>51733</v> + <v>55473</v> </b> <b> <a>3</a> <b>4</b> - <v>13554</v> + <v>14385</v> </b> <b> <a>4</a> <b>17</b> - <v>9208</v> + <v>9459</v> </b> </bs> </hist> @@ -23791,49 +23887,54 @@ <budget>12</budget> <bs> <b> - <a>9</a> - <b>10</b> - <v>103</v> + <a>10</a> + <b>11</b> + <v>98</v> </b> <b> - <a>19</a> - <b>20</b> - <v>620</v> + <a>20</a> + <b>21</b> + <v>591</v> </b> <b> - <a>26</a> - <b>27</b> - <v>413</v> + <a>27</a> + <b>28</b> + <v>295</v> </b> <b> - <a>47</a> - <b>48</b> - <v>103</v> + <a>28</a> + <b>29</b> + <v>98</v> </b> <b> - <a>93</a> - <b>94</b> - <v>103</v> + <a>50</a> + <b>51</b> + <v>98</v> </b> <b> - <a>185</a> - <b>186</b> - <v>103</v> + <a>100</a> + <b>101</b> + <v>98</v> </b> <b> - <a>548</a> - <b>549</b> - <v>103</v> + <a>196</a> + <b>197</b> + <v>98</v> </b> <b> - <a>627</a> - <b>628</b> - <v>103</v> + <a>589</a> + <b>590</b> + <v>98</v> </b> <b> - <a>1253</a> - <b>1254</b> - <v>103</v> + <a>697</a> + <b>698</b> + <v>98</v> + </b> + <b> + <a>1392</a> + <b>1393</b> + <v>98</v> </b> </bs> </hist> @@ -23849,52 +23950,57 @@ <b> <a>1</a> <b>2</b> - <v>103</v> + <v>98</v> </b> <b> <a>10</a> <b>11</b> - <v>413</v> + <v>394</v> </b> <b> <a>11</a> <b>12</b> - <v>206</v> + <v>197</v> </b> <b> <a>12</a> <b>13</b> - <v>413</v> + <v>295</v> </b> <b> - <a>29</a> - <b>30</b> - <v>103</v> + <a>13</a> + <b>14</b> + <v>98</v> </b> <b> - <a>48</a> - <b>49</b> - <v>103</v> + <a>31</a> + <b>32</b> + <v>98</v> </b> <b> - <a>130</a> - <b>131</b> - <v>103</v> + <a>53</a> + <b>54</b> + <v>98</v> </b> <b> - <a>376</a> - <b>377</b> - <v>103</v> + <a>138</a> + <b>139</b> + <v>98</v> </b> <b> - <a>403</a> - <b>404</b> - <v>103</v> + <a>406</a> + <b>407</b> + <v>98</v> </b> <b> - <a>743</a> - <b>744</b> - <v>103</v> + <a>442</a> + <b>443</b> + <v>98</v> + </b> + <b> + <a>809</a> + <b>810</b> + <v>98</v> </b> </bs> </hist> @@ -23910,22 +24016,22 @@ <b> <a>1</a> <b>2</b> - <v>136783</v> + <v>138338</v> </b> <b> <a>2</a> <b>3</b> - <v>19348</v> + <v>21578</v> </b> <b> <a>3</a> - <b>24</b> - <v>12829</v> + <b>11</b> + <v>13301</v> </b> <b> - <a>24</a> - <b>110</b> - <v>1034</v> + <a>11</a> + <b>119</b> + <v>2069</v> </b> </bs> </hist> @@ -23941,16 +24047,16 @@ <b> <a>1</a> <b>2</b> - <v>153130</v> + <v>158241</v> </b> <b> <a>2</a> <b>3</b> - <v>14795</v> + <v>14976</v> </b> <b> <a>3</a> - <b>6</b> + <b>7</b> <v>2069</v> </b> </bs> @@ -23961,19 +24067,19 @@ </relation> <relation> <name>variable_template_argument_value</name> - <cardinality>11795</cardinality> + <cardinality>11922</cardinality> <columnsizes> <e> <k>variable_id</k> - <v>7760</v> + <v>8079</v> </e> <e> <k>index</k> - <v>413</v> + <v>394</v> </e> <e> <k>arg_value</k> - <v>11795</v> + <v>11922</v> </e> </columnsizes> <dependencies> @@ -23987,12 +24093,12 @@ <b> <a>1</a> <b>2</b> - <v>7346</v> + <v>7685</v> </b> <b> <a>2</a> <b>3</b> - <v>413</v> + <v>394</v> </b> </bs> </hist> @@ -24008,17 +24114,17 @@ <b> <a>1</a> <b>2</b> - <v>4345</v> + <v>4828</v> </b> <b> <a>2</a> <b>3</b> - <v>3104</v> + <v>2955</v> </b> <b> <a>4</a> <b>5</b> - <v>310</v> + <v>295</v> </b> </bs> </hist> @@ -24034,22 +24140,22 @@ <b> <a>4</a> <b>5</b> - <v>103</v> + <v>98</v> </b> <b> - <a>19</a> - <b>20</b> - <v>103</v> + <a>23</a> + <b>24</b> + <v>98</v> </b> <b> <a>26</a> <b>27</b> - <v>103</v> + <v>98</v> </b> <b> - <a>30</a> - <b>31</b> - <v>103</v> + <a>33</a> + <b>34</b> + <v>98</v> </b> </bs> </hist> @@ -24065,22 +24171,22 @@ <b> <a>7</a> <b>8</b> - <v>103</v> + <v>98</v> </b> <b> - <a>28</a> - <b>29</b> - <v>103</v> + <a>32</a> + <b>33</b> + <v>98</v> </b> <b> <a>38</a> <b>39</b> - <v>103</v> + <v>98</v> </b> <b> - <a>41</a> - <b>42</b> - <v>103</v> + <a>44</a> + <b>45</b> + <v>98</v> </b> </bs> </hist> @@ -24096,7 +24202,7 @@ <b> <a>1</a> <b>2</b> - <v>11795</v> + <v>11922</v> </b> </bs> </hist> @@ -24112,7 +24218,7 @@ <b> <a>1</a> <b>2</b> - <v>11795</v> + <v>11922</v> </b> </bs> </hist> @@ -24122,15 +24228,15 @@ </relation> <relation> <name>routinetypes</name> - <cardinality>538026</cardinality> + <cardinality>537719</cardinality> <columnsizes> <e> <k>id</k> - <v>538026</v> + <v>537719</v> </e> <e> <k>return_type</k> - <v>280336</v> + <v>280175</v> </e> </columnsizes> <dependencies> @@ -24144,7 +24250,7 @@ <b> <a>1</a> <b>2</b> - <v>538026</v> + <v>537719</v> </b> </bs> </hist> @@ -24160,17 +24266,17 @@ <b> <a>1</a> <b>2</b> - <v>244159</v> + <v>244019</v> </b> <b> <a>2</a> <b>3</b> - <v>20940</v> + <v>20928</v> </b> <b> <a>3</a> <b>3595</b> - <v>15236</v> + <v>15227</v> </b> </bs> </hist> @@ -24180,19 +24286,19 @@ </relation> <relation> <name>routinetypeargs</name> - <cardinality>982320</cardinality> + <cardinality>982237</cardinality> <columnsizes> <e> <k>routine</k> - <v>423060</v> + <v>423024</v> </e> <e> <k>index</k> - <v>7929</v> + <v>7928</v> </e> <e> <k>type_id</k> - <v>226689</v> + <v>226670</v> </e> </columnsizes> <dependencies> @@ -24206,27 +24312,27 @@ <b> <a>1</a> <b>2</b> - <v>152525</v> + <v>152512</v> </b> <b> <a>2</a> <b>3</b> - <v>133868</v> + <v>133856</v> </b> <b> <a>3</a> <b>4</b> - <v>63435</v> + <v>63430</v> </b> <b> <a>4</a> <b>5</b> - <v>45711</v> + <v>45707</v> </b> <b> <a>5</a> <b>18</b> - <v>27519</v> + <v>27517</v> </b> </bs> </hist> @@ -24242,27 +24348,27 @@ <b> <a>1</a> <b>2</b> - <v>182377</v> + <v>182362</v> </b> <b> <a>2</a> <b>3</b> - <v>133401</v> + <v>133390</v> </b> <b> <a>3</a> <b>4</b> - <v>58771</v> + <v>58766</v> </b> <b> <a>4</a> <b>5</b> - <v>33583</v> + <v>33580</v> </b> <b> <a>5</a> <b>11</b> - <v>14926</v> + <v>14924</v> </b> </bs> </hist> @@ -24420,27 +24526,27 @@ <b> <a>1</a> <b>2</b> - <v>146461</v> + <v>146449</v> </b> <b> <a>2</a> <b>3</b> - <v>30784</v> + <v>30782</v> </b> <b> <a>3</a> <b>5</b> - <v>16791</v> + <v>16790</v> </b> <b> <a>5</a> <b>12</b> - <v>18191</v> + <v>18189</v> </b> <b> <a>12</a> <b>110</b> - <v>14459</v> + <v>14458</v> </b> </bs> </hist> @@ -24456,22 +24562,22 @@ <b> <a>1</a> <b>2</b> - <v>172582</v> + <v>172567</v> </b> <b> <a>2</a> <b>3</b> - <v>30784</v> + <v>30782</v> </b> <b> <a>3</a> <b>6</b> - <v>18657</v> + <v>18655</v> </b> <b> <a>6</a> <b>14</b> - <v>4664</v> + <v>4663</v> </b> </bs> </hist> @@ -24481,19 +24587,19 @@ </relation> <relation> <name>ptrtomembers</name> - <cardinality>37781</cardinality> + <cardinality>37778</cardinality> <columnsizes> <e> <k>id</k> - <v>37781</v> + <v>37778</v> </e> <e> <k>type_id</k> - <v>37781</v> + <v>37778</v> </e> <e> <k>class_id</k> - <v>15392</v> + <v>15391</v> </e> </columnsizes> <dependencies> @@ -24507,7 +24613,7 @@ <b> <a>1</a> <b>2</b> - <v>37781</v> + <v>37778</v> </b> </bs> </hist> @@ -24523,7 +24629,7 @@ <b> <a>1</a> <b>2</b> - <v>37781</v> + <v>37778</v> </b> </bs> </hist> @@ -24539,7 +24645,7 @@ <b> <a>1</a> <b>2</b> - <v>37781</v> + <v>37778</v> </b> </bs> </hist> @@ -24555,7 +24661,7 @@ <b> <a>1</a> <b>2</b> - <v>37781</v> + <v>37778</v> </b> </bs> </hist> @@ -24571,7 +24677,7 @@ <b> <a>1</a> <b>2</b> - <v>13526</v> + <v>13525</v> </b> <b> <a>8</a> @@ -24597,7 +24703,7 @@ <b> <a>1</a> <b>2</b> - <v>13526</v> + <v>13525</v> </b> <b> <a>8</a> @@ -24617,15 +24723,15 @@ </relation> <relation> <name>specifiers</name> - <cardinality>24721</cardinality> + <cardinality>24719</cardinality> <columnsizes> <e> <k>id</k> - <v>24721</v> + <v>24719</v> </e> <e> <k>str</k> - <v>24721</v> + <v>24719</v> </e> </columnsizes> <dependencies> @@ -24639,7 +24745,7 @@ <b> <a>1</a> <b>2</b> - <v>24721</v> + <v>24719</v> </b> </bs> </hist> @@ -24655,7 +24761,7 @@ <b> <a>1</a> <b>2</b> - <v>24721</v> + <v>24719</v> </b> </bs> </hist> @@ -24665,11 +24771,11 @@ </relation> <relation> <name>typespecifiers</name> - <cardinality>1291103</cardinality> + <cardinality>1290060</cardinality> <columnsizes> <e> <k>type_id</k> - <v>1272912</v> + <v>1271871</v> </e> <e> <k>spec_id</k> @@ -24687,12 +24793,12 @@ <b> <a>1</a> <b>2</b> - <v>1254721</v> + <v>1253681</v> </b> <b> <a>2</a> <b>3</b> - <v>18191</v> + <v>18189</v> </b> </bs> </hist> @@ -24733,12 +24839,7 @@ <b> <a>219</a> <b>220</b> - <v>466</v> - </b> - <b> - <a>221</a> - <b>222</b> - <v>466</v> + <v>932</v> </b> <b> <a>2042</a> @@ -24753,11 +24854,11 @@ </relation> <relation> <name>funspecifiers</name> - <cardinality>12603886</cardinality> + <cardinality>12596680</cardinality> <columnsizes> <e> <k>func_id</k> - <v>3853638</v> + <v>3851434</v> </e> <e> <k>spec_id</k> @@ -24775,27 +24876,27 @@ <b> <a>1</a> <b>2</b> - <v>310668</v> + <v>310491</v> </b> <b> <a>2</a> <b>3</b> - <v>540079</v> + <v>539770</v> </b> <b> <a>3</a> <b>4</b> - <v>1133449</v> + <v>1132801</v> </b> <b> <a>4</a> <b>5</b> - <v>1623611</v> + <v>1622683</v> </b> <b> <a>5</a> <b>8</b> - <v>245828</v> + <v>245688</v> </b> </bs> </hist> @@ -24911,11 +25012,11 @@ </relation> <relation> <name>varspecifiers</name> - <cardinality>2244038</cardinality> + <cardinality>2243847</cardinality> <columnsizes> <e> <k>var_id</k> - <v>1223936</v> + <v>1223832</v> </e> <e> <k>spec_id</k> @@ -24933,22 +25034,22 @@ <b> <a>1</a> <b>2</b> - <v>729510</v> + <v>729448</v> </b> <b> <a>2</a> <b>3</b> - <v>202434</v> + <v>202417</v> </b> <b> <a>3</a> <b>4</b> - <v>58304</v> + <v>58299</v> </b> <b> <a>4</a> <b>5</b> - <v>233686</v> + <v>233666</v> </b> </bs> </hist> @@ -25009,27 +25110,27 @@ </relation> <relation> <name>attributes</name> - <cardinality>729440</cardinality> + <cardinality>707258</cardinality> <columnsizes> <e> <k>id</k> - <v>729440</v> + <v>707258</v> </e> <e> <k>kind</k> - <v>310</v> + <v>295</v> </e> <e> <k>name</k> - <v>1655</v> + <v>1576</v> </e> <e> <k>name_space</k> - <v>206</v> + <v>197</v> </e> <e> <k>location</k> - <v>479361</v> + <v>456496</v> </e> </columnsizes> <dependencies> @@ -25043,7 +25144,7 @@ <b> <a>1</a> <b>2</b> - <v>729440</v> + <v>707258</v> </b> </bs> </hist> @@ -25059,7 +25160,7 @@ <b> <a>1</a> <b>2</b> - <v>729440</v> + <v>707258</v> </b> </bs> </hist> @@ -25075,7 +25176,7 @@ <b> <a>1</a> <b>2</b> - <v>729440</v> + <v>707258</v> </b> </bs> </hist> @@ -25091,7 +25192,7 @@ <b> <a>1</a> <b>2</b> - <v>729440</v> + <v>707258</v> </b> </bs> </hist> @@ -25107,17 +25208,17 @@ <b> <a>5</a> <b>6</b> - <v>103</v> + <v>98</v> </b> <b> <a>2332</a> <b>2333</b> - <v>103</v> + <v>98</v> </b> <b> - <a>4713</a> - <b>4714</b> - <v>103</v> + <a>4841</a> + <b>4842</b> + <v>98</v> </b> </bs> </hist> @@ -25133,17 +25234,17 @@ <b> <a>1</a> <b>2</b> - <v>103</v> + <v>98</v> </b> <b> <a>6</a> <b>7</b> - <v>103</v> + <v>98</v> </b> <b> <a>11</a> <b>12</b> - <v>103</v> + <v>98</v> </b> </bs> </hist> @@ -25159,12 +25260,12 @@ <b> <a>1</a> <b>2</b> - <v>206</v> + <v>197</v> </b> <b> <a>2</a> <b>3</b> - <v>103</v> + <v>98</v> </b> </bs> </hist> @@ -25180,17 +25281,17 @@ <b> <a>2</a> <b>3</b> - <v>103</v> + <v>98</v> </b> <b> <a>2057</a> <b>2058</b> - <v>103</v> + <v>98</v> </b> <b> <a>2574</a> <b>2575</b> - <v>103</v> + <v>98</v> </b> </bs> </hist> @@ -25206,72 +25307,67 @@ <b> <a>1</a> <b>2</b> - <v>310</v> + <v>197</v> </b> <b> <a>2</a> <b>3</b> - <v>103</v> + <v>197</v> </b> <b> <a>4</a> <b>5</b> - <v>103</v> + <v>98</v> </b> <b> <a>5</a> <b>6</b> - <v>103</v> + <v>98</v> </b> <b> <a>11</a> <b>12</b> - <v>103</v> + <v>98</v> </b> <b> <a>14</a> <b>15</b> - <v>103</v> - </b> - <b> - <a>16</a> - <b>17</b> - <v>103</v> + <v>197</v> </b> <b> <a>18</a> <b>19</b> - <v>103</v> + <v>98</v> </b> <b> <a>24</a> <b>25</b> - <v>103</v> + <v>98</v> </b> <b> - <a>86</a> - <b>87</b> - <v>103</v> + <a>88</a> + <b>89</b> + <v>98</v> </b> <b> - <a>115</a> - <b>116</b> - <v>103</v> + <a>117</a> + <b>118</b> + <v>98</v> </b> <b> - <a>1048</a> - <b>1049</b> - <v>103</v> + <a>1080</a> + <b>1081</b> + <v>98</v> </b> <b> <a>1760</a> <b>1761</b> - <v>103</v> + <v>98</v> </b> <b> - <a>3944</a> - <b>3945</b> - <v>103</v> + <a>4037</a> + <b>4038</b> + <v>98</v> </b> </bs> </hist> @@ -25287,12 +25383,12 @@ <b> <a>1</a> <b>2</b> - <v>1448</v> + <v>1379</v> </b> <b> <a>2</a> <b>3</b> - <v>206</v> + <v>197</v> </b> </bs> </hist> @@ -25308,7 +25404,7 @@ <b> <a>1</a> <b>2</b> - <v>1655</v> + <v>1576</v> </b> </bs> </hist> @@ -25324,67 +25420,67 @@ <b> <a>1</a> <b>2</b> - <v>310</v> + <v>295</v> </b> <b> <a>2</a> <b>3</b> - <v>206</v> + <v>197</v> </b> <b> <a>4</a> <b>5</b> - <v>103</v> + <v>98</v> </b> <b> <a>6</a> <b>7</b> - <v>103</v> + <v>98</v> </b> <b> <a>8</a> <b>9</b> - <v>103</v> + <v>98</v> </b> <b> <a>9</a> <b>10</b> - <v>103</v> + <v>98</v> </b> <b> <a>14</a> <b>15</b> - <v>103</v> + <v>98</v> </b> <b> <a>18</a> <b>19</b> - <v>103</v> + <v>98</v> </b> <b> <a>59</a> <b>60</b> - <v>103</v> + <v>98</v> </b> <b> <a>72</a> <b>73</b> - <v>103</v> + <v>98</v> </b> <b> <a>333</a> <b>334</b> - <v>103</v> + <v>98</v> </b> <b> <a>1756</a> <b>1757</b> - <v>103</v> + <v>98</v> </b> <b> <a>2388</a> <b>2389</b> - <v>103</v> + <v>98</v> </b> </bs> </hist> @@ -25398,14 +25494,14 @@ <budget>12</budget> <bs> <b> - <a>19</a> - <b>20</b> - <v>103</v> + <a>20</a> + <b>21</b> + <v>98</v> </b> <b> - <a>7031</a> - <b>7032</b> - <v>103</v> + <a>7158</a> + <b>7159</b> + <v>98</v> </b> </bs> </hist> @@ -25421,12 +25517,12 @@ <b> <a>1</a> <b>2</b> - <v>103</v> + <v>98</v> </b> <b> <a>3</a> <b>4</b> - <v>103</v> + <v>98</v> </b> </bs> </hist> @@ -25442,12 +25538,12 @@ <b> <a>2</a> <b>3</b> - <v>103</v> + <v>98</v> </b> <b> <a>14</a> <b>15</b> - <v>103</v> + <v>98</v> </b> </bs> </hist> @@ -25463,12 +25559,12 @@ <b> <a>9</a> <b>10</b> - <v>103</v> + <v>98</v> </b> <b> <a>4624</a> <b>4625</b> - <v>103</v> + <v>98</v> </b> </bs> </hist> @@ -25484,17 +25580,17 @@ <b> <a>1</a> <b>2</b> - <v>422351</v> + <v>398559</v> </b> <b> <a>2</a> <b>3</b> - <v>36316</v> + <v>35274</v> </b> <b> <a>3</a> - <b>201</b> - <v>20693</v> + <b>202</b> + <v>22662</v> </b> </bs> </hist> @@ -25510,7 +25606,7 @@ <b> <a>1</a> <b>2</b> - <v>479361</v> + <v>456496</v> </b> </bs> </hist> @@ -25526,12 +25622,12 @@ <b> <a>1</a> <b>2</b> - <v>475119</v> + <v>452456</v> </b> <b> <a>2</a> <b>3</b> - <v>4242</v> + <v>4039</v> </b> </bs> </hist> @@ -25547,7 +25643,7 @@ <b> <a>1</a> <b>2</b> - <v>479361</v> + <v>456496</v> </b> </bs> </hist> @@ -25557,11 +25653,11 @@ </relation> <relation> <name>attribute_args</name> - <cardinality>410000</cardinality> + <cardinality>410431</cardinality> <columnsizes> <e> <k>id</k> - <v>410000</v> + <v>410431</v> </e> <e> <k>kind</k> @@ -25569,7 +25665,7 @@ </e> <e> <k>attribute</k> - <v>298054</v> + <v>298495</v> </e> <e> <k>index</k> @@ -25577,7 +25673,7 @@ </e> <e> <k>location</k> - <v>327440</v> + <v>327412</v> </e> </columnsizes> <dependencies> @@ -25591,7 +25687,7 @@ <b> <a>1</a> <b>2</b> - <v>410000</v> + <v>410431</v> </b> </bs> </hist> @@ -25607,7 +25703,7 @@ <b> <a>1</a> <b>2</b> - <v>410000</v> + <v>410431</v> </b> </bs> </hist> @@ -25623,7 +25719,7 @@ <b> <a>1</a> <b>2</b> - <v>410000</v> + <v>410431</v> </b> </bs> </hist> @@ -25639,7 +25735,7 @@ <b> <a>1</a> <b>2</b> - <v>410000</v> + <v>410431</v> </b> </bs> </hist> @@ -25663,8 +25759,8 @@ <v>466</v> </b> <b> - <a>794</a> - <b>795</b> + <a>795</a> + <b>796</b> <v>466</v> </b> </bs> @@ -25689,8 +25785,8 @@ <v>466</v> </b> <b> - <a>606</a> - <b>607</b> + <a>607</a> + <b>608</b> <v>466</v> </b> </bs> @@ -25754,17 +25850,17 @@ <b> <a>1</a> <b>2</b> - <v>215961</v> + <v>216409</v> </b> <b> <a>2</a> <b>3</b> - <v>52241</v> + <v>52236</v> </b> <b> <a>3</a> <b>4</b> - <v>29852</v> + <v>29849</v> </b> </bs> </hist> @@ -25780,12 +25876,12 @@ <b> <a>1</a> <b>2</b> - <v>273799</v> + <v>274242</v> </b> <b> <a>2</a> <b>3</b> - <v>24254</v> + <v>24252</v> </b> </bs> </hist> @@ -25801,17 +25897,17 @@ <b> <a>1</a> <b>2</b> - <v>215961</v> + <v>216409</v> </b> <b> <a>2</a> <b>3</b> - <v>52241</v> + <v>52236</v> </b> <b> <a>3</a> <b>4</b> - <v>29852</v> + <v>29849</v> </b> </bs> </hist> @@ -25827,17 +25923,17 @@ <b> <a>1</a> <b>2</b> - <v>215961</v> + <v>216409</v> </b> <b> <a>2</a> <b>3</b> - <v>52241</v> + <v>52236</v> </b> <b> <a>3</a> <b>4</b> - <v>29852</v> + <v>29849</v> </b> </bs> </hist> @@ -25861,8 +25957,8 @@ <v>466</v> </b> <b> - <a>639</a> - <b>640</b> + <a>640</a> + <b>641</b> <v>466</v> </b> </bs> @@ -25908,8 +26004,8 @@ <v>466</v> </b> <b> - <a>639</a> - <b>640</b> + <a>640</a> + <b>641</b> <v>466</v> </b> </bs> @@ -25952,17 +26048,17 @@ <b> <a>1</a> <b>2</b> - <v>278930</v> + <v>278440</v> </b> <b> <a>2</a> <b>3</b> - <v>23321</v> + <v>23786</v> </b> <b> <a>3</a> <b>9</b> - <v>24721</v> + <v>24719</v> </b> <b> <a>17</a> @@ -25983,12 +26079,12 @@ <b> <a>1</a> <b>2</b> - <v>314846</v> + <v>314819</v> </b> <b> <a>2</a> <b>3</b> - <v>12593</v> + <v>12592</v> </b> </bs> </hist> @@ -26004,17 +26100,17 @@ <b> <a>1</a> <b>2</b> - <v>278930</v> + <v>278440</v> </b> <b> <a>2</a> <b>3</b> - <v>23321</v> + <v>23786</v> </b> <b> <a>3</a> <b>9</b> - <v>24721</v> + <v>24719</v> </b> <b> <a>17</a> @@ -26035,7 +26131,7 @@ <b> <a>1</a> <b>2</b> - <v>327440</v> + <v>327412</v> </b> </bs> </hist> @@ -26045,15 +26141,15 @@ </relation> <relation> <name>attribute_arg_value</name> - <cardinality>39180</cardinality> + <cardinality>39177</cardinality> <columnsizes> <e> <k>arg</k> - <v>39180</v> + <v>39177</v> </e> <e> <k>value</k> - <v>15858</v> + <v>15857</v> </e> </columnsizes> <dependencies> @@ -26067,7 +26163,7 @@ <b> <a>1</a> <b>2</b> - <v>39180</v> + <v>39177</v> </b> </bs> </hist> @@ -26083,7 +26179,7 @@ <b> <a>1</a> <b>2</b> - <v>14459</v> + <v>14458</v> </b> <b> <a>2</a> @@ -26146,15 +26242,15 @@ </relation> <relation> <name>attribute_arg_constant</name> - <cardinality>370352</cardinality> + <cardinality>370787</cardinality> <columnsizes> <e> <k>arg</k> - <v>370352</v> + <v>370787</v> </e> <e> <k>constant</k> - <v>370352</v> + <v>370787</v> </e> </columnsizes> <dependencies> @@ -26168,7 +26264,7 @@ <b> <a>1</a> <b>2</b> - <v>370352</v> + <v>370787</v> </b> </bs> </hist> @@ -26184,7 +26280,7 @@ <b> <a>1</a> <b>2</b> - <v>370352</v> + <v>370787</v> </b> </bs> </hist> @@ -26295,15 +26391,15 @@ </relation> <relation> <name>typeattributes</name> - <cardinality>84325</cardinality> + <cardinality>82963</cardinality> <columnsizes> <e> <k>type_id</k> - <v>61666</v> + <v>58330</v> </e> <e> <k>spec_id</k> - <v>84325</v> + <v>82963</v> </e> </columnsizes> <dependencies> @@ -26317,17 +26413,17 @@ <b> <a>1</a> <b>2</b> - <v>55768</v> + <v>49659</v> </b> <b> <a>2</a> - <b>4</b> - <v>4242</v> + <b>3</b> + <v>6897</v> </b> <b> - <a>12</a> + <a>3</a> <b>13</b> - <v>1655</v> + <v>1773</v> </b> </bs> </hist> @@ -26343,7 +26439,7 @@ <b> <a>1</a> <b>2</b> - <v>84325</v> + <v>82963</v> </b> </bs> </hist> @@ -26353,15 +26449,15 @@ </relation> <relation> <name>funcattributes</name> - <cardinality>651615</cardinality> + <cardinality>652026</cardinality> <columnsizes> <e> <k>func_id</k> - <v>443117</v> + <v>443079</v> </e> <e> <k>spec_id</k> - <v>651615</v> + <v>652026</v> </e> </columnsizes> <dependencies> @@ -26375,17 +26471,17 @@ <b> <a>1</a> <b>2</b> - <v>334436</v> + <v>333941</v> </b> <b> <a>2</a> <b>3</b> - <v>65301</v> + <v>65762</v> </b> <b> <a>3</a> <b>6</b> - <v>34982</v> + <v>34979</v> </b> <b> <a>6</a> @@ -26406,7 +26502,7 @@ <b> <a>1</a> <b>2</b> - <v>651615</v> + <v>652026</v> </b> </bs> </hist> @@ -26522,15 +26618,15 @@ </relation> <relation> <name>unspecifiedtype</name> - <cardinality>10145051</cardinality> + <cardinality>10143254</cardinality> <columnsizes> <e> <k>type_id</k> - <v>10145051</v> + <v>10143254</v> </e> <e> <k>unspecified_type_id</k> - <v>6817474</v> + <v>6815961</v> </e> </columnsizes> <dependencies> @@ -26544,7 +26640,7 @@ <b> <a>1</a> <b>2</b> - <v>10145051</v> + <v>10143254</v> </b> </bs> </hist> @@ -26560,17 +26656,17 @@ <b> <a>1</a> <b>2</b> - <v>4584630</v> + <v>4583307</v> </b> <b> <a>2</a> <b>3</b> - <v>1995426</v> + <v>1995256</v> </b> <b> <a>3</a> <b>145</b> - <v>237417</v> + <v>237397</v> </b> </bs> </hist> @@ -26580,19 +26676,19 @@ </relation> <relation> <name>member</name> - <cardinality>4943849</cardinality> + <cardinality>4941022</cardinality> <columnsizes> <e> <k>parent</k> - <v>639217</v> + <v>638852</v> </e> <e> <k>index</k> - <v>8696</v> + <v>8691</v> </e> <e> <k>child</k> - <v>4899184</v> + <v>4896383</v> </e> </columnsizes> <dependencies> @@ -26606,42 +26702,42 @@ <b> <a>1</a> <b>3</b> - <v>19062</v> + <v>19051</v> </b> <b> <a>3</a> <b>4</b> - <v>344410</v> + <v>344213</v> </b> <b> <a>4</a> <b>5</b> - <v>37777</v> + <v>37755</v> </b> <b> <a>5</a> <b>7</b> - <v>52491</v> + <v>52461</v> </b> <b> <a>7</a> <b>10</b> - <v>52178</v> + <v>52148</v> </b> <b> <a>10</a> <b>15</b> - <v>49569</v> + <v>49540</v> </b> <b> <a>15</a> <b>24</b> - <v>48943</v> + <v>48915</v> </b> <b> <a>24</a> <b>251</b> - <v>34785</v> + <v>34765</v> </b> </bs> </hist> @@ -26657,42 +26753,42 @@ <b> <a>1</a> <b>3</b> - <v>19062</v> + <v>19051</v> </b> <b> <a>3</a> <b>4</b> - <v>344341</v> + <v>344144</v> </b> <b> <a>4</a> <b>5</b> - <v>37811</v> + <v>37790</v> </b> <b> <a>5</a> <b>7</b> - <v>52595</v> + <v>52565</v> </b> <b> <a>7</a> <b>10</b> - <v>52526</v> + <v>52496</v> </b> <b> <a>10</a> <b>15</b> - <v>49186</v> + <v>49158</v> </b> <b> <a>15</a> <b>24</b> - <v>49012</v> + <v>48984</v> </b> <b> <a>24</a> <b>255</b> - <v>34681</v> + <v>34661</v> </b> </bs> </hist> @@ -26708,17 +26804,17 @@ <b> <a>1</a> <b>2</b> - <v>1391</v> + <v>1390</v> </b> <b> <a>2</a> <b>3</b> - <v>800</v> + <v>799</v> </b> <b> <a>3</a> <b>4</b> - <v>939</v> + <v>938</v> </b> <b> <a>5</a> @@ -26779,7 +26875,7 @@ <b> <a>1</a> <b>2</b> - <v>800</v> + <v>799</v> </b> <b> <a>2</a> @@ -26834,7 +26930,7 @@ <b> <a>2770</a> <b>18057</b> - <v>452</v> + <v>451</v> </b> </bs> </hist> @@ -26850,7 +26946,7 @@ <b> <a>1</a> <b>2</b> - <v>4899184</v> + <v>4896383</v> </b> </bs> </hist> @@ -26866,12 +26962,12 @@ <b> <a>1</a> <b>2</b> - <v>4855876</v> + <v>4853100</v> </b> <b> <a>2</a> <b>8</b> - <v>43307</v> + <v>43283</v> </b> </bs> </hist> @@ -26881,15 +26977,15 @@ </relation> <relation> <name>enclosingfunction</name> - <cardinality>117840</cardinality> + <cardinality>117812</cardinality> <columnsizes> <e> <k>child</k> - <v>117840</v> + <v>117812</v> </e> <e> <k>parent</k> - <v>67310</v> + <v>67294</v> </e> </columnsizes> <dependencies> @@ -26903,7 +26999,7 @@ <b> <a>1</a> <b>2</b> - <v>117840</v> + <v>117812</v> </b> </bs> </hist> @@ -26919,22 +27015,22 @@ <b> <a>1</a> <b>2</b> - <v>35573</v> + <v>35565</v> </b> <b> <a>2</a> <b>3</b> - <v>20885</v> + <v>20880</v> </b> <b> <a>3</a> <b>4</b> - <v>5906</v> + <v>5905</v> </b> <b> <a>4</a> <b>45</b> - <v>4944</v> + <v>4943</v> </b> </bs> </hist> @@ -26944,15 +27040,15 @@ </relation> <relation> <name>derivations</name> - <cardinality>390988</cardinality> + <cardinality>390765</cardinality> <columnsizes> <e> <k>derivation</k> - <v>390988</v> + <v>390765</v> </e> <e> <k>sub</k> - <v>370743</v> + <v>370531</v> </e> <e> <k>index</k> @@ -26960,11 +27056,11 @@ </e> <e> <k>super</k> - <v>202451</v> + <v>202335</v> </e> <e> <k>location</k> - <v>37672</v> + <v>37651</v> </e> </columnsizes> <dependencies> @@ -26978,7 +27074,7 @@ <b> <a>1</a> <b>2</b> - <v>390988</v> + <v>390765</v> </b> </bs> </hist> @@ -26994,7 +27090,7 @@ <b> <a>1</a> <b>2</b> - <v>390988</v> + <v>390765</v> </b> </bs> </hist> @@ -27010,7 +27106,7 @@ <b> <a>1</a> <b>2</b> - <v>390988</v> + <v>390765</v> </b> </bs> </hist> @@ -27026,7 +27122,7 @@ <b> <a>1</a> <b>2</b> - <v>390988</v> + <v>390765</v> </b> </bs> </hist> @@ -27042,12 +27138,12 @@ <b> <a>1</a> <b>2</b> - <v>355785</v> + <v>355582</v> </b> <b> <a>2</a> <b>7</b> - <v>14957</v> + <v>14949</v> </b> </bs> </hist> @@ -27063,12 +27159,12 @@ <b> <a>1</a> <b>2</b> - <v>355785</v> + <v>355582</v> </b> <b> <a>2</a> <b>7</b> - <v>14957</v> + <v>14949</v> </b> </bs> </hist> @@ -27084,12 +27180,12 @@ <b> <a>1</a> <b>2</b> - <v>355785</v> + <v>355582</v> </b> <b> <a>2</a> <b>7</b> - <v>14957</v> + <v>14949</v> </b> </bs> </hist> @@ -27105,12 +27201,12 @@ <b> <a>1</a> <b>2</b> - <v>355785</v> + <v>355582</v> </b> <b> <a>2</a> <b>7</b> - <v>14957</v> + <v>14949</v> </b> </bs> </hist> @@ -27255,12 +27351,12 @@ <b> <a>1</a> <b>2</b> - <v>195076</v> + <v>194965</v> </b> <b> <a>2</a> <b>1519</b> - <v>7374</v> + <v>7370</v> </b> </bs> </hist> @@ -27276,12 +27372,12 @@ <b> <a>1</a> <b>2</b> - <v>195076</v> + <v>194965</v> </b> <b> <a>2</a> <b>1519</b> - <v>7374</v> + <v>7370</v> </b> </bs> </hist> @@ -27297,12 +27393,12 @@ <b> <a>1</a> <b>2</b> - <v>201999</v> + <v>201883</v> </b> <b> <a>2</a> <b>4</b> - <v>452</v> + <v>451</v> </b> </bs> </hist> @@ -27318,12 +27414,12 @@ <b> <a>1</a> <b>2</b> - <v>198798</v> + <v>198685</v> </b> <b> <a>2</a> <b>108</b> - <v>3652</v> + <v>3650</v> </b> </bs> </hist> @@ -27339,22 +27435,22 @@ <b> <a>1</a> <b>2</b> - <v>28002</v> + <v>27986</v> </b> <b> <a>2</a> <b>5</b> - <v>3200</v> + <v>3198</v> </b> <b> <a>5</a> <b>15</b> - <v>2887</v> + <v>2885</v> </b> <b> <a>15</a> <b>134</b> - <v>2852</v> + <v>2850</v> </b> <b> <a>136</a> @@ -27375,22 +27471,22 @@ <b> <a>1</a> <b>2</b> - <v>28002</v> + <v>27986</v> </b> <b> <a>2</a> <b>5</b> - <v>3200</v> + <v>3198</v> </b> <b> <a>5</a> <b>15</b> - <v>2887</v> + <v>2885</v> </b> <b> <a>15</a> <b>134</b> - <v>2852</v> + <v>2850</v> </b> <b> <a>136</a> @@ -27411,7 +27507,7 @@ <b> <a>1</a> <b>2</b> - <v>37672</v> + <v>37651</v> </b> </bs> </hist> @@ -27427,22 +27523,22 @@ <b> <a>1</a> <b>2</b> - <v>30367</v> + <v>30350</v> </b> <b> <a>2</a> <b>5</b> - <v>3339</v> + <v>3337</v> </b> <b> <a>5</a> <b>45</b> - <v>2852</v> + <v>2850</v> </b> <b> <a>54</a> <b>415</b> - <v>1113</v> + <v>1112</v> </b> </bs> </hist> @@ -27452,11 +27548,11 @@ </relation> <relation> <name>derspecifiers</name> - <cardinality>392867</cardinality> + <cardinality>392642</cardinality> <columnsizes> <e> <k>der_id</k> - <v>390605</v> + <v>390382</v> </e> <e> <k>spec_id</k> @@ -27474,12 +27570,12 @@ <b> <a>1</a> <b>2</b> - <v>388344</v> + <v>388122</v> </b> <b> <a>2</a> <b>3</b> - <v>2261</v> + <v>2259</v> </b> </bs> </hist> @@ -27520,11 +27616,11 @@ </relation> <relation> <name>direct_base_offsets</name> - <cardinality>362081</cardinality> + <cardinality>361874</cardinality> <columnsizes> <e> <k>der_id</k> - <v>362081</v> + <v>361874</v> </e> <e> <k>offset</k> @@ -27542,7 +27638,7 @@ <b> <a>1</a> <b>2</b> - <v>362081</v> + <v>361874</v> </b> </bs> </hist> @@ -27593,11 +27689,11 @@ </relation> <relation> <name>virtual_base_offsets</name> - <cardinality>6443</cardinality> + <cardinality>6442</cardinality> <columnsizes> <e> <k>sub</k> - <v>3557</v> + <v>3556</v> </e> <e> <k>super</k> @@ -27650,12 +27746,12 @@ <b> <a>1</a> <b>2</b> - <v>2998</v> + <v>2997</v> </b> <b> <a>2</a> <b>4</b> - <v>302</v> + <v>301</v> </b> <b> <a>4</a> @@ -27884,23 +27980,23 @@ </relation> <relation> <name>frienddecls</name> - <cardinality>706005</cardinality> + <cardinality>705602</cardinality> <columnsizes> <e> <k>id</k> - <v>706005</v> + <v>705602</v> </e> <e> <k>type_id</k> - <v>41846</v> + <v>41822</v> </e> <e> <k>decl_id</k> - <v>69292</v> + <v>69253</v> </e> <e> <k>location</k> - <v>6261</v> + <v>6257</v> </e> </columnsizes> <dependencies> @@ -27914,7 +28010,7 @@ <b> <a>1</a> <b>2</b> - <v>706005</v> + <v>705602</v> </b> </bs> </hist> @@ -27930,7 +28026,7 @@ <b> <a>1</a> <b>2</b> - <v>706005</v> + <v>705602</v> </b> </bs> </hist> @@ -27946,7 +28042,7 @@ <b> <a>1</a> <b>2</b> - <v>706005</v> + <v>705602</v> </b> </bs> </hist> @@ -27962,47 +28058,47 @@ <b> <a>1</a> <b>2</b> - <v>6122</v> + <v>6118</v> </b> <b> <a>2</a> <b>3</b> - <v>13044</v> + <v>13037</v> </b> <b> <a>3</a> <b>6</b> - <v>2921</v> + <v>2920</v> </b> <b> <a>6</a> <b>10</b> - <v>3165</v> + <v>3163</v> </b> <b> <a>10</a> <b>17</b> - <v>3235</v> + <v>3233</v> </b> <b> <a>17</a> <b>24</b> - <v>3304</v> + <v>3302</v> </b> <b> <a>25</a> <b>36</b> - <v>3269</v> + <v>3267</v> </b> <b> <a>37</a> <b>55</b> - <v>3200</v> + <v>3198</v> </b> <b> <a>55</a> <b>103</b> - <v>3582</v> + <v>3580</v> </b> </bs> </hist> @@ -28018,47 +28114,47 @@ <b> <a>1</a> <b>2</b> - <v>6122</v> + <v>6118</v> </b> <b> <a>2</a> <b>3</b> - <v>13044</v> + <v>13037</v> </b> <b> <a>3</a> <b>6</b> - <v>2921</v> + <v>2920</v> </b> <b> <a>6</a> <b>10</b> - <v>3165</v> + <v>3163</v> </b> <b> <a>10</a> <b>17</b> - <v>3235</v> + <v>3233</v> </b> <b> <a>17</a> <b>24</b> - <v>3304</v> + <v>3302</v> </b> <b> <a>25</a> <b>36</b> - <v>3269</v> + <v>3267</v> </b> <b> <a>37</a> <b>55</b> - <v>3200</v> + <v>3198</v> </b> <b> <a>55</a> <b>103</b> - <v>3582</v> + <v>3580</v> </b> </bs> </hist> @@ -28074,12 +28170,12 @@ <b> <a>1</a> <b>2</b> - <v>40420</v> + <v>40397</v> </b> <b> <a>2</a> <b>13</b> - <v>1426</v> + <v>1425</v> </b> </bs> </hist> @@ -28095,37 +28191,37 @@ <b> <a>1</a> <b>2</b> - <v>39968</v> + <v>39945</v> </b> <b> <a>2</a> <b>3</b> - <v>5809</v> + <v>5805</v> </b> <b> <a>3</a> <b>8</b> - <v>5948</v> + <v>5944</v> </b> <b> <a>8</a> <b>15</b> - <v>5356</v> + <v>5353</v> </b> <b> <a>15</a> <b>32</b> - <v>5217</v> + <v>5214</v> </b> <b> <a>32</a> <b>71</b> - <v>5217</v> + <v>5214</v> </b> <b> <a>72</a> <b>160</b> - <v>1774</v> + <v>1773</v> </b> </bs> </hist> @@ -28141,37 +28237,37 @@ <b> <a>1</a> <b>2</b> - <v>39968</v> + <v>39945</v> </b> <b> <a>2</a> <b>3</b> - <v>5809</v> + <v>5805</v> </b> <b> <a>3</a> <b>8</b> - <v>5948</v> + <v>5944</v> </b> <b> <a>8</a> <b>15</b> - <v>5356</v> + <v>5353</v> </b> <b> <a>15</a> <b>32</b> - <v>5217</v> + <v>5214</v> </b> <b> <a>32</a> <b>71</b> - <v>5217</v> + <v>5214</v> </b> <b> <a>72</a> <b>160</b> - <v>1774</v> + <v>1773</v> </b> </bs> </hist> @@ -28187,7 +28283,7 @@ <b> <a>1</a> <b>2</b> - <v>68631</v> + <v>68592</v> </b> <b> <a>2</a> @@ -28208,7 +28304,7 @@ <b> <a>1</a> <b>2</b> - <v>5878</v> + <v>5875</v> </b> <b> <a>2</a> @@ -28229,7 +28325,7 @@ <b> <a>1</a> <b>2</b> - <v>6122</v> + <v>6118</v> </b> <b> <a>2</a> @@ -28250,7 +28346,7 @@ <b> <a>1</a> <b>2</b> - <v>5913</v> + <v>5910</v> </b> <b> <a>2</a> @@ -28265,19 +28361,19 @@ </relation> <relation> <name>comments</name> - <cardinality>8682106</cardinality> + <cardinality>8267972</cardinality> <columnsizes> <e> <k>id</k> - <v>8682106</v> + <v>8267972</v> </e> <e> <k>contents</k> - <v>3305971</v> + <v>3148277</v> </e> <e> <k>location</k> - <v>8682106</v> + <v>8267972</v> </e> </columnsizes> <dependencies> @@ -28291,7 +28387,7 @@ <b> <a>1</a> <b>2</b> - <v>8682106</v> + <v>8267972</v> </b> </bs> </hist> @@ -28307,7 +28403,7 @@ <b> <a>1</a> <b>2</b> - <v>8682106</v> + <v>8267972</v> </b> </bs> </hist> @@ -28323,17 +28419,17 @@ <b> <a>1</a> <b>2</b> - <v>3024231</v> + <v>2879976</v> </b> <b> <a>2</a> <b>7</b> - <v>248527</v> + <v>236672</v> </b> <b> <a>7</a> <b>32784</b> - <v>33212</v> + <v>31628</v> </b> </bs> </hist> @@ -28349,17 +28445,17 @@ <b> <a>1</a> <b>2</b> - <v>3024231</v> + <v>2879976</v> </b> <b> <a>2</a> <b>7</b> - <v>248527</v> + <v>236672</v> </b> <b> <a>7</a> <b>32784</b> - <v>33212</v> + <v>31628</v> </b> </bs> </hist> @@ -28375,7 +28471,7 @@ <b> <a>1</a> <b>2</b> - <v>8682106</v> + <v>8267972</v> </b> </bs> </hist> @@ -28391,7 +28487,7 @@ <b> <a>1</a> <b>2</b> - <v>8682106</v> + <v>8267972</v> </b> </bs> </hist> @@ -28401,15 +28497,15 @@ </relation> <relation> <name>commentbinding</name> - <cardinality>3088293</cardinality> + <cardinality>3088030</cardinality> <columnsizes> <e> <k>id</k> - <v>2443208</v> + <v>2443000</v> </e> <e> <k>element</k> - <v>3011797</v> + <v>3011541</v> </e> </columnsizes> <dependencies> @@ -28423,12 +28519,12 @@ <b> <a>1</a> <b>2</b> - <v>2366245</v> + <v>2366044</v> </b> <b> <a>2</a> <b>97</b> - <v>76962</v> + <v>76955</v> </b> </bs> </hist> @@ -28444,12 +28540,12 @@ <b> <a>1</a> <b>2</b> - <v>2935301</v> + <v>2935051</v> </b> <b> <a>2</a> <b>3</b> - <v>76496</v> + <v>76489</v> </b> </bs> </hist> @@ -28459,15 +28555,15 @@ </relation> <relation> <name>exprconv</name> - <cardinality>7033379</cardinality> + <cardinality>7033492</cardinality> <columnsizes> <e> <k>converted</k> - <v>7033379</v> + <v>7033492</v> </e> <e> <k>conversion</k> - <v>7033379</v> + <v>7033492</v> </e> </columnsizes> <dependencies> @@ -28481,7 +28577,7 @@ <b> <a>1</a> <b>2</b> - <v>7033379</v> + <v>7033492</v> </b> </bs> </hist> @@ -28497,7 +28593,7 @@ <b> <a>1</a> <b>2</b> - <v>7033379</v> + <v>7033492</v> </b> </bs> </hist> @@ -28507,30 +28603,30 @@ </relation> <relation> <name>compgenerated</name> - <cardinality>9267960</cardinality> + <cardinality>9273474</cardinality> <columnsizes> <e> <k>id</k> - <v>9267960</v> + <v>9273474</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>synthetic_destructor_call</name> - <cardinality>473158</cardinality> + <cardinality>510792</cardinality> <columnsizes> <e> <k>element</k> - <v>286203</v> + <v>324717</v> </e> <e> <k>i</k> - <v>380</v> + <v>359</v> </e> <e> <k>destructor_call</k> - <v>473158</v> + <v>510792</v> </e> </columnsizes> <dependencies> @@ -28544,27 +28640,27 @@ <b> <a>1</a> <b>2</b> - <v>188057</v> + <v>227088</v> </b> <b> <a>2</a> <b>3</b> - <v>50984</v> + <v>50651</v> </b> <b> <a>3</a> <b>4</b> - <v>21850</v> + <v>21775</v> </b> <b> <a>4</a> - <b>6</b> - <v>21584</v> + <b>8</b> + <v>24539</v> </b> <b> - <a>6</a> + <a>8</a> <b>20</b> - <v>3727</v> + <v>662</v> </b> </bs> </hist> @@ -28580,27 +28676,27 @@ <b> <a>1</a> <b>2</b> - <v>188057</v> + <v>227088</v> </b> <b> <a>2</a> <b>3</b> - <v>50984</v> + <v>50651</v> </b> <b> <a>3</a> <b>4</b> - <v>21850</v> + <v>21775</v> </b> <b> <a>4</a> - <b>6</b> - <v>21584</v> + <b>8</b> + <v>24539</v> </b> <b> - <a>6</a> + <a>8</a> <b>20</b> - <v>3727</v> + <v>662</v> </b> </bs> </hist> @@ -28616,102 +28712,97 @@ <b> <a>2</a> <b>3</b> - <v>19</v> + <v>18</v> </b> <b> <a>3</a> <b>4</b> - <v>19</v> + <v>18</v> </b> <b> <a>4</a> <b>5</b> - <v>19</v> + <v>18</v> </b> <b> <a>5</a> <b>6</b> - <v>19</v> + <v>18</v> </b> <b> <a>6</a> <b>7</b> - <v>19</v> + <v>18</v> </b> <b> <a>7</a> <b>8</b> - <v>19</v> + <v>18</v> </b> <b> <a>10</a> <b>11</b> - <v>19</v> + <v>18</v> </b> <b> <a>11</a> <b>12</b> - <v>19</v> + <v>18</v> </b> <b> <a>16</a> <b>17</b> - <v>19</v> + <v>18</v> </b> <b> <a>19</a> <b>20</b> - <v>19</v> + <v>18</v> </b> <b> <a>27</a> <b>28</b> - <v>19</v> + <v>18</v> </b> <b> <a>35</a> <b>36</b> - <v>19</v> - </b> - <b> - <a>37</a> - <b>38</b> - <v>19</v> + <v>18</v> </b> <b> <a>83</a> <b>84</b> - <v>19</v> + <v>18</v> </b> <b> <a>196</a> <b>197</b> - <v>19</v> + <v>18</v> </b> <b> <a>435</a> <b>436</b> - <v>19</v> + <v>18</v> </b> <b> <a>1331</a> <b>1332</b> - <v>19</v> + <v>18</v> </b> <b> - <a>2480</a> - <b>2481</b> - <v>19</v> + <a>2481</a> + <b>2482</b> + <v>18</v> </b> <b> <a>5156</a> <b>5157</b> - <v>19</v> + <v>18</v> </b> <b> - <a>15018</a> - <b>15019</b> - <v>19</v> + <a>17149</a> + <b>17150</b> + <v>18</v> </b> </bs> </hist> @@ -28727,102 +28818,97 @@ <b> <a>2</a> <b>3</b> - <v>19</v> + <v>18</v> </b> <b> <a>3</a> <b>4</b> - <v>19</v> + <v>18</v> </b> <b> <a>4</a> <b>5</b> - <v>19</v> + <v>18</v> </b> <b> <a>5</a> <b>6</b> - <v>19</v> + <v>18</v> </b> <b> <a>6</a> <b>7</b> - <v>19</v> + <v>18</v> </b> <b> <a>7</a> <b>8</b> - <v>19</v> + <v>18</v> </b> <b> <a>10</a> <b>11</b> - <v>19</v> + <v>18</v> </b> <b> <a>11</a> <b>12</b> - <v>19</v> + <v>18</v> </b> <b> <a>16</a> <b>17</b> - <v>19</v> + <v>18</v> </b> <b> <a>19</a> <b>20</b> - <v>19</v> + <v>18</v> </b> <b> <a>27</a> <b>28</b> - <v>19</v> + <v>18</v> </b> <b> <a>35</a> <b>36</b> - <v>19</v> - </b> - <b> - <a>37</a> - <b>38</b> - <v>19</v> + <v>18</v> </b> <b> <a>83</a> <b>84</b> - <v>19</v> + <v>18</v> </b> <b> <a>196</a> <b>197</b> - <v>19</v> + <v>18</v> </b> <b> <a>435</a> <b>436</b> - <v>19</v> + <v>18</v> </b> <b> <a>1331</a> <b>1332</b> - <v>19</v> + <v>18</v> </b> <b> - <a>2480</a> - <b>2481</b> - <v>19</v> + <a>2481</a> + <b>2482</b> + <v>18</v> </b> <b> <a>5156</a> <b>5157</b> - <v>19</v> + <v>18</v> </b> <b> - <a>15018</a> - <b>15019</b> - <v>19</v> + <a>17149</a> + <b>17150</b> + <v>18</v> </b> </bs> </hist> @@ -28838,7 +28924,7 @@ <b> <a>1</a> <b>2</b> - <v>473158</v> + <v>510792</v> </b> </bs> </hist> @@ -28854,7 +28940,7 @@ <b> <a>1</a> <b>2</b> - <v>473158</v> + <v>510792</v> </b> </bs> </hist> @@ -28864,15 +28950,15 @@ </relation> <relation> <name>namespaces</name> - <cardinality>12127</cardinality> + <cardinality>12126</cardinality> <columnsizes> <e> <k>id</k> - <v>12127</v> + <v>12126</v> </e> <e> <k>name</k> - <v>9795</v> + <v>9794</v> </e> </columnsizes> <dependencies> @@ -28886,7 +28972,7 @@ <b> <a>1</a> <b>2</b> - <v>12127</v> + <v>12126</v> </b> </bs> </hist> @@ -28933,15 +29019,15 @@ </relation> <relation> <name>namespacembrs</name> - <cardinality>2385836</cardinality> + <cardinality>2385633</cardinality> <columnsizes> <e> <k>parentid</k> - <v>10261</v> + <v>10260</v> </e> <e> <k>memberid</k> - <v>2385836</v> + <v>2385633</v> </e> </columnsizes> <dependencies> @@ -29016,7 +29102,7 @@ <b> <a>1</a> <b>2</b> - <v>2385836</v> + <v>2385633</v> </b> </bs> </hist> @@ -29026,11 +29112,11 @@ </relation> <relation> <name>exprparents</name> - <cardinality>14207231</cardinality> + <cardinality>14207462</cardinality> <columnsizes> <e> <k>expr_id</k> - <v>14207231</v> + <v>14207462</v> </e> <e> <k>child_index</k> @@ -29038,7 +29124,7 @@ </e> <e> <k>parent_id</k> - <v>9454166</v> + <v>9454319</v> </e> </columnsizes> <dependencies> @@ -29052,7 +29138,7 @@ <b> <a>1</a> <b>2</b> - <v>14207231</v> + <v>14207462</v> </b> </bs> </hist> @@ -29068,7 +29154,7 @@ <b> <a>1</a> <b>2</b> - <v>14207231</v> + <v>14207462</v> </b> </bs> </hist> @@ -29186,17 +29272,17 @@ <b> <a>1</a> <b>2</b> - <v>5409633</v> + <v>5409721</v> </b> <b> <a>2</a> <b>3</b> - <v>3706777</v> + <v>3706838</v> </b> <b> <a>3</a> <b>712</b> - <v>337754</v> + <v>337760</v> </b> </bs> </hist> @@ -29212,17 +29298,17 @@ <b> <a>1</a> <b>2</b> - <v>5409633</v> + <v>5409721</v> </b> <b> <a>2</a> <b>3</b> - <v>3706777</v> + <v>3706838</v> </b> <b> <a>3</a> <b>712</b> - <v>337754</v> + <v>337760</v> </b> </bs> </hist> @@ -29232,22 +29318,22 @@ </relation> <relation> <name>expr_isload</name> - <cardinality>5168684</cardinality> + <cardinality>5082911</cardinality> <columnsizes> <e> <k>expr_id</k> - <v>5168684</v> + <v>5082911</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>conversionkinds</name> - <cardinality>4221331</cardinality> + <cardinality>4221314</cardinality> <columnsizes> <e> <k>expr_id</k> - <v>4221331</v> + <v>4221314</v> </e> <e> <k>kind</k> @@ -29265,7 +29351,7 @@ <b> <a>1</a> <b>2</b> - <v>4221331</v> + <v>4221314</v> </b> </bs> </hist> @@ -29304,8 +29390,8 @@ <v>1</v> </b> <b> - <a>4131254</a> - <b>4131255</b> + <a>4131237</a> + <b>4131238</b> <v>1</v> </b> </bs> @@ -29316,15 +29402,15 @@ </relation> <relation> <name>iscall</name> - <cardinality>3182186</cardinality> + <cardinality>3208148</cardinality> <columnsizes> <e> <k>caller</k> - <v>3182186</v> + <v>3208148</v> </e> <e> <k>kind</k> - <v>57</v> + <v>56</v> </e> </columnsizes> <dependencies> @@ -29338,7 +29424,7 @@ <b> <a>1</a> <b>2</b> - <v>3182186</v> + <v>3208148</v> </b> </bs> </hist> @@ -29354,17 +29440,17 @@ <b> <a>1319</a> <b>1320</b> - <v>19</v> + <v>18</v> </b> <b> <a>2473</a> <b>2474</b> - <v>19</v> + <v>18</v> </b> <b> - <a>163543</a> - <b>163544</b> - <v>19</v> + <a>165637</a> + <b>165638</b> + <v>18</v> </b> </bs> </hist> @@ -29374,15 +29460,15 @@ </relation> <relation> <name>numtemplatearguments</name> - <cardinality>393249</cardinality> + <cardinality>393024</cardinality> <columnsizes> <e> <k>expr_id</k> - <v>393249</v> + <v>393024</v> </e> <e> <k>num</k> - <v>313</v> + <v>312</v> </e> </columnsizes> <dependencies> @@ -29396,7 +29482,7 @@ <b> <a>1</a> <b>2</b> - <v>393249</v> + <v>393024</v> </b> </bs> </hist> @@ -29500,23 +29586,23 @@ </relation> <relation> <name>namequalifiers</name> - <cardinality>1515301</cardinality> + <cardinality>1508764</cardinality> <columnsizes> <e> <k>id</k> - <v>1515301</v> + <v>1508764</v> </e> <e> <k>qualifiableelement</k> - <v>1515301</v> + <v>1508764</v> </e> <e> <k>qualifyingelement</k> - <v>97613</v> + <v>97193</v> </e> <e> <k>location</k> - <v>304593</v> + <v>303282</v> </e> </columnsizes> <dependencies> @@ -29530,7 +29616,7 @@ <b> <a>1</a> <b>2</b> - <v>1515301</v> + <v>1508764</v> </b> </bs> </hist> @@ -29546,7 +29632,7 @@ <b> <a>1</a> <b>2</b> - <v>1515301</v> + <v>1508764</v> </b> </bs> </hist> @@ -29562,7 +29648,7 @@ <b> <a>1</a> <b>2</b> - <v>1515301</v> + <v>1508764</v> </b> </bs> </hist> @@ -29578,7 +29664,7 @@ <b> <a>1</a> <b>2</b> - <v>1515301</v> + <v>1508764</v> </b> </bs> </hist> @@ -29594,7 +29680,7 @@ <b> <a>1</a> <b>2</b> - <v>1515301</v> + <v>1508764</v> </b> </bs> </hist> @@ -29610,7 +29696,7 @@ <b> <a>1</a> <b>2</b> - <v>1515301</v> + <v>1508764</v> </b> </bs> </hist> @@ -29626,27 +29712,27 @@ <b> <a>1</a> <b>2</b> - <v>58457</v> + <v>58206</v> </b> <b> <a>2</a> <b>3</b> - <v>22420</v> + <v>22324</v> </b> <b> <a>3</a> <b>5</b> - <v>8918</v> + <v>8880</v> </b> <b> <a>5</a> <b>92</b> - <v>7378</v> + <v>7346</v> </b> <b> <a>96</a> <b>21584</b> - <v>437</v> + <v>435</v> </b> </bs> </hist> @@ -29662,27 +29748,27 @@ <b> <a>1</a> <b>2</b> - <v>58457</v> + <v>58206</v> </b> <b> <a>2</a> <b>3</b> - <v>22420</v> + <v>22324</v> </b> <b> <a>3</a> <b>5</b> - <v>8918</v> + <v>8880</v> </b> <b> <a>5</a> <b>92</b> - <v>7378</v> + <v>7346</v> </b> <b> <a>96</a> <b>21584</b> - <v>437</v> + <v>435</v> </b> </bs> </hist> @@ -29698,22 +29784,22 @@ <b> <a>1</a> <b>2</b> - <v>63877</v> + <v>63602</v> </b> <b> <a>2</a> <b>3</b> - <v>20671</v> + <v>20582</v> </b> <b> <a>3</a> <b>5</b> - <v>8386</v> + <v>8350</v> </b> <b> <a>5</a> <b>7095</b> - <v>4678</v> + <v>4658</v> </b> </bs> </hist> @@ -29729,32 +29815,32 @@ <b> <a>1</a> <b>2</b> - <v>100656</v> + <v>100223</v> </b> <b> <a>2</a> <b>3</b> - <v>28430</v> + <v>28307</v> </b> <b> <a>3</a> <b>4</b> - <v>44651</v> + <v>44459</v> </b> <b> <a>4</a> <b>6</b> - <v>13768</v> + <v>13727</v> </b> <b> <a>6</a> <b>7</b> - <v>95692</v> + <v>95262</v> </b> <b> <a>7</a> <b>790</b> - <v>21393</v> + <v>21301</v> </b> </bs> </hist> @@ -29770,32 +29856,32 @@ <b> <a>1</a> <b>2</b> - <v>100656</v> + <v>100223</v> </b> <b> <a>2</a> <b>3</b> - <v>28430</v> + <v>28307</v> </b> <b> <a>3</a> <b>4</b> - <v>44651</v> + <v>44459</v> </b> <b> <a>4</a> <b>6</b> - <v>13768</v> + <v>13727</v> </b> <b> <a>6</a> <b>7</b> - <v>95692</v> + <v>95262</v> </b> <b> <a>7</a> <b>790</b> - <v>21393</v> + <v>21301</v> </b> </bs> </hist> @@ -29811,22 +29897,22 @@ <b> <a>1</a> <b>2</b> - <v>137206</v> + <v>136616</v> </b> <b> <a>2</a> <b>3</b> - <v>55738</v> + <v>55498</v> </b> <b> <a>3</a> <b>4</b> - <v>102443</v> + <v>102003</v> </b> <b> <a>4</a> <b>143</b> - <v>9204</v> + <v>9164</v> </b> </bs> </hist> @@ -29836,15 +29922,15 @@ </relation> <relation> <name>varbind</name> - <cardinality>6029430</cardinality> + <cardinality>6029528</cardinality> <columnsizes> <e> <k>expr</k> - <v>6029430</v> + <v>6029528</v> </e> <e> <k>var</k> - <v>768569</v> + <v>768581</v> </e> </columnsizes> <dependencies> @@ -29858,7 +29944,7 @@ <b> <a>1</a> <b>2</b> - <v>6029430</v> + <v>6029528</v> </b> </bs> </hist> @@ -29874,47 +29960,47 @@ <b> <a>1</a> <b>2</b> - <v>126228</v> + <v>126230</v> </b> <b> <a>2</a> <b>3</b> - <v>137881</v> + <v>137883</v> </b> <b> <a>3</a> <b>4</b> - <v>106298</v> + <v>106300</v> </b> <b> <a>4</a> <b>5</b> - <v>85215</v> + <v>85217</v> </b> <b> <a>5</a> <b>6</b> - <v>61292</v> + <v>61293</v> </b> <b> <a>6</a> <b>7</b> - <v>48115</v> + <v>48116</v> </b> <b> <a>7</a> <b>9</b> - <v>59624</v> + <v>59625</v> </b> <b> <a>9</a> <b>13</b> - <v>59274</v> + <v>59275</v> </b> <b> <a>13</a> <b>28</b> - <v>58883</v> + <v>58884</v> </b> <b> <a>28</a> @@ -29929,15 +30015,15 @@ </relation> <relation> <name>funbind</name> - <cardinality>3188690</cardinality> + <cardinality>3214624</cardinality> <columnsizes> <e> <k>expr</k> - <v>3182471</v> + <v>3208432</v> </e> <e> <k>fun</k> - <v>512219</v> + <v>510072</v> </e> </columnsizes> <dependencies> @@ -29951,12 +30037,12 @@ <b> <a>1</a> <b>2</b> - <v>3176253</v> + <v>3202241</v> </b> <b> <a>2</a> <b>3</b> - <v>6218</v> + <v>6191</v> </b> </bs> </hist> @@ -29972,32 +30058,32 @@ <b> <a>1</a> <b>2</b> - <v>315736</v> + <v>314454</v> </b> <b> <a>2</a> <b>3</b> - <v>78026</v> + <v>77652</v> </b> <b> <a>3</a> <b>4</b> - <v>31396</v> + <v>31261</v> </b> <b> <a>4</a> <b>7</b> - <v>46153</v> + <v>45955</v> </b> <b> <a>7</a> <b>121</b> - <v>38471</v> + <v>38305</v> </b> <b> <a>123</a> <b>5011</b> - <v>2434</v> + <v>2442</v> </b> </bs> </hist> @@ -30007,11 +30093,11 @@ </relation> <relation> <name>expr_allocator</name> - <cardinality>45951</cardinality> + <cardinality>45925</cardinality> <columnsizes> <e> <k>expr</k> - <v>45951</v> + <v>45925</v> </e> <e> <k>func</k> @@ -30033,7 +30119,7 @@ <b> <a>1</a> <b>2</b> - <v>45951</v> + <v>45925</v> </b> </bs> </hist> @@ -30049,7 +30135,7 @@ <b> <a>1</a> <b>2</b> - <v>45951</v> + <v>45925</v> </b> </bs> </hist> @@ -30133,11 +30219,11 @@ </relation> <relation> <name>expr_deallocator</name> - <cardinality>54613</cardinality> + <cardinality>54581</cardinality> <columnsizes> <e> <k>expr</k> - <v>54613</v> + <v>54581</v> </e> <e> <k>func</k> @@ -30159,7 +30245,7 @@ <b> <a>1</a> <b>2</b> - <v>54613</v> + <v>54581</v> </b> </bs> </hist> @@ -30175,7 +30261,7 @@ <b> <a>1</a> <b>2</b> - <v>54613</v> + <v>54581</v> </b> </bs> </hist> @@ -30280,15 +30366,15 @@ </relation> <relation> <name>expr_cond_guard</name> - <cardinality>657271</cardinality> + <cardinality>657281</cardinality> <columnsizes> <e> <k>cond</k> - <v>657271</v> + <v>657281</v> </e> <e> <k>guard</k> - <v>657271</v> + <v>657281</v> </e> </columnsizes> <dependencies> @@ -30302,7 +30388,7 @@ <b> <a>1</a> <b>2</b> - <v>657271</v> + <v>657281</v> </b> </bs> </hist> @@ -30318,7 +30404,7 @@ <b> <a>1</a> <b>2</b> - <v>657271</v> + <v>657281</v> </b> </bs> </hist> @@ -30328,15 +30414,15 @@ </relation> <relation> <name>expr_cond_true</name> - <cardinality>657268</cardinality> + <cardinality>657279</cardinality> <columnsizes> <e> <k>cond</k> - <v>657268</v> + <v>657279</v> </e> <e> <k>true</k> - <v>657268</v> + <v>657279</v> </e> </columnsizes> <dependencies> @@ -30350,7 +30436,7 @@ <b> <a>1</a> <b>2</b> - <v>657268</v> + <v>657279</v> </b> </bs> </hist> @@ -30366,7 +30452,7 @@ <b> <a>1</a> <b>2</b> - <v>657268</v> + <v>657279</v> </b> </bs> </hist> @@ -30376,15 +30462,15 @@ </relation> <relation> <name>expr_cond_false</name> - <cardinality>657271</cardinality> + <cardinality>657281</cardinality> <columnsizes> <e> <k>cond</k> - <v>657271</v> + <v>657281</v> </e> <e> <k>false</k> - <v>657271</v> + <v>657281</v> </e> </columnsizes> <dependencies> @@ -30398,7 +30484,7 @@ <b> <a>1</a> <b>2</b> - <v>657271</v> + <v>657281</v> </b> </bs> </hist> @@ -30414,7 +30500,7 @@ <b> <a>1</a> <b>2</b> - <v>657271</v> + <v>657281</v> </b> </bs> </hist> @@ -30424,15 +30510,15 @@ </relation> <relation> <name>values</name> - <cardinality>10777241</cardinality> + <cardinality>10777417</cardinality> <columnsizes> <e> <k>id</k> - <v>10777241</v> + <v>10777417</v> </e> <e> <k>str</k> - <v>88067</v> + <v>88069</v> </e> </columnsizes> <dependencies> @@ -30446,7 +30532,7 @@ <b> <a>1</a> <b>2</b> - <v>10777241</v> + <v>10777417</v> </b> </bs> </hist> @@ -30462,7 +30548,7 @@ <b> <a>1</a> <b>2</b> - <v>59548</v> + <v>59549</v> </b> <b> <a>2</a> @@ -30472,7 +30558,7 @@ <b> <a>3</a> <b>6</b> - <v>6916</v> + <v>6917</v> </b> <b> <a>6</a> @@ -30492,15 +30578,15 @@ </relation> <relation> <name>valuetext</name> - <cardinality>4757336</cardinality> + <cardinality>4757348</cardinality> <columnsizes> <e> <k>id</k> - <v>4757336</v> + <v>4757348</v> </e> <e> <k>text</k> - <v>703968</v> + <v>703970</v> </e> </columnsizes> <dependencies> @@ -30514,7 +30600,7 @@ <b> <a>1</a> <b>2</b> - <v>4757336</v> + <v>4757348</v> </b> </bs> </hist> @@ -30535,12 +30621,12 @@ <b> <a>2</a> <b>3</b> - <v>102500</v> + <v>102501</v> </b> <b> <a>3</a> <b>7</b> - <v>56769</v> + <v>56770</v> </b> <b> <a>7</a> @@ -30555,15 +30641,15 @@ </relation> <relation> <name>valuebind</name> - <cardinality>11211484</cardinality> + <cardinality>11211667</cardinality> <columnsizes> <e> <k>val</k> - <v>10777241</v> + <v>10777417</v> </e> <e> <k>expr</k> - <v>11211484</v> + <v>11211667</v> </e> </columnsizes> <dependencies> @@ -30577,12 +30663,12 @@ <b> <a>1</a> <b>2</b> - <v>10365543</v> + <v>10365712</v> </b> <b> <a>2</a> <b>7</b> - <v>411698</v> + <v>411704</v> </b> </bs> </hist> @@ -30598,7 +30684,7 @@ <b> <a>1</a> <b>2</b> - <v>11211484</v> + <v>11211667</v> </b> </bs> </hist> @@ -30608,15 +30694,15 @@ </relation> <relation> <name>fieldoffsets</name> - <cardinality>1054750</cardinality> + <cardinality>1054767</cardinality> <columnsizes> <e> <k>id</k> - <v>1054750</v> + <v>1054767</v> </e> <e> <k>byteoffset</k> - <v>22693</v> + <v>22694</v> </e> <e> <k>bitoffset</k> @@ -30634,7 +30720,7 @@ <b> <a>1</a> <b>2</b> - <v>1054750</v> + <v>1054767</v> </b> </bs> </hist> @@ -30650,7 +30736,7 @@ <b> <a>1</a> <b>2</b> - <v>1054750</v> + <v>1054767</v> </b> </bs> </hist> @@ -30712,7 +30798,7 @@ <b> <a>1</a> <b>2</b> - <v>22014</v> + <v>22015</v> </b> <b> <a>2</a> @@ -30809,19 +30895,19 @@ </relation> <relation> <name>bitfield</name> - <cardinality>20693</cardinality> + <cardinality>19706</cardinality> <columnsizes> <e> <k>id</k> - <v>20693</v> + <v>19706</v> </e> <e> <k>bits</k> - <v>2586</v> + <v>2463</v> </e> <e> <k>declared_bits</k> - <v>2586</v> + <v>2463</v> </e> </columnsizes> <dependencies> @@ -30835,7 +30921,7 @@ <b> <a>1</a> <b>2</b> - <v>20693</v> + <v>19706</v> </b> </bs> </hist> @@ -30851,7 +30937,7 @@ <b> <a>1</a> <b>2</b> - <v>20693</v> + <v>19706</v> </b> </bs> </hist> @@ -30867,42 +30953,42 @@ <b> <a>1</a> <b>2</b> - <v>724</v> + <v>689</v> </b> <b> <a>2</a> <b>3</b> - <v>620</v> + <v>591</v> </b> <b> <a>3</a> <b>4</b> - <v>206</v> + <v>197</v> </b> <b> <a>4</a> <b>5</b> - <v>206</v> + <v>197</v> </b> <b> <a>5</a> <b>6</b> - <v>206</v> + <v>197</v> </b> <b> <a>6</a> <b>8</b> - <v>206</v> + <v>197</v> </b> <b> <a>8</a> <b>11</b> - <v>206</v> + <v>197</v> </b> <b> <a>12</a> <b>115</b> - <v>206</v> + <v>197</v> </b> </bs> </hist> @@ -30918,7 +31004,7 @@ <b> <a>1</a> <b>2</b> - <v>2586</v> + <v>2463</v> </b> </bs> </hist> @@ -30934,42 +31020,42 @@ <b> <a>1</a> <b>2</b> - <v>724</v> + <v>689</v> </b> <b> <a>2</a> <b>3</b> - <v>620</v> + <v>591</v> </b> <b> <a>3</a> <b>4</b> - <v>206</v> + <v>197</v> </b> <b> <a>4</a> <b>5</b> - <v>206</v> + <v>197</v> </b> <b> <a>5</a> <b>6</b> - <v>206</v> + <v>197</v> </b> <b> <a>6</a> <b>8</b> - <v>206</v> + <v>197</v> </b> <b> <a>8</a> <b>11</b> - <v>206</v> + <v>197</v> </b> <b> <a>12</a> <b>115</b> - <v>206</v> + <v>197</v> </b> </bs> </hist> @@ -30985,7 +31071,7 @@ <b> <a>1</a> <b>2</b> - <v>2586</v> + <v>2463</v> </b> </bs> </hist> @@ -30995,23 +31081,23 @@ </relation> <relation> <name>initialisers</name> - <cardinality>1710223</cardinality> + <cardinality>1710171</cardinality> <columnsizes> <e> <k>init</k> - <v>1710223</v> + <v>1710171</v> </e> <e> <k>var</k> - <v>719570</v> + <v>719548</v> </e> <e> <k>expr</k> - <v>1710223</v> + <v>1710171</v> </e> <e> <k>location</k> - <v>394513</v> + <v>394501</v> </e> </columnsizes> <dependencies> @@ -31025,7 +31111,7 @@ <b> <a>1</a> <b>2</b> - <v>1710223</v> + <v>1710171</v> </b> </bs> </hist> @@ -31041,7 +31127,7 @@ <b> <a>1</a> <b>2</b> - <v>1710223</v> + <v>1710171</v> </b> </bs> </hist> @@ -31057,7 +31143,7 @@ <b> <a>1</a> <b>2</b> - <v>1710223</v> + <v>1710171</v> </b> </bs> </hist> @@ -31073,17 +31159,17 @@ <b> <a>1</a> <b>2</b> - <v>633825</v> + <v>633806</v> </b> <b> <a>2</a> <b>15</b> - <v>28723</v> + <v>28722</v> </b> <b> <a>16</a> <b>25</b> - <v>57020</v> + <v>57019</v> </b> </bs> </hist> @@ -31099,17 +31185,17 @@ <b> <a>1</a> <b>2</b> - <v>633825</v> + <v>633806</v> </b> <b> <a>2</a> <b>15</b> - <v>28723</v> + <v>28722</v> </b> <b> <a>16</a> <b>25</b> - <v>57020</v> + <v>57019</v> </b> </bs> </hist> @@ -31125,7 +31211,7 @@ <b> <a>1</a> <b>2</b> - <v>719563</v> + <v>719541</v> </b> <b> <a>2</a> @@ -31146,7 +31232,7 @@ <b> <a>1</a> <b>2</b> - <v>1710223</v> + <v>1710171</v> </b> </bs> </hist> @@ -31162,7 +31248,7 @@ <b> <a>1</a> <b>2</b> - <v>1710223</v> + <v>1710171</v> </b> </bs> </hist> @@ -31178,7 +31264,7 @@ <b> <a>1</a> <b>2</b> - <v>1710223</v> + <v>1710171</v> </b> </bs> </hist> @@ -31194,17 +31280,17 @@ <b> <a>1</a> <b>2</b> - <v>321597</v> + <v>321587</v> </b> <b> <a>2</a> <b>3</b> - <v>23956</v> + <v>23955</v> </b> <b> <a>3</a> <b>15</b> - <v>30976</v> + <v>30975</v> </b> <b> <a>15</a> @@ -31225,12 +31311,12 @@ <b> <a>1</a> <b>2</b> - <v>344480</v> + <v>344470</v> </b> <b> <a>2</a> <b>4</b> - <v>36086</v> + <v>36085</v> </b> <b> <a>4</a> @@ -31251,17 +31337,17 @@ <b> <a>1</a> <b>2</b> - <v>321597</v> + <v>321587</v> </b> <b> <a>2</a> <b>3</b> - <v>23956</v> + <v>23955</v> </b> <b> <a>3</a> <b>15</b> - <v>30976</v> + <v>30975</v> </b> <b> <a>15</a> @@ -31287,15 +31373,15 @@ </relation> <relation> <name>expr_ancestor</name> - <cardinality>477285</cardinality> + <cardinality>514901</cardinality> <columnsizes> <e> <k>exp</k> - <v>477285</v> + <v>514901</v> </e> <e> <k>ancestor</k> - <v>268993</v> + <v>307486</v> </e> </columnsizes> <dependencies> @@ -31309,7 +31395,7 @@ <b> <a>1</a> <b>2</b> - <v>477285</v> + <v>514901</v> </b> </bs> </hist> @@ -31325,27 +31411,27 @@ <b> <a>1</a> <b>2</b> - <v>163963</v> + <v>202889</v> </b> <b> <a>2</a> <b>3</b> - <v>55148</v> + <v>54930</v> </b> <b> <a>3</a> <b>4</b> - <v>22496</v> + <v>22400</v> </b> <b> <a>4</a> - <b>6</b> - <v>22592</v> + <b>7</b> + <v>25070</v> </b> <b> - <a>6</a> + <a>7</a> <b>26</b> - <v>4792</v> + <v>2196</v> </b> </bs> </hist> @@ -31355,11 +31441,11 @@ </relation> <relation> <name>exprs</name> - <cardinality>18388431</cardinality> + <cardinality>18388730</cardinality> <columnsizes> <e> <k>id</k> - <v>18388431</v> + <v>18388730</v> </e> <e> <k>kind</k> @@ -31367,7 +31453,7 @@ </e> <e> <k>location</k> - <v>8488521</v> + <v>8488659</v> </e> </columnsizes> <dependencies> @@ -31381,7 +31467,7 @@ <b> <a>1</a> <b>2</b> - <v>18388431</v> + <v>18388730</v> </b> </bs> </hist> @@ -31397,7 +31483,7 @@ <b> <a>1</a> <b>2</b> - <v>18388431</v> + <v>18388730</v> </b> </bs> </hist> @@ -31575,22 +31661,22 @@ <b> <a>1</a> <b>2</b> - <v>7145513</v> + <v>7145629</v> </b> <b> <a>2</a> <b>3</b> - <v>663064</v> + <v>663075</v> </b> <b> <a>3</a> <b>18</b> - <v>638135</v> + <v>638145</v> </b> <b> <a>18</a> <b>71656</b> - <v>41807</v> + <v>41808</v> </b> </bs> </hist> @@ -31606,17 +31692,17 @@ <b> <a>1</a> <b>2</b> - <v>7251587</v> + <v>7251705</v> </b> <b> <a>2</a> <b>3</b> - <v>618273</v> + <v>618283</v> </b> <b> <a>3</a> <b>32</b> - <v>618661</v> + <v>618671</v> </b> </bs> </hist> @@ -31626,19 +31712,19 @@ </relation> <relation> <name>expr_reuse</name> - <cardinality>333955</cardinality> + <cardinality>372471</cardinality> <columnsizes> <e> <k>reuse</k> - <v>333955</v> + <v>372471</v> </e> <e> <k>original</k> - <v>333955</v> + <v>372452</v> </e> <e> <k>value_category</k> - <v>19</v> + <v>37</v> </e> </columnsizes> <dependencies> @@ -31652,7 +31738,7 @@ <b> <a>1</a> <b>2</b> - <v>333955</v> + <v>372471</v> </b> </bs> </hist> @@ -31668,7 +31754,7 @@ <b> <a>1</a> <b>2</b> - <v>333955</v> + <v>372471</v> </b> </bs> </hist> @@ -31684,7 +31770,12 @@ <b> <a>1</a> <b>2</b> - <v>333955</v> + <v>372433</v> + </b> + <b> + <a>2</a> + <b>3</b> + <v>18</v> </b> </bs> </hist> @@ -31700,7 +31791,7 @@ <b> <a>1</a> <b>2</b> - <v>333955</v> + <v>372452</v> </b> </bs> </hist> @@ -31714,9 +31805,14 @@ <budget>12</budget> <bs> <b> - <a>17561</a> - <b>17562</b> - <v>19</v> + <a>15</a> + <b>16</b> + <v>18</v> + </b> + <b> + <a>19656</a> + <b>19657</b> + <v>18</v> </b> </bs> </hist> @@ -31730,9 +31826,14 @@ <budget>12</budget> <bs> <b> - <a>17561</a> - <b>17562</b> - <v>19</v> + <a>15</a> + <b>16</b> + <v>18</v> + </b> + <b> + <a>19655</a> + <b>19656</b> + <v>18</v> </b> </bs> </hist> @@ -31742,15 +31843,15 @@ </relation> <relation> <name>expr_types</name> - <cardinality>18456468</cardinality> + <cardinality>18452210</cardinality> <columnsizes> <e> <k>id</k> - <v>18325931</v> + <v>18321703</v> </e> <e> <k>typeid</k> - <v>1236717</v> + <v>1236464</v> </e> <e> <k>value_category</k> @@ -31768,12 +31869,12 @@ <b> <a>1</a> <b>2</b> - <v>18195394</v> + <v>18191197</v> </b> <b> <a>2</a> <b>3</b> - <v>130536</v> + <v>130506</v> </b> </bs> </hist> @@ -31789,7 +31890,7 @@ <b> <a>1</a> <b>2</b> - <v>18325931</v> + <v>18321703</v> </b> </bs> </hist> @@ -31805,42 +31906,42 @@ <b> <a>1</a> <b>2</b> - <v>448002</v> + <v>447977</v> </b> <b> <a>2</a> <b>3</b> - <v>256901</v> + <v>256729</v> </b> <b> <a>3</a> <b>4</b> - <v>102760</v> + <v>102714</v> </b> <b> <a>4</a> <b>5</b> - <v>84078</v> + <v>84159</v> </b> <b> <a>5</a> <b>8</b> - <v>110166</v> + <v>110118</v> </b> <b> <a>8</a> <b>14</b> - <v>98352</v> + <v>98307</v> </b> <b> <a>14</a> <b>42</b> - <v>93486</v> + <v>93532</v> </b> <b> <a>42</a> - <b>125373</b> - <v>42967</v> + <b>125371</b> + <v>42924</v> </b> </bs> </hist> @@ -31856,17 +31957,17 @@ <b> <a>1</a> <b>2</b> - <v>1069040</v> + <v>1068826</v> </b> <b> <a>2</a> <b>3</b> - <v>157261</v> + <v>157225</v> </b> <b> <a>3</a> <b>4</b> - <v>10414</v> + <v>10412</v> </b> </bs> </hist> @@ -31885,13 +31986,13 @@ <v>11</v> </b> <b> - <a>372581</a> - <b>372582</b> + <a>372567</a> + <b>372568</b> <v>11</v> </b> <b> - <a>1250724</a> - <b>1250725</b> + <a>1250740</a> + <b>1250741</b> <v>11</v> </b> </bs> @@ -31916,8 +32017,8 @@ <v>11</v> </b> <b> - <a>92889</a> - <b>92890</b> + <a>92892</a> + <b>92893</b> <v>11</v> </b> </bs> @@ -31928,15 +32029,15 @@ </relation> <relation> <name>new_allocated_type</name> - <cardinality>46995</cardinality> + <cardinality>46968</cardinality> <columnsizes> <e> <k>expr</k> - <v>46995</v> + <v>46968</v> </e> <e> <k>type_id</k> - <v>27793</v> + <v>27777</v> </e> </columnsizes> <dependencies> @@ -31950,7 +32051,7 @@ <b> <a>1</a> <b>2</b> - <v>46995</v> + <v>46968</v> </b> </bs> </hist> @@ -31966,12 +32067,12 @@ <b> <a>1</a> <b>2</b> - <v>11618</v> + <v>11611</v> </b> <b> <a>2</a> <b>3</b> - <v>14714</v> + <v>14705</v> </b> <b> <a>3</a> @@ -32029,7 +32130,7 @@ <b> <a>2</a> <b>3</b> - <v>1936</v> + <v>1935</v> </b> <b> <a>3</a> @@ -33071,15 +33172,15 @@ </relation> <relation> <name>condition_decl_bind</name> - <cardinality>40753</cardinality> + <cardinality>40577</cardinality> <columnsizes> <e> <k>expr</k> - <v>40753</v> + <v>40577</v> </e> <e> <k>decl</k> - <v>40753</v> + <v>40577</v> </e> </columnsizes> <dependencies> @@ -33093,7 +33194,7 @@ <b> <a>1</a> <b>2</b> - <v>40753</v> + <v>40577</v> </b> </bs> </hist> @@ -33109,7 +33210,7 @@ <b> <a>1</a> <b>2</b> - <v>40753</v> + <v>40577</v> </b> </bs> </hist> @@ -33119,15 +33220,15 @@ </relation> <relation> <name>typeid_bind</name> - <cardinality>35968</cardinality> + <cardinality>35947</cardinality> <columnsizes> <e> <k>expr</k> - <v>35968</v> + <v>35947</v> </e> <e> <k>type_id</k> - <v>16175</v> + <v>16165</v> </e> </columnsizes> <dependencies> @@ -33141,7 +33242,7 @@ <b> <a>1</a> <b>2</b> - <v>35968</v> + <v>35947</v> </b> </bs> </hist> @@ -33157,7 +33258,7 @@ <b> <a>1</a> <b>2</b> - <v>15757</v> + <v>15748</v> </b> <b> <a>3</a> @@ -33172,11 +33273,11 @@ </relation> <relation> <name>uuidof_bind</name> - <cardinality>20293</cardinality> + <cardinality>20292</cardinality> <columnsizes> <e> <k>expr</k> - <v>20293</v> + <v>20292</v> </e> <e> <k>type_id</k> @@ -33194,7 +33295,7 @@ <b> <a>1</a> <b>2</b> - <v>20293</v> + <v>20292</v> </b> </bs> </hist> @@ -33225,11 +33326,11 @@ </relation> <relation> <name>sizeof_bind</name> - <cardinality>199194</cardinality> + <cardinality>199197</cardinality> <columnsizes> <e> <k>expr</k> - <v>199194</v> + <v>199197</v> </e> <e> <k>type_id</k> @@ -33247,7 +33348,7 @@ <b> <a>1</a> <b>2</b> - <v>199194</v> + <v>199197</v> </b> </bs> </hist> @@ -33356,11 +33457,11 @@ </relation> <relation> <name>lambdas</name> - <cardinality>21456</cardinality> + <cardinality>21454</cardinality> <columnsizes> <e> <k>expr</k> - <v>21456</v> + <v>21454</v> </e> <e> <k>default_capture</k> @@ -33382,7 +33483,7 @@ <b> <a>1</a> <b>2</b> - <v>21456</v> + <v>21454</v> </b> </bs> </hist> @@ -33398,7 +33499,7 @@ <b> <a>1</a> <b>2</b> - <v>21456</v> + <v>21454</v> </b> </bs> </hist> @@ -33472,15 +33573,15 @@ </relation> <relation> <name>lambda_capture</name> - <cardinality>27986</cardinality> + <cardinality>27983</cardinality> <columnsizes> <e> <k>id</k> - <v>27986</v> + <v>27983</v> </e> <e> <k>lambda</k> - <v>20523</v> + <v>20521</v> </e> <e> <k>index</k> @@ -33488,7 +33589,7 @@ </e> <e> <k>field</k> - <v>27986</v> + <v>27983</v> </e> <e> <k>captured_by_reference</k> @@ -33514,7 +33615,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33530,7 +33631,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33546,7 +33647,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33562,7 +33663,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33578,7 +33679,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33594,7 +33695,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33610,12 +33711,12 @@ <b> <a>1</a> <b>2</b> - <v>13060</v> + <v>13059</v> </b> <b> <a>2</a> <b>3</b> - <v>7463</v> + <v>7462</v> </b> </bs> </hist> @@ -33631,12 +33732,12 @@ <b> <a>1</a> <b>2</b> - <v>13060</v> + <v>13059</v> </b> <b> <a>2</a> <b>3</b> - <v>7463</v> + <v>7462</v> </b> </bs> </hist> @@ -33652,12 +33753,12 @@ <b> <a>1</a> <b>2</b> - <v>13060</v> + <v>13059</v> </b> <b> <a>2</a> <b>3</b> - <v>7463</v> + <v>7462</v> </b> </bs> </hist> @@ -33673,7 +33774,7 @@ <b> <a>1</a> <b>2</b> - <v>20523</v> + <v>20521</v> </b> </bs> </hist> @@ -33689,7 +33790,7 @@ <b> <a>1</a> <b>2</b> - <v>20523</v> + <v>20521</v> </b> </bs> </hist> @@ -33705,12 +33806,12 @@ <b> <a>1</a> <b>2</b> - <v>13060</v> + <v>13059</v> </b> <b> <a>2</a> <b>3</b> - <v>7463</v> + <v>7462</v> </b> </bs> </hist> @@ -33842,7 +33943,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33858,7 +33959,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33874,7 +33975,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33890,7 +33991,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33906,7 +34007,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -33922,7 +34023,7 @@ <b> <a>1</a> <b>2</b> - <v>27986</v> + <v>27983</v> </b> </bs> </hist> @@ -34351,19 +34452,19 @@ </relation> <relation> <name>stmts</name> - <cardinality>4618654</cardinality> + <cardinality>4652754</cardinality> <columnsizes> <e> <k>id</k> - <v>4618654</v> + <v>4652754</v> </e> <e> <k>kind</k> - <v>1965</v> + <v>1872</v> </e> <e> <k>location</k> - <v>2268406</v> + <v>2173505</v> </e> </columnsizes> <dependencies> @@ -34377,7 +34478,7 @@ <b> <a>1</a> <b>2</b> - <v>4618654</v> + <v>4652754</v> </b> </bs> </hist> @@ -34393,7 +34494,7 @@ <b> <a>1</a> <b>2</b> - <v>4618654</v> + <v>4652754</v> </b> </bs> </hist> @@ -34409,97 +34510,97 @@ <b> <a>1</a> <b>2</b> - <v>103</v> + <v>98</v> </b> <b> <a>18</a> <b>19</b> - <v>103</v> + <v>98</v> </b> <b> <a>22</a> <b>23</b> - <v>103</v> + <v>98</v> </b> <b> - <a>46</a> - <b>47</b> - <v>103</v> + <a>51</a> + <b>52</b> + <v>98</v> </b> <b> - <a>75</a> - <b>76</b> - <v>103</v> + <a>76</a> + <b>77</b> + <v>98</v> </b> <b> - <a>83</a> - <b>84</b> - <v>103</v> + <a>84</a> + <b>85</b> + <v>98</v> </b> <b> - <a>102</a> - <b>103</b> - <v>103</v> + <a>107</a> + <b>108</b> + <v>98</v> </b> <b> - <a>154</a> - <b>155</b> - <v>103</v> + <a>163</a> + <b>164</b> + <v>98</v> </b> <b> - <a>242</a> - <b>243</b> - <v>103</v> + <a>258</a> + <b>259</b> + <v>98</v> </b> <b> - <a>284</a> - <b>285</b> - <v>103</v> + <a>299</a> + <b>300</b> + <v>98</v> </b> <b> - <a>383</a> - <b>384</b> - <v>103</v> + <a>412</a> + <b>413</b> + <v>98</v> </b> <b> - <a>418</a> - <b>419</b> - <v>103</v> + <a>498</a> + <b>499</b> + <v>98</v> </b> <b> - <a>503</a> - <b>504</b> - <v>103</v> + <a>539</a> + <b>540</b> + <v>98</v> </b> <b> - <a>1326</a> - <b>1327</b> - <v>103</v> + <a>1372</a> + <b>1373</b> + <v>98</v> </b> <b> - <a>2636</a> - <b>2637</b> - <v>103</v> + <a>2811</a> + <b>2812</b> + <v>98</v> </b> <b> - <a>4622</a> - <b>4623</b> - <v>103</v> + <a>4882</a> + <b>4883</b> + <v>98</v> </b> <b> - <a>8806</a> - <b>8807</b> - <v>103</v> + <a>9278</a> + <b>9279</b> + <v>98</v> </b> <b> - <a>11579</a> - <b>11580</b> - <v>103</v> + <a>12170</a> + <b>12171</b> + <v>98</v> </b> <b> - <a>13339</a> - <b>13340</b> - <v>103</v> + <a>14180</a> + <b>14181</b> + <v>98</v> </b> </bs> </hist> @@ -34515,97 +34616,97 @@ <b> <a>1</a> <b>2</b> - <v>103</v> + <v>98</v> </b> <b> <a>8</a> <b>9</b> - <v>103</v> + <v>98</v> </b> <b> <a>18</a> <b>19</b> - <v>103</v> + <v>98</v> </b> <b> <a>45</a> <b>46</b> - <v>103</v> + <v>98</v> </b> <b> <a>50</a> <b>51</b> - <v>103</v> + <v>98</v> </b> <b> <a>56</a> <b>57</b> - <v>103</v> + <v>98</v> </b> <b> <a>74</a> <b>75</b> - <v>103</v> - </b> - <b> - <a>89</a> - <b>90</b> - <v>103</v> + <v>98</v> </b> <b> <a>101</a> <b>102</b> - <v>103</v> + <v>98</v> </b> <b> - <a>128</a> - <b>129</b> - <v>103</v> + <a>103</a> + <b>104</b> + <v>98</v> </b> <b> - <a>209</a> - <b>210</b> - <v>103</v> + <a>131</a> + <b>132</b> + <v>98</v> + </b> + <b> + <a>225</a> + <b>226</b> + <v>98</v> </b> <b> <a>252</a> <b>253</b> - <v>103</v> + <v>98</v> </b> <b> <a>368</a> <b>369</b> - <v>103</v> + <v>98</v> </b> <b> - <a>642</a> - <b>643</b> - <v>103</v> + <a>650</a> + <b>651</b> + <v>98</v> </b> <b> - <a>1743</a> - <b>1744</b> - <v>103</v> + <a>1754</a> + <b>1755</b> + <v>98</v> </b> <b> - <a>2190</a> - <b>2191</b> - <v>103</v> + <a>2198</a> + <b>2199</b> + <v>98</v> </b> <b> - <a>4228</a> - <b>4229</b> - <v>103</v> + <a>4253</a> + <b>4254</b> + <v>98</v> </b> <b> - <a>6071</a> - <b>6072</b> - <v>103</v> + <a>6102</a> + <b>6103</b> + <v>98</v> </b> <b> - <a>6567</a> - <b>6568</b> - <v>103</v> + <a>6617</a> + <b>6618</b> + <v>98</v> </b> </bs> </hist> @@ -34621,22 +34722,22 @@ <b> <a>1</a> <b>2</b> - <v>1878336</v> + <v>1726665</v> </b> <b> <a>2</a> - <b>4</b> - <v>173927</v> + <b>3</b> + <v>178637</v> </b> <b> - <a>4</a> - <b>12</b> - <v>174031</v> + <a>3</a> + <b>8</b> + <v>166419</v> </b> <b> - <a>12</a> + <a>8</a> <b>689</b> - <v>42110</v> + <v>101783</v> </b> </bs> </hist> @@ -34652,12 +34753,12 @@ <b> <a>1</a> <b>2</b> - <v>2211706</v> + <v>2118820</v> </b> <b> <a>2</a> <b>8</b> - <v>56699</v> + <v>54684</v> </b> </bs> </hist> @@ -34763,15 +34864,15 @@ </relation> <relation> <name>if_initialization</name> - <cardinality>310</cardinality> + <cardinality>295</cardinality> <columnsizes> <e> <k>if_stmt</k> - <v>310</v> + <v>295</v> </e> <e> <k>init_id</k> - <v>310</v> + <v>295</v> </e> </columnsizes> <dependencies> @@ -34785,7 +34886,7 @@ <b> <a>1</a> <b>2</b> - <v>310</v> + <v>295</v> </b> </bs> </hist> @@ -34801,7 +34902,7 @@ <b> <a>1</a> <b>2</b> - <v>310</v> + <v>295</v> </b> </bs> </hist> @@ -34811,15 +34912,15 @@ </relation> <relation> <name>if_then</name> - <cardinality>725951</cardinality> + <cardinality>725963</cardinality> <columnsizes> <e> <k>if_stmt</k> - <v>725951</v> + <v>725963</v> </e> <e> <k>then_id</k> - <v>725951</v> + <v>725963</v> </e> </columnsizes> <dependencies> @@ -34833,7 +34934,7 @@ <b> <a>1</a> <b>2</b> - <v>725951</v> + <v>725963</v> </b> </bs> </hist> @@ -34849,7 +34950,7 @@ <b> <a>1</a> <b>2</b> - <v>725951</v> + <v>725963</v> </b> </bs> </hist> @@ -34859,15 +34960,15 @@ </relation> <relation> <name>if_else</name> - <cardinality>184679</cardinality> + <cardinality>184682</cardinality> <columnsizes> <e> <k>if_stmt</k> - <v>184679</v> + <v>184682</v> </e> <e> <k>else_id</k> - <v>184679</v> + <v>184682</v> </e> </columnsizes> <dependencies> @@ -34881,7 +34982,7 @@ <b> <a>1</a> <b>2</b> - <v>184679</v> + <v>184682</v> </b> </bs> </hist> @@ -34897,7 +34998,7 @@ <b> <a>1</a> <b>2</b> - <v>184679</v> + <v>184682</v> </b> </bs> </hist> @@ -34907,15 +35008,15 @@ </relation> <relation> <name>constexpr_if_initialization</name> - <cardinality>2</cardinality> + <cardinality>3</cardinality> <columnsizes> <e> <k>constexpr_if_stmt</k> - <v>2</v> + <v>3</v> </e> <e> <k>init_id</k> - <v>2</v> + <v>3</v> </e> </columnsizes> <dependencies> @@ -34929,7 +35030,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>3</v> </b> </bs> </hist> @@ -34945,7 +35046,7 @@ <b> <a>1</a> <b>2</b> - <v>2</v> + <v>3</v> </b> </bs> </hist> @@ -34955,15 +35056,15 @@ </relation> <relation> <name>constexpr_if_then</name> - <cardinality>52043</cardinality> + <cardinality>53108</cardinality> <columnsizes> <e> <k>constexpr_if_stmt</k> - <v>52043</v> + <v>53108</v> </e> <e> <k>then_id</k> - <v>52043</v> + <v>53108</v> </e> </columnsizes> <dependencies> @@ -34977,7 +35078,7 @@ <b> <a>1</a> <b>2</b> - <v>52043</v> + <v>53108</v> </b> </bs> </hist> @@ -34993,7 +35094,7 @@ <b> <a>1</a> <b>2</b> - <v>52043</v> + <v>53108</v> </b> </bs> </hist> @@ -35003,15 +35104,15 @@ </relation> <relation> <name>constexpr_if_else</name> - <cardinality>30522</cardinality> + <cardinality>30840</cardinality> <columnsizes> <e> <k>constexpr_if_stmt</k> - <v>30522</v> + <v>30840</v> </e> <e> <k>else_id</k> - <v>30522</v> + <v>30840</v> </e> </columnsizes> <dependencies> @@ -35025,7 +35126,7 @@ <b> <a>1</a> <b>2</b> - <v>30522</v> + <v>30840</v> </b> </bs> </hist> @@ -35041,7 +35142,7 @@ <b> <a>1</a> <b>2</b> - <v>30522</v> + <v>30840</v> </b> </bs> </hist> @@ -35051,15 +35152,15 @@ </relation> <relation> <name>while_body</name> - <cardinality>29141</cardinality> + <cardinality>29134</cardinality> <columnsizes> <e> <k>while_stmt</k> - <v>29141</v> + <v>29134</v> </e> <e> <k>body_id</k> - <v>29141</v> + <v>29134</v> </e> </columnsizes> <dependencies> @@ -35073,7 +35174,7 @@ <b> <a>1</a> <b>2</b> - <v>29141</v> + <v>29134</v> </b> </bs> </hist> @@ -35089,7 +35190,7 @@ <b> <a>1</a> <b>2</b> - <v>29141</v> + <v>29134</v> </b> </bs> </hist> @@ -35099,15 +35200,15 @@ </relation> <relation> <name>do_body</name> - <cardinality>148881</cardinality> + <cardinality>148884</cardinality> <columnsizes> <e> <k>do_stmt</k> - <v>148881</v> + <v>148884</v> </e> <e> <k>body_id</k> - <v>148881</v> + <v>148884</v> </e> </columnsizes> <dependencies> @@ -35121,7 +35222,7 @@ <b> <a>1</a> <b>2</b> - <v>148881</v> + <v>148884</v> </b> </bs> </hist> @@ -35137,7 +35238,7 @@ <b> <a>1</a> <b>2</b> - <v>148881</v> + <v>148884</v> </b> </bs> </hist> @@ -35147,15 +35248,15 @@ </relation> <relation> <name>switch_initialization</name> - <cardinality>6</cardinality> + <cardinality>8</cardinality> <columnsizes> <e> <k>switch_stmt</k> - <v>6</v> + <v>8</v> </e> <e> <k>init_id</k> - <v>6</v> + <v>8</v> </e> </columnsizes> <dependencies> @@ -35169,7 +35270,7 @@ <b> <a>1</a> <b>2</b> - <v>6</v> + <v>8</v> </b> </bs> </hist> @@ -35185,7 +35286,7 @@ <b> <a>1</a> <b>2</b> - <v>6</v> + <v>8</v> </b> </bs> </hist> @@ -35195,19 +35296,19 @@ </relation> <relation> <name>switch_case</name> - <cardinality>207702</cardinality> + <cardinality>206808</cardinality> <columnsizes> <e> <k>switch_stmt</k> - <v>11029</v> + <v>10982</v> </e> <e> <k>index</k> - <v>4678</v> + <v>4658</v> </e> <e> <k>case_id</k> - <v>207702</v> + <v>206808</v> </e> </columnsizes> <dependencies> @@ -35221,57 +35322,57 @@ <b> <a>2</a> <b>3</b> - <v>57</v> + <v>56</v> </b> <b> <a>3</a> <b>4</b> - <v>2396</v> + <v>2385</v> </b> <b> <a>4</a> <b>5</b> - <v>1768</v> + <v>1760</v> </b> <b> <a>5</a> <b>6</b> - <v>1045</v> + <v>1041</v> </b> <b> <a>6</a> <b>8</b> - <v>988</v> + <v>984</v> </b> <b> <a>8</a> <b>9</b> - <v>532</v> + <v>530</v> </b> <b> <a>9</a> <b>10</b> - <v>1026</v> + <v>1022</v> </b> <b> <a>10</a> <b>11</b> - <v>361</v> + <v>359</v> </b> <b> <a>11</a> <b>14</b> - <v>1007</v> + <v>1003</v> </b> <b> <a>14</a> <b>31</b> - <v>931</v> + <v>927</v> </b> <b> <a>36</a> <b>247</b> - <v>912</v> + <v>908</v> </b> </bs> </hist> @@ -35287,57 +35388,57 @@ <b> <a>2</a> <b>3</b> - <v>57</v> + <v>56</v> </b> <b> <a>3</a> <b>4</b> - <v>2396</v> + <v>2385</v> </b> <b> <a>4</a> <b>5</b> - <v>1768</v> + <v>1760</v> </b> <b> <a>5</a> <b>6</b> - <v>1045</v> + <v>1041</v> </b> <b> <a>6</a> <b>8</b> - <v>988</v> + <v>984</v> </b> <b> <a>8</a> <b>9</b> - <v>532</v> + <v>530</v> </b> <b> <a>9</a> <b>10</b> - <v>1026</v> + <v>1022</v> </b> <b> <a>10</a> <b>11</b> - <v>361</v> + <v>359</v> </b> <b> <a>11</a> <b>14</b> - <v>1007</v> + <v>1003</v> </b> <b> <a>14</a> <b>31</b> - <v>931</v> + <v>927</v> </b> <b> <a>36</a> <b>247</b> - <v>912</v> + <v>908</v> </b> </bs> </hist> @@ -35353,32 +35454,32 @@ <b> <a>14</a> <b>15</b> - <v>1236</v> + <v>1230</v> </b> <b> <a>19</a> <b>20</b> - <v>570</v> + <v>568</v> </b> <b> <a>33</a> <b>34</b> - <v>2015</v> + <v>2007</v> </b> <b> <a>34</a> <b>63</b> - <v>399</v> + <v>397</v> </b> <b> <a>68</a> <b>304</b> - <v>361</v> + <v>359</v> </b> <b> <a>358</a> <b>581</b> - <v>95</v> + <v>94</v> </b> </bs> </hist> @@ -35394,32 +35495,32 @@ <b> <a>14</a> <b>15</b> - <v>1236</v> + <v>1230</v> </b> <b> <a>19</a> <b>20</b> - <v>570</v> + <v>568</v> </b> <b> <a>33</a> <b>34</b> - <v>2015</v> + <v>2007</v> </b> <b> <a>34</a> <b>63</b> - <v>399</v> + <v>397</v> </b> <b> <a>68</a> <b>304</b> - <v>361</v> + <v>359</v> </b> <b> <a>358</a> <b>581</b> - <v>95</v> + <v>94</v> </b> </bs> </hist> @@ -35435,7 +35536,7 @@ <b> <a>1</a> <b>2</b> - <v>207702</v> + <v>206808</v> </b> </bs> </hist> @@ -35451,7 +35552,7 @@ <b> <a>1</a> <b>2</b> - <v>207702</v> + <v>206808</v> </b> </bs> </hist> @@ -35461,15 +35562,15 @@ </relation> <relation> <name>switch_body</name> - <cardinality>20787</cardinality> + <cardinality>20788</cardinality> <columnsizes> <e> <k>switch_stmt</k> - <v>20787</v> + <v>20788</v> </e> <e> <k>body_id</k> - <v>20787</v> + <v>20788</v> </e> </columnsizes> <dependencies> @@ -35483,7 +35584,7 @@ <b> <a>1</a> <b>2</b> - <v>20787</v> + <v>20788</v> </b> </bs> </hist> @@ -35499,7 +35600,7 @@ <b> <a>1</a> <b>2</b> - <v>20787</v> + <v>20788</v> </b> </bs> </hist> @@ -35509,15 +35610,15 @@ </relation> <relation> <name>for_initialization</name> - <cardinality>53406</cardinality> + <cardinality>53407</cardinality> <columnsizes> <e> <k>for_stmt</k> - <v>53406</v> + <v>53407</v> </e> <e> <k>init_id</k> - <v>53406</v> + <v>53407</v> </e> </columnsizes> <dependencies> @@ -35531,7 +35632,7 @@ <b> <a>1</a> <b>2</b> - <v>53406</v> + <v>53407</v> </b> </bs> </hist> @@ -35547,7 +35648,7 @@ <b> <a>1</a> <b>2</b> - <v>53406</v> + <v>53407</v> </b> </bs> </hist> @@ -35557,15 +35658,15 @@ </relation> <relation> <name>for_condition</name> - <cardinality>55671</cardinality> + <cardinality>55672</cardinality> <columnsizes> <e> <k>for_stmt</k> - <v>55671</v> + <v>55672</v> </e> <e> <k>condition_id</k> - <v>55671</v> + <v>55672</v> </e> </columnsizes> <dependencies> @@ -35579,7 +35680,7 @@ <b> <a>1</a> <b>2</b> - <v>55671</v> + <v>55672</v> </b> </bs> </hist> @@ -35595,7 +35696,7 @@ <b> <a>1</a> <b>2</b> - <v>55671</v> + <v>55672</v> </b> </bs> </hist> @@ -35605,15 +35706,15 @@ </relation> <relation> <name>for_update</name> - <cardinality>53509</cardinality> + <cardinality>53510</cardinality> <columnsizes> <e> <k>for_stmt</k> - <v>53509</v> + <v>53510</v> </e> <e> <k>update_id</k> - <v>53509</v> + <v>53510</v> </e> </columnsizes> <dependencies> @@ -35627,7 +35728,7 @@ <b> <a>1</a> <b>2</b> - <v>53509</v> + <v>53510</v> </b> </bs> </hist> @@ -35643,7 +35744,7 @@ <b> <a>1</a> <b>2</b> - <v>53509</v> + <v>53510</v> </b> </bs> </hist> @@ -35653,15 +35754,15 @@ </relation> <relation> <name>for_body</name> - <cardinality>61559</cardinality> + <cardinality>61560</cardinality> <columnsizes> <e> <k>for_stmt</k> - <v>61559</v> + <v>61560</v> </e> <e> <k>body_id</k> - <v>61559</v> + <v>61560</v> </e> </columnsizes> <dependencies> @@ -35675,7 +35776,7 @@ <b> <a>1</a> <b>2</b> - <v>61559</v> + <v>61560</v> </b> </bs> </hist> @@ -35691,7 +35792,7 @@ <b> <a>1</a> <b>2</b> - <v>61559</v> + <v>61560</v> </b> </bs> </hist> @@ -35701,19 +35802,19 @@ </relation> <relation> <name>stmtparents</name> - <cardinality>4054557</cardinality> + <cardinality>4054504</cardinality> <columnsizes> <e> <k>id</k> - <v>4054557</v> + <v>4054504</v> </e> <e> <k>index</k> - <v>12327</v> + <v>12326</v> </e> <e> <k>parent</k> - <v>1721299</v> + <v>1721253</v> </e> </columnsizes> <dependencies> @@ -35727,7 +35828,7 @@ <b> <a>1</a> <b>2</b> - <v>4054557</v> + <v>4054504</v> </b> </bs> </hist> @@ -35743,7 +35844,7 @@ <b> <a>1</a> <b>2</b> - <v>4054557</v> + <v>4054504</v> </b> </bs> </hist> @@ -35803,7 +35904,7 @@ </b> <b> <a>77</a> - <b>195140</b> + <b>195141</b> <v>704</v> </b> </bs> @@ -35864,7 +35965,7 @@ </b> <b> <a>77</a> - <b>195140</b> + <b>195141</b> <v>704</v> </b> </bs> @@ -35881,27 +35982,27 @@ <b> <a>1</a> <b>2</b> - <v>989142</v> + <v>989112</v> </b> <b> <a>2</a> <b>3</b> - <v>372562</v> + <v>372551</v> </b> <b> <a>3</a> <b>4</b> - <v>105701</v> + <v>105697</v> </b> <b> <a>4</a> <b>6</b> - <v>111255</v> + <v>111251</v> </b> <b> <a>6</a> <b>17</b> - <v>130355</v> + <v>130357</v> </b> <b> <a>17</a> @@ -35922,27 +36023,27 @@ <b> <a>1</a> <b>2</b> - <v>989142</v> + <v>989112</v> </b> <b> <a>2</a> <b>3</b> - <v>372562</v> + <v>372551</v> </b> <b> <a>3</a> <b>4</b> - <v>105701</v> + <v>105697</v> </b> <b> <a>4</a> <b>6</b> - <v>111255</v> + <v>111251</v> </b> <b> <a>6</a> <b>17</b> - <v>130355</v> + <v>130357</v> </b> <b> <a>17</a> @@ -35957,30 +36058,30 @@ </relation> <relation> <name>ishandler</name> - <cardinality>62736</cardinality> + <cardinality>62466</cardinality> <columnsizes> <e> <k>block</k> - <v>62736</v> + <v>62466</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>stmt_decl_bind</name> - <cardinality>580797</cardinality> + <cardinality>580812</cardinality> <columnsizes> <e> <k>stmt</k> - <v>540979</v> + <v>541032</v> </e> <e> <k>num</k> - <v>75</v> + <v>74</v> </e> <e> <k>decl</k> - <v>580692</v> + <v>580708</v> </e> </columnsizes> <dependencies> @@ -35994,12 +36095,12 @@ <b> <a>1</a> <b>2</b> - <v>520271</v> + <v>520345</v> </b> <b> <a>2</a> <b>19</b> - <v>20707</v> + <v>20687</v> </b> </bs> </hist> @@ -36015,12 +36116,12 @@ <b> <a>1</a> <b>2</b> - <v>520271</v> + <v>520345</v> </b> <b> <a>2</a> <b>19</b> - <v>20707</v> + <v>20687</v> </b> </bs> </hist> @@ -36099,18 +36200,18 @@ <v>4</v> </b> <b> - <a>2570</a> - <b>2571</b> + <a>2571</a> + <b>2572</b> <v>4</v> </b> <b> - <a>4968</a> - <b>4969</b> + <a>4969</a> + <b>4970</b> <v>4</v> </b> <b> - <a>129790</a> - <b>129791</b> + <a>129953</a> + <b>129954</b> <v>4</v> </b> </bs> @@ -36190,18 +36291,18 @@ <v>4</v> </b> <b> - <a>2570</a> - <b>2571</b> + <a>2571</a> + <b>2572</b> <v>4</v> </b> <b> - <a>4968</a> - <b>4969</b> + <a>4969</a> + <b>4970</b> <v>4</v> </b> <b> - <a>129765</a> - <b>129766</b> + <a>129928</a> + <b>129929</b> <v>4</v> </b> </bs> @@ -36218,7 +36319,7 @@ <b> <a>1</a> <b>2</b> - <v>580655</v> + <v>580671</v> </b> <b> <a>2</a> @@ -36239,7 +36340,7 @@ <b> <a>1</a> <b>2</b> - <v>580692</v> + <v>580708</v> </b> </bs> </hist> @@ -36249,19 +36350,19 @@ </relation> <relation> <name>stmt_decl_entry_bind</name> - <cardinality>523673</cardinality> + <cardinality>580812</cardinality> <columnsizes> <e> <k>stmt</k> - <v>484155</v> + <v>541032</v> </e> <e> <k>num</k> - <v>75</v> + <v>74</v> </e> <e> <k>decl_entry</k> - <v>523614</v> + <v>580754</v> </e> </columnsizes> <dependencies> @@ -36275,12 +36376,12 @@ <b> <a>1</a> <b>2</b> - <v>463710</v> + <v>520345</v> </b> <b> <a>2</a> <b>19</b> - <v>20444</v> + <v>20687</v> </b> </bs> </hist> @@ -36296,12 +36397,12 @@ <b> <a>1</a> <b>2</b> - <v>463710</v> + <v>520345</v> </b> <b> <a>2</a> <b>19</b> - <v>20444</v> + <v>20687</v> </b> </bs> </hist> @@ -36380,18 +36481,18 @@ <v>4</v> </b> <b> - <a>2561</a> - <b>2562</b> + <a>2571</a> + <b>2572</b> <v>4</v> </b> <b> - <a>4905</a> - <b>4906</b> + <a>4969</a> + <b>4970</b> <v>4</v> </b> <b> - <a>116157</a> - <b>116158</b> + <a>129953</a> + <b>129954</b> <v>4</v> </b> </bs> @@ -36471,18 +36572,18 @@ <v>4</v> </b> <b> - <a>2561</a> - <b>2562</b> + <a>2571</a> + <b>2572</b> <v>4</v> </b> <b> - <a>4905</a> - <b>4906</b> + <a>4969</a> + <b>4970</b> <v>4</v> </b> <b> - <a>116143</a> - <b>116144</b> + <a>129939</a> + <b>129940</b> <v>4</v> </b> </bs> @@ -36499,7 +36600,7 @@ <b> <a>1</a> <b>2</b> - <v>523593</v> + <v>580733</v> </b> <b> <a>3</a> @@ -36520,7 +36621,7 @@ <b> <a>1</a> <b>2</b> - <v>523614</v> + <v>580754</v> </b> </bs> </hist> @@ -36530,15 +36631,15 @@ </relation> <relation> <name>blockscope</name> - <cardinality>1415642</cardinality> + <cardinality>1415522</cardinality> <columnsizes> <e> <k>block</k> - <v>1415642</v> + <v>1415522</v> </e> <e> <k>enclosing</k> - <v>1300432</v> + <v>1300321</v> </e> </columnsizes> <dependencies> @@ -36552,7 +36653,7 @@ <b> <a>1</a> <b>2</b> - <v>1415642</v> + <v>1415522</v> </b> </bs> </hist> @@ -36568,12 +36669,12 @@ <b> <a>1</a> <b>2</b> - <v>1235130</v> + <v>1235025</v> </b> <b> <a>2</a> <b>13</b> - <v>65301</v> + <v>65295</v> </b> </bs> </hist> @@ -36583,11 +36684,11 @@ </relation> <relation> <name>jumpinfo</name> - <cardinality>254469</cardinality> + <cardinality>254474</cardinality> <columnsizes> <e> <k>id</k> - <v>254469</v> + <v>254474</v> </e> <e> <k>str</k> @@ -36595,7 +36696,7 @@ </e> <e> <k>target</k> - <v>53144</v> + <v>53145</v> </e> </columnsizes> <dependencies> @@ -36609,7 +36710,7 @@ <b> <a>1</a> <b>2</b> - <v>254469</v> + <v>254474</v> </b> </bs> </hist> @@ -36625,7 +36726,7 @@ <b> <a>1</a> <b>2</b> - <v>254469</v> + <v>254474</v> </b> </bs> </hist> @@ -36723,7 +36824,7 @@ <b> <a>2</a> <b>3</b> - <v>26477</v> + <v>26478</v> </b> <b> <a>3</a> @@ -36733,7 +36834,7 @@ <b> <a>4</a> <b>5</b> - <v>5352</v> + <v>5353</v> </b> <b> <a>5</a> @@ -36759,7 +36860,7 @@ <b> <a>1</a> <b>2</b> - <v>53144</v> + <v>53145</v> </b> </bs> </hist> @@ -36769,19 +36870,19 @@ </relation> <relation> <name>preprocdirects</name> - <cardinality>4386889</cardinality> + <cardinality>4186401</cardinality> <columnsizes> <e> <k>id</k> - <v>4386889</v> + <v>4186401</v> </e> <e> <k>kind</k> - <v>1138</v> + <v>5130</v> </e> <e> <k>location</k> - <v>4384302</v> + <v>4145824</v> </e> </columnsizes> <dependencies> @@ -36795,7 +36896,7 @@ <b> <a>1</a> <b>2</b> - <v>4386889</v> + <v>4186401</v> </b> </bs> </hist> @@ -36811,7 +36912,7 @@ <b> <a>1</a> <b>2</b> - <v>4386889</v> + <v>4186401</v> </b> </bs> </hist> @@ -36825,59 +36926,59 @@ <budget>12</budget> <bs> <b> - <a>1</a> - <b>2</b> - <v>103</v> + <a>4</a> + <b>5</b> + <v>466</v> </b> <b> - <a>122</a> - <b>123</b> - <v>103</v> + <a>54</a> + <b>55</b> + <v>466</v> </b> <b> - <a>694</a> - <b>695</b> - <v>103</v> + <a>151</a> + <b>152</b> + <v>466</v> </b> <b> - <a>799</a> - <b>800</b> - <v>103</v> + <a>448</a> + <b>449</b> + <v>466</v> </b> <b> - <a>932</a> - <b>933</b> - <v>103</v> + <a>554</a> + <b>555</b> + <v>466</v> </b> <b> - <a>1689</a> - <b>1690</b> - <v>103</v> + <a>564</a> + <b>565</b> + <v>466</v> </b> <b> - <a>1792</a> - <b>1793</b> - <v>103</v> + <a>571</a> + <b>572</b> + <v>466</v> </b> <b> - <a>3012</a> - <b>3013</b> - <v>103</v> + <a>667</a> + <b>668</b> + <v>466</v> </b> <b> - <a>3802</a> - <b>3803</b> - <v>103</v> + <a>1429</a> + <b>1430</b> + <v>466</v> </b> <b> - <a>6290</a> - <b>6291</b> - <v>103</v> + <a>1970</a> + <b>1971</b> + <v>466</v> </b> <b> - <a>23266</a> - <b>23267</b> - <v>103</v> + <a>2564</a> + <b>2565</b> + <v>466</v> </b> </bs> </hist> @@ -36891,59 +36992,59 @@ <budget>12</budget> <bs> <b> - <a>1</a> - <b>2</b> - <v>103</v> + <a>4</a> + <b>5</b> + <v>466</v> </b> <b> - <a>122</a> - <b>123</b> - <v>103</v> + <a>54</a> + <b>55</b> + <v>466</v> </b> <b> - <a>694</a> - <b>695</b> - <v>103</v> + <a>151</a> + <b>152</b> + <v>466</v> </b> <b> - <a>799</a> - <b>800</b> - <v>103</v> + <a>448</a> + <b>449</b> + <v>466</v> </b> <b> - <a>932</a> - <b>933</b> - <v>103</v> + <a>554</a> + <b>555</b> + <v>466</v> </b> <b> - <a>1689</a> - <b>1690</b> - <v>103</v> + <a>564</a> + <b>565</b> + <v>466</v> </b> <b> - <a>1792</a> - <b>1793</b> - <v>103</v> + <a>571</a> + <b>572</b> + <v>466</v> </b> <b> - <a>3012</a> - <b>3013</b> - <v>103</v> + <a>667</a> + <b>668</b> + <v>466</v> </b> <b> - <a>3802</a> - <b>3803</b> - <v>103</v> + <a>1429</a> + <b>1430</b> + <v>466</v> </b> <b> - <a>6290</a> - <b>6291</b> - <v>103</v> + <a>1883</a> + <b>1884</b> + <v>466</v> </b> <b> - <a>23241</a> - <b>23242</b> - <v>103</v> + <a>2564</a> + <b>2565</b> + <v>466</v> </b> </bs> </hist> @@ -36959,12 +37060,12 @@ <b> <a>1</a> <b>2</b> - <v>4384198</v> + <v>4145358</v> </b> <b> - <a>26</a> - <b>27</b> - <v>103</v> + <a>88</a> + <b>89</b> + <v>466</v> </b> </bs> </hist> @@ -36980,7 +37081,7 @@ <b> <a>1</a> <b>2</b> - <v>4384302</v> + <v>4145824</v> </b> </bs> </hist> @@ -36990,15 +37091,15 @@ </relation> <relation> <name>preprocpair</name> - <cardinality>1430102</cardinality> + <cardinality>1429980</cardinality> <columnsizes> <e> <k>begin</k> - <v>1195950</v> + <v>1195848</v> </e> <e> <k>elseelifend</k> - <v>1430102</v> + <v>1429980</v> </e> </columnsizes> <dependencies> @@ -37012,17 +37113,17 @@ <b> <a>1</a> <b>2</b> - <v>977656</v> + <v>977573</v> </b> <b> <a>2</a> <b>3</b> - <v>208031</v> + <v>208014</v> </b> <b> <a>3</a> <b>11</b> - <v>10261</v> + <v>10260</v> </b> </bs> </hist> @@ -37038,7 +37139,7 @@ <b> <a>1</a> <b>2</b> - <v>1430102</v> + <v>1429980</v> </b> </bs> </hist> @@ -37048,41 +37149,41 @@ </relation> <relation> <name>preproctrue</name> - <cardinality>766359</cardinality> + <cardinality>766294</cardinality> <columnsizes> <e> <k>branch</k> - <v>766359</v> + <v>766294</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>preprocfalse</name> - <cardinality>331171</cardinality> + <cardinality>331143</cardinality> <columnsizes> <e> <k>branch</k> - <v>331171</v> + <v>331143</v> </e> </columnsizes> <dependencies/> </relation> <relation> <name>preproctext</name> - <cardinality>3537219</cardinality> + <cardinality>3368495</cardinality> <columnsizes> <e> <k>id</k> - <v>3537219</v> + <v>3368495</v> </e> <e> <k>head</k> - <v>2563493</v> + <v>2441215</v> </e> <e> <k>body</k> - <v>1498199</v> + <v>1426735</v> </e> </columnsizes> <dependencies> @@ -37096,7 +37197,7 @@ <b> <a>1</a> <b>2</b> - <v>3537219</v> + <v>3368495</v> </b> </bs> </hist> @@ -37112,7 +37213,7 @@ <b> <a>1</a> <b>2</b> - <v>3537219</v> + <v>3368495</v> </b> </bs> </hist> @@ -37128,12 +37229,12 @@ <b> <a>1</a> <b>2</b> - <v>2417708</v> + <v>2302384</v> </b> <b> <a>2</a> <b>740</b> - <v>145784</v> + <v>138830</v> </b> </bs> </hist> @@ -37149,12 +37250,12 @@ <b> <a>1</a> <b>2</b> - <v>2501827</v> + <v>2382490</v> </b> <b> <a>2</a> <b>5</b> - <v>61666</v> + <v>58724</v> </b> </bs> </hist> @@ -37170,17 +37271,17 @@ <b> <a>1</a> <b>2</b> - <v>1356242</v> + <v>1291550</v> </b> <b> <a>2</a> <b>6</b> - <v>112364</v> + <v>107005</v> </b> <b> <a>6</a> <b>11630</b> - <v>29591</v> + <v>28179</v> </b> </bs> </hist> @@ -37196,17 +37297,17 @@ <b> <a>1</a> <b>2</b> - <v>1359243</v> + <v>1294407</v> </b> <b> <a>2</a> <b>7</b> - <v>112675</v> + <v>107300</v> </b> <b> <a>7</a> <b>2980</b> - <v>26280</v> + <v>25026</v> </b> </bs> </hist> @@ -37216,15 +37317,15 @@ </relation> <relation> <name>includes</name> - <cardinality>312980</cardinality> + <cardinality>312954</cardinality> <columnsizes> <e> <k>id</k> - <v>312980</v> + <v>312954</v> </e> <e> <k>included</k> - <v>117076</v> + <v>117066</v> </e> </columnsizes> <dependencies> @@ -37238,7 +37339,7 @@ <b> <a>1</a> <b>2</b> - <v>312980</v> + <v>312954</v> </b> </bs> </hist> @@ -37254,32 +37355,32 @@ <b> <a>1</a> <b>2</b> - <v>61103</v> + <v>61098</v> </b> <b> <a>2</a> <b>3</b> - <v>21922</v> + <v>21920</v> </b> <b> <a>3</a> <b>4</b> - <v>12593</v> + <v>12592</v> </b> <b> <a>4</a> <b>6</b> - <v>10261</v> + <v>10260</v> </b> <b> <a>6</a> <b>14</b> - <v>8862</v> + <v>8861</v> </b> <b> <a>14</a> <b>47</b> - <v>2332</v> + <v>2331</v> </b> </bs> </hist> @@ -37289,15 +37390,15 @@ </relation> <relation> <name>link_targets</name> - <cardinality>817</cardinality> + <cardinality>814</cardinality> <columnsizes> <e> <k>id</k> - <v>817</v> + <v>814</v> </e> <e> <k>binary</k> - <v>817</v> + <v>814</v> </e> </columnsizes> <dependencies> @@ -37311,7 +37412,7 @@ <b> <a>1</a> <b>2</b> - <v>817</v> + <v>814</v> </b> </bs> </hist> @@ -37327,7 +37428,7 @@ <b> <a>1</a> <b>2</b> - <v>817</v> + <v>814</v> </b> </bs> </hist> @@ -37337,11 +37438,11 @@ </relation> <relation> <name>link_parent</name> - <cardinality>38867468</cardinality> + <cardinality>38845246</cardinality> <columnsizes> <e> <k>element</k> - <v>4926386</v> + <v>4923570</v> </e> <e> <k>link_target</k> @@ -37359,17 +37460,17 @@ <b> <a>1</a> <b>2</b> - <v>664089</v> + <v>663709</v> </b> <b> <a>2</a> <b>9</b> - <v>25845</v> + <v>25830</v> </b> <b> <a>9</a> <b>10</b> - <v>4236452</v> + <v>4234029</v> </b> </bs> </hist> diff --git a/cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/old.dbscheme b/cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/old.dbscheme new file mode 100644 index 000000000000..abfce5c170f9 --- /dev/null +++ b/cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/old.dbscheme @@ -0,0 +1,2251 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* +case @function.kind of + 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; +*/ + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +| 40 = @decimal32 // _Decimal32 +| 41 = @decimal64 // _Decimal64 +| 42 = @decimal128 // _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* +case @usertype.kind of + 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +| 5 = @typedef // classic C: typedef typedef type name +| 6 = @template +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +| 14 = @using_alias // a using name = type style typedef +; +*/ + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..3d35dd6b50ed --- /dev/null +++ b/cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/semmlecode.cpp.dbscheme @@ -0,0 +1,2289 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* +case @function.kind of + 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; +*/ + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +| 40 = @decimal32 // _Decimal32 +| 41 = @decimal64 // _Decimal64 +| 42 = @decimal128 // _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* +case @usertype.kind of + 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +| 5 = @typedef // classic C: typedef typedef type name +| 6 = @template +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +| 14 = @using_alias // a using name = type style typedef +; +*/ + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/upgrade.properties b/cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/upgrade.properties new file mode 100644 index 000000000000..db0e7e92d0e9 --- /dev/null +++ b/cpp/ql/lib/upgrades/abfce5c170f93e281948f7689ece373464fdaf87/upgrade.properties @@ -0,0 +1,2 @@ +description: Add new builtin operations +compatibility: backwards diff --git a/cpp/ql/test/library-tests/builtins/type_traits/clang.cpp b/cpp/ql/test/library-tests/builtins/type_traits/clang.cpp index 2c25f1881382..167023c1a33c 100644 --- a/cpp/ql/test/library-tests/builtins/type_traits/clang.cpp +++ b/cpp/ql/test/library-tests/builtins/type_traits/clang.cpp @@ -1,4 +1,4 @@ -// semmle-extractor-options: --clang --clang_version 100000 +// semmle-extractor-options: --clang --clang_version 180000 struct S { void f() {} @@ -93,3 +93,18 @@ struct S2 { bool bok_is_trivial1 = __is_trivial(int); bool bok_is_trivial2 = __is_trivial(S2); + +bool bok_reference_binds_to_temporary1 = __reference_binds_to_temporary(int&, long&); +bool bok_reference_binds_to_temporary2 = __reference_binds_to_temporary(int const &, long&); + +bool b_is_same_as1 = __is_same_as(int, int); +bool b_is_same_as2 = __is_same_as(int, float); + +bool b_is_bounded_array1 = __is_bounded_array(int[]); +bool b_is_bounded_array2 = __is_bounded_array(int[42]); + +bool b_is_unbounded_array1 = __is_unbounded_array(int[]); +bool b_is_unbounded_array2 = __is_unbounded_array(int[42]); + +bool b_is_referenceable1 = __is_referenceable(int); +bool b_is_referenceable2 = __is_referenceable(void); diff --git a/cpp/ql/test/library-tests/builtins/type_traits/expr.expected b/cpp/ql/test/library-tests/builtins/type_traits/expr.expected index 9cc6ec6ec929..da6812b2772b 100644 --- a/cpp/ql/test/library-tests/builtins/type_traits/expr.expected +++ b/cpp/ql/test/library-tests/builtins/type_traits/expr.expected @@ -125,9 +125,78 @@ | clang.cpp:94:24:94:40 | int | | <none> | | clang.cpp:95:24:95:39 | S2 | | <none> | | clang.cpp:95:24:95:39 | __is_trivial | S2 | 0 | +| clang.cpp:97:42:97:84 | __reference_binds_to_temporary | int &,long & | 0 | +| clang.cpp:97:42:97:84 | int & | | <none> | +| clang.cpp:97:42:97:84 | long & | | <none> | +| clang.cpp:98:42:98:91 | __reference_binds_to_temporary | const int &,long & | 1 | +| clang.cpp:98:42:98:91 | const int & | | <none> | +| clang.cpp:98:42:98:91 | long & | | <none> | +| clang.cpp:100:22:100:43 | __is_same_as | int,int | 1 | +| clang.cpp:100:22:100:43 | int | | <none> | +| clang.cpp:100:22:100:43 | int | | <none> | +| clang.cpp:101:22:101:45 | __is_same_as | int,float | 0 | +| clang.cpp:101:22:101:45 | float | | <none> | +| clang.cpp:101:22:101:45 | int | | <none> | +| clang.cpp:103:28:103:52 | __is_bounded_array | int[] | 0 | +| clang.cpp:103:28:103:52 | int[] | | <none> | +| clang.cpp:104:28:104:54 | __is_bounded_array | int[42] | 1 | +| clang.cpp:104:28:104:54 | int[42] | | <none> | +| clang.cpp:104:51:104:52 | 42 | | 42 | +| clang.cpp:104:51:104:52 | (unsigned long)... | | 42 | +| clang.cpp:106:30:106:56 | __is_unbounded_array | int[] | 1 | +| clang.cpp:106:30:106:56 | int[] | | <none> | +| clang.cpp:107:30:107:58 | __is_unbounded_array | int[42] | 0 | +| clang.cpp:107:30:107:58 | int[42] | | <none> | +| clang.cpp:107:55:107:56 | 42 | | 42 | +| clang.cpp:107:55:107:56 | (unsigned long)... | | 42 | +| clang.cpp:109:28:109:50 | __is_referenceable | int | 1 | +| clang.cpp:109:28:109:50 | int | | <none> | +| clang.cpp:110:28:110:51 | __is_referenceable | void | 0 | +| clang.cpp:110:28:110:51 | void | | <none> | | file://:0:0:0:0 | 0 | | 0 | | file://:0:0:0:0 | 1 | | 1 | | file://:0:0:0:0 | 2 | | 2 | +| gcc.cpp:3:25:3:25 | 8 | | 8 | +| gcc.cpp:4:25:4:59 | 0 | | 0 | +| gcc.cpp:4:25:4:59 | __builtin_has_attribute | v,0 | 1 | +| gcc.cpp:4:49:4:49 | v | | <none> | +| gcc.cpp:5:25:5:62 | 0 | | 0 | +| gcc.cpp:5:25:5:62 | __builtin_has_attribute | v,0 | 0 | +| gcc.cpp:5:49:5:49 | v | | <none> | +| gcc.cpp:13:50:13:111 | __builtin_is_pointer_interconvertible_with_class | i | 1 | +| gcc.cpp:13:99:13:110 | i | | <none> | +| gcc.cpp:14:50:14:111 | __builtin_is_pointer_interconvertible_with_class | d | 0 | +| gcc.cpp:14:99:14:110 | d | | <none> | +| gcc.cpp:16:35:16:95 | __builtin_is_corresponding_member | i,i | 1 | +| gcc.cpp:16:69:16:80 | i | | <none> | +| gcc.cpp:16:83:16:94 | i | | <none> | +| gcc.cpp:17:35:17:95 | __builtin_is_corresponding_member | i,d | 0 | +| gcc.cpp:17:69:17:80 | i | | <none> | +| gcc.cpp:17:83:17:94 | d | | <none> | +| gcc.cpp:19:34:19:67 | __is_nothrow_convertible | int,int | 1 | +| gcc.cpp:19:34:19:67 | int | | <none> | +| gcc.cpp:19:34:19:67 | int | | <none> | +| gcc.cpp:20:34:20:72 | __is_nothrow_convertible | a_struct,int | 0 | +| gcc.cpp:20:34:20:72 | a_struct | | <none> | +| gcc.cpp:20:34:20:72 | int | | <none> | +| gcc.cpp:22:26:22:51 | __is_convertible | int,int | 1 | +| gcc.cpp:22:26:22:51 | int | | <none> | +| gcc.cpp:22:26:22:51 | int | | <none> | +| gcc.cpp:23:26:23:56 | __is_convertible | a_struct,int | 0 | +| gcc.cpp:23:26:23:56 | a_struct | | <none> | +| gcc.cpp:23:26:23:56 | int | | <none> | +| gcc.cpp:25:47:25:95 | __reference_constructs_from_temporary | int &&,int | 1 | +| gcc.cpp:25:47:25:95 | int | | <none> | +| gcc.cpp:25:47:25:95 | int && | | <none> | +| gcc.cpp:26:47:26:97 | __reference_constructs_from_temporary | int &&,int && | 0 | +| gcc.cpp:26:47:26:97 | int && | | <none> | +| gcc.cpp:26:47:26:97 | int && | | <none> | +| gcc.cpp:28:45:28:91 | (no string representation) | int &&,int | 1 | +| gcc.cpp:28:45:28:91 | int | | <none> | +| gcc.cpp:28:45:28:91 | int && | | <none> | +| gcc.cpp:29:45:29:93 | (no string representation) | int &&,int && | 0 | +| gcc.cpp:29:45:29:93 | int && | | <none> | +| gcc.cpp:29:45:29:93 | int && | | <none> | | ms.cpp:38:41:38:45 | 0 | | 0 | | ms.cpp:88:27:88:45 | __has_assign | empty | 0 | | ms.cpp:88:27:88:45 | empty | | <none> | @@ -452,3 +521,38 @@ | ms.cpp:272:51:272:104 | __is_pointer_interconvertible_base_of | empty,abstract | 0 | | ms.cpp:272:51:272:104 | abstract | | <none> | | ms.cpp:272:51:272:104 | empty | | <none> | +| ms.cpp:274:44:274:85 | __is_trivially_copy_assignable | has_assign | 0 | +| ms.cpp:274:44:274:85 | has_assign | | <none> | +| ms.cpp:275:44:275:78 | __is_trivially_copy_assignable | int | 1 | +| ms.cpp:275:44:275:78 | int | | <none> | +| ms.cpp:277:51:277:107 | __is_assignable_no_precondition_check | a_struct,a_struct | 1 | +| ms.cpp:277:51:277:107 | a_struct | | <none> | +| ms.cpp:277:51:277:107 | a_struct | | <none> | +| ms.cpp:278:51:278:104 | __is_assignable_no_precondition_check | a_struct,empty | 0 | +| ms.cpp:278:51:278:104 | a_struct | | <none> | +| ms.cpp:278:51:278:104 | empty | | <none> | +| ms.cpp:279:51:279:102 | __is_assignable_no_precondition_check | a_struct,int | 0 | +| ms.cpp:279:51:279:102 | a_struct | | <none> | +| ms.cpp:279:51:279:102 | int | | <none> | +| ms.cpp:281:54:281:117 | __is_pointer_interconvertible_with_class | a_struct,i | 1 | +| ms.cpp:281:54:281:117 | a_struct | | <none> | +| ms.cpp:281:105:281:116 | i | | <none> | +| ms.cpp:282:54:282:117 | __is_pointer_interconvertible_with_class | a_struct,d | 0 | +| ms.cpp:282:54:282:117 | a_struct | | <none> | +| ms.cpp:282:105:282:116 | d | | <none> | +| ms.cpp:284:39:284:111 | __is_corresponding_member | a_struct,a_struct,i,i | 1 | +| ms.cpp:284:39:284:111 | a_struct | | <none> | +| ms.cpp:284:39:284:111 | a_struct | | <none> | +| ms.cpp:284:85:284:96 | i | | <none> | +| ms.cpp:284:99:284:110 | i | | <none> | +| ms.cpp:285:39:285:111 | __is_corresponding_member | a_struct,a_struct,i,d | 0 | +| ms.cpp:285:39:285:111 | a_struct | | <none> | +| ms.cpp:285:39:285:111 | a_struct | | <none> | +| ms.cpp:285:85:285:96 | i | | <none> | +| ms.cpp:285:99:285:110 | d | | <none> | +| ms.cpp:287:34:287:59 | __is_valid_winrt_type | int | 1 | +| ms.cpp:287:34:287:59 | int | | <none> | +| ms.cpp:288:27:288:45 | __is_win_class | int | 0 | +| ms.cpp:288:27:288:45 | int | | <none> | +| ms.cpp:289:31:289:53 | __is_win_interface | int | 0 | +| ms.cpp:289:31:289:53 | int | | <none> | diff --git a/cpp/ql/test/library-tests/builtins/type_traits/gcc.cpp b/cpp/ql/test/library-tests/builtins/type_traits/gcc.cpp new file mode 100644 index 000000000000..54224343e7e2 --- /dev/null +++ b/cpp/ql/test/library-tests/builtins/type_traits/gcc.cpp @@ -0,0 +1,29 @@ +// semmle-extractor-options: --gnu_version 130000 + +__attribute__ ((aligned(8))) int v; +bool b_has_attribute1 = __builtin_has_attribute(v, aligned); +bool b_has_attribute2 = __builtin_has_attribute(v, aligned(4)); + + +struct a_struct { + int i; + double d; +}; + +bool b_is_pointer_interconvertible_with_class1 = __builtin_is_pointer_interconvertible_with_class(&a_struct::i); +bool b_is_pointer_interconvertible_with_class2 = __builtin_is_pointer_interconvertible_with_class(&a_struct::d); + +bool b_is_corresponding_member1 = __builtin_is_corresponding_member(&a_struct::i, &a_struct::i); +bool b_is_corresponding_member2 = __builtin_is_corresponding_member(&a_struct::i, &a_struct::d); + +bool b_is_nothrow_convertible1 = __is_nothrow_convertible(int, int); +bool b_is_nothrow_convertible2 = __is_nothrow_convertible(a_struct, int); + +bool b_is_convertible1 = __is_convertible(int, int); +bool b_is_convertible2 = __is_convertible(a_struct, int); + +bool b_reference_constructs_from_temporary1 = __reference_constructs_from_temporary(int&&, int); +bool b_reference_constructs_from_temporary2 = __reference_constructs_from_temporary(int&&, int&&); + +bool b_reference_converts_from_temporary1 = __reference_converts_from_temporary(int&&, int); +bool b_reference_converts_from_temporary2 = __reference_converts_from_temporary(int&&, int&&); diff --git a/cpp/ql/test/library-tests/builtins/type_traits/ms.cpp b/cpp/ql/test/library-tests/builtins/type_traits/ms.cpp index 6083f9dc6bb5..d51248dd3ec8 100644 --- a/cpp/ql/test/library-tests/builtins/type_traits/ms.cpp +++ b/cpp/ql/test/library-tests/builtins/type_traits/ms.cpp @@ -270,4 +270,21 @@ void f(void) { bool b_is_pointer_interconvertible_base_of1 = __is_pointer_interconvertible_base_of(empty, empty); bool b_is_pointer_interconvertible_base_of2 = __is_pointer_interconvertible_base_of(empty, abstract); + + bool b_is_trivially_copy_assignable1 = __is_trivially_copy_assignable(has_assign); + bool b_is_trivially_copy_assignable2 = __is_trivially_copy_assignable(int); + + bool b_is_assignable_no_precondition_check1 = __is_assignable_no_precondition_check(a_struct, a_struct); + bool b_is_assignable_no_precondition_check2 = __is_assignable_no_precondition_check(a_struct, empty); + bool b_is_assignable_no_precondition_check3 = __is_assignable_no_precondition_check(a_struct, int); + + bool b_is_pointer_interconvertible_with_class1 = __is_pointer_interconvertible_with_class(a_struct, &a_struct::i); + bool b_is_pointer_interconvertible_with_class2 = __is_pointer_interconvertible_with_class(a_struct, &a_struct::d); + + bool b_is_corresponding_member1 = __is_corresponding_member(a_struct, a_struct, &a_struct::i, &a_struct::i); + bool b_is_corresponding_member2 = __is_corresponding_member(a_struct, a_struct, &a_struct::i, &a_struct::d); + + bool b_is_valid_winrt_type = __is_valid_winrt_type(int); + bool b_is_win_class = __is_win_class(int); + bool b_is_win_interface = __is_win_interface(int); } From 3417605b6dfe154142f62bce7bc5f7ed58768867 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <owen-mc@github.com> Date: Thu, 11 Jul 2024 06:42:58 +0100 Subject: [PATCH 63/70] Tests: update provenance numbering --- .../CWE-090/LDAPInjection.expected | 28 ++-- .../test/experimental/CWE-203/Timing.expected | 6 +- .../CWE-287/ImproperLdapAuth.expected | 2 +- .../CWE-369/DivideByZero.expected | 12 +- .../DecompressionBombs.expected | 6 +- .../experimental/CWE-74/DsnInjection.expected | 2 +- .../HTMLTemplateEscapingPassthrough.expected | 26 ++-- go/ql/test/experimental/CWE-918/SSRF.expected | 18 +-- .../DefaultSanitizer.expected | 6 +- .../threat-models-flowtest1.expected | 4 +- .../threat-models-flowtest2.expected | 4 +- .../threat-models-flowtest3.expected | 4 +- .../threat-models-flowtest4.expected | 4 +- .../threat-models-flowtest5.expected | 4 +- .../threat-models-flowtest6.expected | 4 +- .../go/frameworks/Beego/ReflectedXss.expected | 144 +++++++++--------- .../go/frameworks/Beego/TaintedPath.expected | 14 +- .../frameworks/BeegoOrm/SqlInjection.expected | 64 ++++---- .../go/frameworks/Echo/ReflectedXss.expected | 14 +- .../go/frameworks/Encoding/jsoniter.expected | 8 +- .../go/frameworks/Revel/ReflectedXss.expected | 6 +- .../go/frameworks/Revel/TaintedPath.expected | 4 +- .../frameworks/Twirp/RequestForgery.expected | 4 +- .../frameworks/XNetHtml/ReflectedXss.expected | 38 ++--- .../frameworks/XNetHtml/SqlInjection.expected | 4 +- .../Security/CWE-022/ZipSlip.expected | 4 +- .../CWE-078/CommandInjection.expected | 16 +- .../Security/CWE-079/ReflectedXss.expected | 36 ++--- .../Security/CWE-089/SqlInjection.expected | 22 +-- .../Security/CWE-089/StringBreak.expected | 4 +- .../InsecureRandomness.expected | 2 +- .../CWE-347/MissingJwtSignatureCheck.expected | 14 +- .../BadRedirectCheck.expected | 4 +- .../OpenUrlRedirect/OpenUrlRedirect.expected | 4 +- .../Security/CWE-640/EmailInjection.expected | 26 ++-- .../Security/CWE-643/XPathInjection.expected | 24 +-- .../Security/CWE-918/RequestForgery.expected | 34 ++--- 37 files changed, 310 insertions(+), 310 deletions(-) diff --git a/go/ql/test/experimental/CWE-090/LDAPInjection.expected b/go/ql/test/experimental/CWE-090/LDAPInjection.expected index 1b21ad41b8e0..ff6470f80f04 100644 --- a/go/ql/test/experimental/CWE-090/LDAPInjection.expected +++ b/go/ql/test/experimental/CWE-090/LDAPInjection.expected @@ -1,18 +1,18 @@ edges -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:59:3:59:11 | untrusted | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:61:3:61:51 | ...+... | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:62:3:62:33 | slice literal | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:62:24:62:32 | untrusted | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:66:3:66:11 | untrusted | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:68:3:68:51 | ...+... | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:69:3:69:33 | slice literal | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:69:24:69:32 | untrusted | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:73:3:73:11 | untrusted | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:75:3:75:51 | ...+... | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:76:3:76:33 | slice literal | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:76:24:76:32 | untrusted | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:80:22:80:30 | untrusted | provenance | Src:MaD:747 | -| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:81:25:81:33 | untrusted | provenance | Src:MaD:747 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:59:3:59:11 | untrusted | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:61:3:61:51 | ...+... | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:62:3:62:33 | slice literal | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:62:24:62:32 | untrusted | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:66:3:66:11 | untrusted | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:68:3:68:51 | ...+... | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:69:3:69:33 | slice literal | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:69:24:69:32 | untrusted | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:73:3:73:11 | untrusted | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:75:3:75:51 | ...+... | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:76:3:76:33 | slice literal | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:76:24:76:32 | untrusted | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:80:22:80:30 | untrusted | provenance | Src:MaD:686 | +| LDAPInjection.go:57:15:57:29 | call to UserAgent | LDAPInjection.go:81:25:81:33 | untrusted | provenance | Src:MaD:686 | | LDAPInjection.go:62:3:62:33 | slice literal [array] | LDAPInjection.go:62:3:62:33 | slice literal | provenance | | | LDAPInjection.go:62:24:62:32 | untrusted | LDAPInjection.go:62:3:62:33 | slice literal [array] | provenance | | | LDAPInjection.go:69:3:69:33 | slice literal [array] | LDAPInjection.go:69:3:69:33 | slice literal | provenance | | diff --git a/go/ql/test/experimental/CWE-203/Timing.expected b/go/ql/test/experimental/CWE-203/Timing.expected index 9abfb3d575b4..97462acd2492 100644 --- a/go/ql/test/experimental/CWE-203/Timing.expected +++ b/go/ql/test/experimental/CWE-203/Timing.expected @@ -1,9 +1,9 @@ edges -| timing.go:15:18:15:27 | selection of Header | timing.go:15:18:15:45 | call to Get | provenance | MaD:728 | +| timing.go:15:18:15:27 | selection of Header | timing.go:15:18:15:45 | call to Get | provenance | MaD:667 | | timing.go:15:18:15:45 | call to Get | timing.go:17:31:17:42 | headerSecret | provenance | | -| timing.go:28:18:28:27 | selection of Header | timing.go:28:18:28:45 | call to Get | provenance | MaD:728 | +| timing.go:28:18:28:27 | selection of Header | timing.go:28:18:28:45 | call to Get | provenance | MaD:667 | | timing.go:28:18:28:45 | call to Get | timing.go:30:47:30:58 | headerSecret | provenance | | -| timing.go:41:18:41:27 | selection of Header | timing.go:41:18:41:45 | call to Get | provenance | MaD:728 | +| timing.go:41:18:41:27 | selection of Header | timing.go:41:18:41:45 | call to Get | provenance | MaD:667 | | timing.go:41:18:41:45 | call to Get | timing.go:42:25:42:36 | headerSecret | provenance | | nodes | timing.go:15:18:15:27 | selection of Header | semmle.label | selection of Header | diff --git a/go/ql/test/experimental/CWE-287/ImproperLdapAuth.expected b/go/ql/test/experimental/CWE-287/ImproperLdapAuth.expected index 6c21e152efc7..c83a815689c7 100644 --- a/go/ql/test/experimental/CWE-287/ImproperLdapAuth.expected +++ b/go/ql/test/experimental/CWE-287/ImproperLdapAuth.expected @@ -1,5 +1,5 @@ edges -| ImproperLdapAuth.go:18:18:18:24 | selection of URL | ImproperLdapAuth.go:18:18:18:32 | call to Query | provenance | MaD:808 | +| ImproperLdapAuth.go:18:18:18:24 | selection of URL | ImproperLdapAuth.go:18:18:18:32 | call to Query | provenance | MaD:747 | | ImproperLdapAuth.go:18:18:18:32 | call to Query | ImproperLdapAuth.go:28:23:28:34 | bindPassword | provenance | | | ImproperLdapAuth.go:87:18:87:19 | "" | ImproperLdapAuth.go:97:23:97:34 | bindPassword | provenance | | nodes diff --git a/go/ql/test/experimental/CWE-369/DivideByZero.expected b/go/ql/test/experimental/CWE-369/DivideByZero.expected index 5303951e4dc8..8d54fe70758b 100644 --- a/go/ql/test/experimental/CWE-369/DivideByZero.expected +++ b/go/ql/test/experimental/CWE-369/DivideByZero.expected @@ -1,24 +1,24 @@ edges -| DivideByZero.go:10:12:10:16 | selection of URL | DivideByZero.go:10:12:10:24 | call to Query | provenance | MaD:808 | +| DivideByZero.go:10:12:10:16 | selection of URL | DivideByZero.go:10:12:10:24 | call to Query | provenance | MaD:747 | | DivideByZero.go:10:12:10:24 | call to Query | DivideByZero.go:11:27:11:32 | param1 | provenance | | | DivideByZero.go:11:2:11:33 | ... := ...[0] | DivideByZero.go:12:16:12:20 | value | provenance | | | DivideByZero.go:11:27:11:32 | param1 | DivideByZero.go:11:2:11:33 | ... := ...[0] | provenance | Config | -| DivideByZero.go:17:12:17:16 | selection of URL | DivideByZero.go:17:12:17:24 | call to Query | provenance | MaD:808 | +| DivideByZero.go:17:12:17:16 | selection of URL | DivideByZero.go:17:12:17:24 | call to Query | provenance | MaD:747 | | DivideByZero.go:17:12:17:24 | call to Query | DivideByZero.go:18:11:18:24 | type conversion | provenance | | | DivideByZero.go:18:11:18:24 | type conversion | DivideByZero.go:19:16:19:20 | value | provenance | | -| DivideByZero.go:24:12:24:16 | selection of URL | DivideByZero.go:24:12:24:24 | call to Query | provenance | MaD:808 | +| DivideByZero.go:24:12:24:16 | selection of URL | DivideByZero.go:24:12:24:24 | call to Query | provenance | MaD:747 | | DivideByZero.go:24:12:24:24 | call to Query | DivideByZero.go:25:31:25:36 | param1 | provenance | | | DivideByZero.go:25:2:25:45 | ... := ...[0] | DivideByZero.go:26:16:26:20 | value | provenance | | | DivideByZero.go:25:31:25:36 | param1 | DivideByZero.go:25:2:25:45 | ... := ...[0] | provenance | Config | -| DivideByZero.go:31:12:31:16 | selection of URL | DivideByZero.go:31:12:31:24 | call to Query | provenance | MaD:808 | +| DivideByZero.go:31:12:31:16 | selection of URL | DivideByZero.go:31:12:31:24 | call to Query | provenance | MaD:747 | | DivideByZero.go:31:12:31:24 | call to Query | DivideByZero.go:32:33:32:38 | param1 | provenance | | | DivideByZero.go:32:2:32:43 | ... := ...[0] | DivideByZero.go:33:16:33:20 | value | provenance | | | DivideByZero.go:32:33:32:38 | param1 | DivideByZero.go:32:2:32:43 | ... := ...[0] | provenance | Config | -| DivideByZero.go:38:12:38:16 | selection of URL | DivideByZero.go:38:12:38:24 | call to Query | provenance | MaD:808 | +| DivideByZero.go:38:12:38:16 | selection of URL | DivideByZero.go:38:12:38:24 | call to Query | provenance | MaD:747 | | DivideByZero.go:38:12:38:24 | call to Query | DivideByZero.go:39:32:39:37 | param1 | provenance | | | DivideByZero.go:39:2:39:46 | ... := ...[0] | DivideByZero.go:40:16:40:20 | value | provenance | | | DivideByZero.go:39:32:39:37 | param1 | DivideByZero.go:39:2:39:46 | ... := ...[0] | provenance | Config | -| DivideByZero.go:54:12:54:16 | selection of URL | DivideByZero.go:54:12:54:24 | call to Query | provenance | MaD:808 | +| DivideByZero.go:54:12:54:16 | selection of URL | DivideByZero.go:54:12:54:24 | call to Query | provenance | MaD:747 | | DivideByZero.go:54:12:54:24 | call to Query | DivideByZero.go:55:11:55:24 | type conversion | provenance | | | DivideByZero.go:55:11:55:24 | type conversion | DivideByZero.go:57:17:57:21 | value | provenance | | nodes diff --git a/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombs.expected b/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombs.expected index 691a39136461..c431b749378f 100644 --- a/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombs.expected +++ b/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombs.expected @@ -1,5 +1,5 @@ edges -| test.go:59:16:59:44 | call to FormValue | test.go:128:20:128:27 | definition of filename | provenance | Src:MaD:743 | +| test.go:59:16:59:44 | call to FormValue | test.go:128:20:128:27 | definition of filename | provenance | Src:MaD:682 | | test.go:60:15:60:26 | selection of Body | test.go:158:19:158:22 | definition of file | provenance | | | test.go:61:24:61:35 | selection of Body | test.go:169:28:169:31 | definition of file | provenance | | | test.go:62:13:62:24 | selection of Body | test.go:181:17:181:20 | definition of file | provenance | | @@ -31,7 +31,7 @@ edges | test.go:145:12:145:19 | call to Open | test.go:147:37:147:38 | rc | provenance | | | test.go:158:19:158:22 | definition of file | test.go:159:25:159:28 | file | provenance | | | test.go:159:2:159:29 | ... := ...[0] | test.go:160:48:160:52 | file1 | provenance | | -| test.go:159:25:159:28 | file | test.go:159:2:159:29 | ... := ...[0] | provenance | MaD:620 | +| test.go:159:25:159:28 | file | test.go:159:2:159:29 | ... := ...[0] | provenance | MaD:559 | | test.go:160:2:160:69 | ... := ...[0] | test.go:163:26:163:29 | file | provenance | | | test.go:160:32:160:53 | call to NewReader | test.go:160:2:160:69 | ... := ...[0] | provenance | Config | | test.go:160:48:160:52 | file1 | test.go:160:32:160:53 | call to NewReader | provenance | MaD:46 | @@ -39,7 +39,7 @@ edges | test.go:163:26:163:29 | file | test.go:163:3:163:36 | ... := ...[0] | provenance | MaD:8 | | test.go:169:28:169:31 | definition of file | test.go:170:25:170:28 | file | provenance | | | test.go:170:2:170:29 | ... := ...[0] | test.go:171:57:171:61 | file2 | provenance | | -| test.go:170:25:170:28 | file | test.go:170:2:170:29 | ... := ...[0] | provenance | MaD:620 | +| test.go:170:25:170:28 | file | test.go:170:2:170:29 | ... := ...[0] | provenance | MaD:559 | | test.go:171:2:171:78 | ... := ...[0] | test.go:175:26:175:29 | file | provenance | | | test.go:171:41:171:62 | call to NewReader | test.go:171:2:171:78 | ... := ...[0] | provenance | Config | | test.go:171:57:171:61 | file2 | test.go:171:41:171:62 | call to NewReader | provenance | MaD:46 | diff --git a/go/ql/test/experimental/CWE-74/DsnInjection.expected b/go/ql/test/experimental/CWE-74/DsnInjection.expected index d305280c9e11..84911854fb14 100644 --- a/go/ql/test/experimental/CWE-74/DsnInjection.expected +++ b/go/ql/test/experimental/CWE-74/DsnInjection.expected @@ -1,5 +1,5 @@ edges -| Dsn.go:47:10:47:30 | call to FormValue | Dsn.go:49:102:49:105 | name | provenance | Src:MaD:743 | +| Dsn.go:47:10:47:30 | call to FormValue | Dsn.go:49:102:49:105 | name | provenance | Src:MaD:682 | | Dsn.go:49:11:49:106 | []type{args} [array] | Dsn.go:49:11:49:106 | call to Sprintf | provenance | MaD:248 | | Dsn.go:49:11:49:106 | call to Sprintf | Dsn.go:50:29:50:33 | dbDSN | provenance | | | Dsn.go:49:102:49:105 | name | Dsn.go:49:11:49:106 | []type{args} [array] | provenance | | diff --git a/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.expected b/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.expected index c697e5398030..3e94b795995a 100644 --- a/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.expected +++ b/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.expected @@ -1,28 +1,28 @@ edges | HTMLTemplateEscapingPassthrough.go:29:12:29:41 | type conversion | HTMLTemplateEscapingPassthrough.go:30:39:30:39 | a | provenance | | -| HTMLTemplateEscapingPassthrough.go:29:26:29:40 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:29:12:29:41 | type conversion | provenance | Src:MaD:747 | +| HTMLTemplateEscapingPassthrough.go:29:26:29:40 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:29:12:29:41 | type conversion | provenance | Src:MaD:686 | | HTMLTemplateEscapingPassthrough.go:35:9:35:38 | type conversion | HTMLTemplateEscapingPassthrough.go:36:40:36:40 | a | provenance | | -| HTMLTemplateEscapingPassthrough.go:35:23:35:37 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:35:9:35:38 | type conversion | provenance | Src:MaD:747 | +| HTMLTemplateEscapingPassthrough.go:35:23:35:37 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:35:9:35:38 | type conversion | provenance | Src:MaD:686 | | HTMLTemplateEscapingPassthrough.go:40:9:40:34 | type conversion | HTMLTemplateEscapingPassthrough.go:41:40:41:40 | a | provenance | | -| HTMLTemplateEscapingPassthrough.go:40:19:40:33 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:40:9:40:34 | type conversion | provenance | Src:MaD:747 | +| HTMLTemplateEscapingPassthrough.go:40:19:40:33 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:40:9:40:34 | type conversion | provenance | Src:MaD:686 | | HTMLTemplateEscapingPassthrough.go:46:11:46:44 | type conversion | HTMLTemplateEscapingPassthrough.go:47:41:47:41 | c | provenance | | -| HTMLTemplateEscapingPassthrough.go:46:29:46:43 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:46:11:46:44 | type conversion | provenance | Src:MaD:747 | +| HTMLTemplateEscapingPassthrough.go:46:29:46:43 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:46:11:46:44 | type conversion | provenance | Src:MaD:686 | | HTMLTemplateEscapingPassthrough.go:50:11:50:38 | type conversion | HTMLTemplateEscapingPassthrough.go:51:44:51:44 | d | provenance | | -| HTMLTemplateEscapingPassthrough.go:50:23:50:37 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:50:11:50:38 | type conversion | provenance | Src:MaD:747 | +| HTMLTemplateEscapingPassthrough.go:50:23:50:37 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:50:11:50:38 | type conversion | provenance | Src:MaD:686 | | HTMLTemplateEscapingPassthrough.go:54:11:54:41 | type conversion | HTMLTemplateEscapingPassthrough.go:55:44:55:44 | e | provenance | | -| HTMLTemplateEscapingPassthrough.go:54:26:54:40 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:54:11:54:41 | type conversion | provenance | Src:MaD:747 | +| HTMLTemplateEscapingPassthrough.go:54:26:54:40 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:54:11:54:41 | type conversion | provenance | Src:MaD:686 | | HTMLTemplateEscapingPassthrough.go:58:11:58:39 | type conversion | HTMLTemplateEscapingPassthrough.go:59:38:59:38 | b | provenance | | -| HTMLTemplateEscapingPassthrough.go:58:24:58:38 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:58:11:58:39 | type conversion | provenance | Src:MaD:747 | +| HTMLTemplateEscapingPassthrough.go:58:24:58:38 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:58:11:58:39 | type conversion | provenance | Src:MaD:686 | | HTMLTemplateEscapingPassthrough.go:62:11:62:42 | type conversion | HTMLTemplateEscapingPassthrough.go:63:44:63:44 | f | provenance | | -| HTMLTemplateEscapingPassthrough.go:62:27:62:41 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:62:11:62:42 | type conversion | provenance | Src:MaD:747 | +| HTMLTemplateEscapingPassthrough.go:62:27:62:41 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:62:11:62:42 | type conversion | provenance | Src:MaD:686 | | HTMLTemplateEscapingPassthrough.go:66:11:66:39 | type conversion | HTMLTemplateEscapingPassthrough.go:67:38:67:38 | g | provenance | | -| HTMLTemplateEscapingPassthrough.go:66:24:66:38 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:66:11:66:39 | type conversion | provenance | Src:MaD:747 | -| HTMLTemplateEscapingPassthrough.go:75:17:75:31 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:76:38:76:44 | escaped | provenance | Src:MaD:747 | -| HTMLTemplateEscapingPassthrough.go:81:10:81:24 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:84:38:84:40 | src | provenance | Src:MaD:747 | -| HTMLTemplateEscapingPassthrough.go:89:10:89:24 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:91:64:91:66 | src | provenance | Src:MaD:747 | +| HTMLTemplateEscapingPassthrough.go:66:24:66:38 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:66:11:66:39 | type conversion | provenance | Src:MaD:686 | +| HTMLTemplateEscapingPassthrough.go:75:17:75:31 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:76:38:76:44 | escaped | provenance | Src:MaD:686 | +| HTMLTemplateEscapingPassthrough.go:81:10:81:24 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:84:38:84:40 | src | provenance | Src:MaD:686 | +| HTMLTemplateEscapingPassthrough.go:89:10:89:24 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:91:64:91:66 | src | provenance | Src:MaD:686 | | HTMLTemplateEscapingPassthrough.go:91:16:91:77 | type conversion | HTMLTemplateEscapingPassthrough.go:92:38:92:46 | converted | provenance | | | HTMLTemplateEscapingPassthrough.go:91:38:91:67 | call to HTMLEscapeString | HTMLTemplateEscapingPassthrough.go:91:16:91:77 | type conversion | provenance | | -| HTMLTemplateEscapingPassthrough.go:91:64:91:66 | src | HTMLTemplateEscapingPassthrough.go:91:38:91:67 | call to HTMLEscapeString | provenance | MaD:595 | +| HTMLTemplateEscapingPassthrough.go:91:64:91:66 | src | HTMLTemplateEscapingPassthrough.go:91:38:91:67 | call to HTMLEscapeString | provenance | MaD:534 | nodes | HTMLTemplateEscapingPassthrough.go:29:12:29:41 | type conversion | semmle.label | type conversion | | HTMLTemplateEscapingPassthrough.go:29:26:29:40 | call to UserAgent | semmle.label | call to UserAgent | diff --git a/go/ql/test/experimental/CWE-918/SSRF.expected b/go/ql/test/experimental/CWE-918/SSRF.expected index 92b571da8e4b..081fcf1cd4bb 100644 --- a/go/ql/test/experimental/CWE-918/SSRF.expected +++ b/go/ql/test/experimental/CWE-918/SSRF.expected @@ -1,9 +1,9 @@ edges -| builtin.go:19:12:19:34 | call to FormValue | builtin.go:22:21:22:62 | ...+... | provenance | Src:MaD:743 | -| builtin.go:83:21:83:31 | call to Referer | builtin.go:88:27:88:40 | untrustedInput | provenance | Src:MaD:746 | -| builtin.go:97:21:97:31 | call to Referer | builtin.go:101:36:101:49 | untrustedInput | provenance | Src:MaD:746 | -| builtin.go:111:21:111:31 | call to Referer | builtin.go:114:15:114:28 | untrustedInput | provenance | Src:MaD:746 | -| builtin.go:129:21:129:31 | call to Referer | builtin.go:132:38:132:51 | untrustedInput | provenance | Src:MaD:746 | +| builtin.go:19:12:19:34 | call to FormValue | builtin.go:22:21:22:62 | ...+... | provenance | Src:MaD:682 | +| builtin.go:83:21:83:31 | call to Referer | builtin.go:88:27:88:40 | untrustedInput | provenance | Src:MaD:685 | +| builtin.go:97:21:97:31 | call to Referer | builtin.go:101:36:101:49 | untrustedInput | provenance | Src:MaD:685 | +| builtin.go:111:21:111:31 | call to Referer | builtin.go:114:15:114:28 | untrustedInput | provenance | Src:MaD:685 | +| builtin.go:129:21:129:31 | call to Referer | builtin.go:132:38:132:51 | untrustedInput | provenance | Src:MaD:685 | | new-tests.go:26:26:26:30 | &... | new-tests.go:31:48:31:56 | selection of word | provenance | | | new-tests.go:26:26:26:30 | &... | new-tests.go:32:48:32:56 | selection of safe | provenance | | | new-tests.go:26:26:26:30 | &... | new-tests.go:35:49:35:57 | selection of word | provenance | | @@ -19,7 +19,7 @@ edges | new-tests.go:39:18:39:30 | call to Param | new-tests.go:47:11:47:46 | ...+... | provenance | | | new-tests.go:49:18:49:30 | call to Query | new-tests.go:50:11:50:46 | ...+... | provenance | | | new-tests.go:62:2:62:39 | ... := ...[0] | new-tests.go:63:17:63:23 | reqBody | provenance | | -| new-tests.go:62:31:62:38 | selection of Body | new-tests.go:62:2:62:39 | ... := ...[0] | provenance | MaD:613 | +| new-tests.go:62:31:62:38 | selection of Body | new-tests.go:62:2:62:39 | ... := ...[0] | provenance | MaD:552 | | new-tests.go:63:17:63:23 | reqBody | new-tests.go:63:26:63:30 | &... | provenance | MaD:187 | | new-tests.go:63:26:63:30 | &... | new-tests.go:68:48:68:56 | selection of word | provenance | | | new-tests.go:63:26:63:30 | &... | new-tests.go:69:48:69:56 | selection of safe | provenance | | @@ -33,12 +33,12 @@ edges | new-tests.go:74:12:74:58 | []type{args} [array] | new-tests.go:74:12:74:58 | call to Sprintf | provenance | MaD:248 | | new-tests.go:74:49:74:57 | selection of word | new-tests.go:74:12:74:58 | []type{args} [array] | provenance | | | new-tests.go:74:49:74:57 | selection of word | new-tests.go:74:12:74:58 | call to Sprintf | provenance | FunctionModel | -| new-tests.go:78:18:78:24 | selection of URL | new-tests.go:78:18:78:32 | call to Query | provenance | MaD:808 | -| new-tests.go:78:18:78:32 | call to Query | new-tests.go:78:18:78:46 | call to Get | provenance | MaD:815 | +| new-tests.go:78:18:78:24 | selection of URL | new-tests.go:78:18:78:32 | call to Query | provenance | MaD:747 | +| new-tests.go:78:18:78:32 | call to Query | new-tests.go:78:18:78:46 | call to Get | provenance | MaD:754 | | new-tests.go:78:18:78:46 | call to Get | new-tests.go:79:11:79:46 | ...+... | provenance | | | new-tests.go:81:18:81:67 | call to TrimPrefix | new-tests.go:82:11:82:46 | ...+... | provenance | | | new-tests.go:81:37:81:43 | selection of URL | new-tests.go:81:37:81:48 | selection of Path | provenance | | -| new-tests.go:81:37:81:48 | selection of Path | new-tests.go:81:18:81:67 | call to TrimPrefix | provenance | MaD:931 | +| new-tests.go:81:37:81:48 | selection of Path | new-tests.go:81:18:81:67 | call to TrimPrefix | provenance | MaD:870 | | new-tests.go:86:10:86:20 | call to Vars | new-tests.go:88:11:88:46 | ...+... | provenance | | | new-tests.go:95:18:95:45 | call to URLParam | new-tests.go:96:11:96:46 | ...+... | provenance | | nodes diff --git a/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/DefaultSanitizer.expected b/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/DefaultSanitizer.expected index 6140dbb7d080..a19e41c241cc 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/DefaultSanitizer.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/DefaultSanitizer.expected @@ -1,10 +1,10 @@ edges | Builtin.go:6:2:6:2 | definition of b | Builtin.go:8:9:8:17 | type conversion | provenance | | -| Builtin.go:7:2:7:15 | selection of Body | Builtin.go:6:2:6:2 | definition of b | provenance | MaD:626 | +| Builtin.go:7:2:7:15 | selection of Body | Builtin.go:6:2:6:2 | definition of b | provenance | MaD:565 | | Builtin.go:12:2:12:2 | definition of b | Builtin.go:17:9:17:17 | type conversion | provenance | | -| Builtin.go:13:2:13:15 | selection of Body | Builtin.go:12:2:12:2 | definition of b | provenance | MaD:626 | +| Builtin.go:13:2:13:15 | selection of Body | Builtin.go:12:2:12:2 | definition of b | provenance | MaD:565 | | Builtin.go:21:2:21:2 | definition of b | Builtin.go:24:10:24:18 | type conversion | provenance | | -| Builtin.go:22:2:22:15 | selection of Body | Builtin.go:21:2:21:2 | definition of b | provenance | MaD:626 | +| Builtin.go:22:2:22:15 | selection of Body | Builtin.go:21:2:21:2 | definition of b | provenance | MaD:565 | nodes | Builtin.go:6:2:6:2 | definition of b | semmle.label | definition of b | | Builtin.go:7:2:7:15 | selection of Body | semmle.label | selection of Body | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest1.expected b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest1.expected index 048fde10674e..9bffdf15a4cb 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest1.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest1.expected @@ -1,6 +1,6 @@ edges -| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:808 | -| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:815 | +| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:747 | +| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:754 | | test.go:32:11:32:36 | call to Get | test.go:34:7:34:30 | ...+... | provenance | | nodes | test.go:32:11:32:15 | selection of URL | semmle.label | selection of URL | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest2.expected b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest2.expected index 7c9b9865e855..459c7601a368 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest2.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest2.expected @@ -1,7 +1,7 @@ edges | test.go:27:11:27:63 | call to ExecuteQuery | test.go:28:7:28:11 | query | provenance | Src:MaD:1 | -| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:808 | -| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:815 | +| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:747 | +| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:754 | | test.go:32:11:32:36 | call to Get | test.go:34:7:34:30 | ...+... | provenance | | nodes | test.go:27:11:27:63 | call to ExecuteQuery | semmle.label | call to ExecuteQuery | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest3.expected b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest3.expected index 8d488a8346bc..357bc6b4c916 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest3.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest3.expected @@ -2,8 +2,8 @@ edges | test.go:9:10:9:40 | call to ReadEnvironment | test.go:11:7:11:29 | ...+... | provenance | Src:MaD:2 | | test.go:15:9:15:32 | call to GetCliArg | test.go:17:7:17:28 | ...+... | provenance | Src:MaD:4 | | test.go:27:11:27:63 | call to ExecuteQuery | test.go:28:7:28:11 | query | provenance | Src:MaD:1 | -| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:808 | -| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:815 | +| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:747 | +| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:754 | | test.go:32:11:32:36 | call to Get | test.go:34:7:34:30 | ...+... | provenance | | nodes | test.go:9:10:9:40 | call to ReadEnvironment | semmle.label | call to ReadEnvironment | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest4.expected b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest4.expected index df5bff83eb7a..0675c895e229 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest4.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest4.expected @@ -3,8 +3,8 @@ edges | test.go:15:9:15:32 | call to GetCliArg | test.go:17:7:17:28 | ...+... | provenance | Src:MaD:4 | | test.go:21:11:21:36 | call to GetCustom | test.go:23:7:23:30 | ...+... | provenance | Src:MaD:3 | | test.go:27:11:27:63 | call to ExecuteQuery | test.go:28:7:28:11 | query | provenance | Src:MaD:1 | -| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:808 | -| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:815 | +| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:747 | +| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:754 | | test.go:32:11:32:36 | call to Get | test.go:34:7:34:30 | ...+... | provenance | | nodes | test.go:9:10:9:40 | call to ReadEnvironment | semmle.label | call to ReadEnvironment | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest5.expected b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest5.expected index 824d22e1e91e..833e9b7ae675 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest5.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest5.expected @@ -1,8 +1,8 @@ edges | test.go:9:10:9:40 | call to ReadEnvironment | test.go:11:7:11:29 | ...+... | provenance | Src:MaD:3 | | test.go:15:9:15:32 | call to GetCliArg | test.go:17:7:17:28 | ...+... | provenance | Src:MaD:5 | -| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:808 | -| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:815 | +| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:747 | +| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:754 | | test.go:32:11:32:36 | call to Get | test.go:34:7:34:30 | ...+... | provenance | | nodes | test.go:9:10:9:40 | call to ReadEnvironment | semmle.label | call to ReadEnvironment | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest6.expected b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest6.expected index 789c6d954c8c..a255c58f19ab 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest6.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/threat-models-flowtest6.expected @@ -1,8 +1,8 @@ edges | test.go:15:9:15:32 | call to GetCliArg | test.go:17:7:17:28 | ...+... | provenance | Src:MaD:5 | | test.go:27:11:27:63 | call to ExecuteQuery | test.go:28:7:28:11 | query | provenance | Src:MaD:2 | -| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:808 | -| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:815 | +| test.go:32:11:32:15 | selection of URL | test.go:32:11:32:23 | call to Query | provenance | MaD:747 | +| test.go:32:11:32:23 | call to Query | test.go:32:11:32:36 | call to Get | provenance | MaD:754 | | test.go:32:11:32:36 | call to Get | test.go:34:7:34:30 | ...+... | provenance | | nodes | test.go:15:9:15:32 | call to GetCliArg | semmle.label | call to GetCliArg | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected index 81d770e777ce..9f76a01ff824 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected @@ -1,104 +1,104 @@ edges -| test.go:33:6:33:10 | definition of bound | test.go:35:13:35:30 | type conversion | provenance | Src:MaD:254 | -| test.go:33:6:33:10 | definition of bound | test.go:36:13:36:27 | type conversion | provenance | Src:MaD:254 | -| test.go:33:6:33:10 | definition of bound | test.go:37:13:37:29 | type conversion | provenance | Src:MaD:254 | -| test.go:42:20:42:42 | call to Cookie | test.go:42:13:42:43 | type conversion | provenance | Src:MaD:255 | -| test.go:47:20:47:31 | call to Data | test.go:47:13:47:52 | type conversion | provenance | Src:MaD:256 | -| test.go:52:20:52:43 | call to GetData | test.go:52:13:52:53 | type conversion | provenance | Src:MaD:257 | -| test.go:57:20:57:42 | call to Header | test.go:57:13:57:43 | type conversion | provenance | Src:MaD:258 | -| test.go:62:20:62:41 | call to Param | test.go:62:13:62:42 | type conversion | provenance | Src:MaD:259 | -| test.go:67:20:67:33 | call to Params | test.go:67:13:67:45 | type conversion | provenance | Src:MaD:260 | -| test.go:72:20:72:41 | call to Query | test.go:72:13:72:42 | type conversion | provenance | Src:MaD:261 | -| test.go:77:20:77:32 | call to Refer | test.go:77:13:77:33 | type conversion | provenance | Src:MaD:262 | -| test.go:82:20:82:34 | call to Referer | test.go:82:13:82:35 | type conversion | provenance | Src:MaD:263 | -| test.go:87:20:87:30 | call to URI | test.go:87:13:87:31 | type conversion | provenance | Src:MaD:265 | -| test.go:92:20:92:30 | call to URL | test.go:92:13:92:31 | type conversion | provenance | Src:MaD:266 | -| test.go:97:20:97:36 | call to UserAgent | test.go:97:13:97:37 | type conversion | provenance | Src:MaD:267 | -| test.go:102:14:102:25 | call to Data | test.go:102:14:102:45 | type assertion | provenance | Src:MaD:256 | -| test.go:114:14:114:25 | call to Data | test.go:114:14:114:45 | type assertion | provenance | Src:MaD:256 | -| test.go:126:14:126:25 | call to Data | test.go:126:14:126:45 | type assertion | provenance | Src:MaD:256 | -| test.go:143:23:143:42 | call to Data | test.go:143:23:143:62 | type assertion | provenance | Src:MaD:256 | -| test.go:199:15:199:26 | call to Data | test.go:200:36:200:53 | type assertion | provenance | Src:MaD:256 | -| test.go:199:15:199:26 | call to Data | test.go:201:39:201:56 | type assertion | provenance | Src:MaD:256 | -| test.go:199:15:199:26 | call to Data | test.go:202:28:202:56 | type assertion | provenance | Src:MaD:256 | -| test.go:199:15:199:26 | call to Data | test.go:204:36:204:53 | type assertion | provenance | Src:MaD:256 | -| test.go:199:15:199:26 | call to Data | test.go:205:34:205:51 | type assertion | provenance | Src:MaD:256 | +| test.go:33:6:33:10 | definition of bound | test.go:35:13:35:30 | type conversion | provenance | Src:MaD:270 | +| test.go:33:6:33:10 | definition of bound | test.go:36:13:36:27 | type conversion | provenance | Src:MaD:270 | +| test.go:33:6:33:10 | definition of bound | test.go:37:13:37:29 | type conversion | provenance | Src:MaD:270 | +| test.go:42:20:42:42 | call to Cookie | test.go:42:13:42:43 | type conversion | provenance | Src:MaD:271 | +| test.go:47:20:47:31 | call to Data | test.go:47:13:47:52 | type conversion | provenance | Src:MaD:272 | +| test.go:52:20:52:43 | call to GetData | test.go:52:13:52:53 | type conversion | provenance | Src:MaD:273 | +| test.go:57:20:57:42 | call to Header | test.go:57:13:57:43 | type conversion | provenance | Src:MaD:274 | +| test.go:62:20:62:41 | call to Param | test.go:62:13:62:42 | type conversion | provenance | Src:MaD:275 | +| test.go:67:20:67:33 | call to Params | test.go:67:13:67:45 | type conversion | provenance | Src:MaD:276 | +| test.go:72:20:72:41 | call to Query | test.go:72:13:72:42 | type conversion | provenance | Src:MaD:277 | +| test.go:77:20:77:32 | call to Refer | test.go:77:13:77:33 | type conversion | provenance | Src:MaD:278 | +| test.go:82:20:82:34 | call to Referer | test.go:82:13:82:35 | type conversion | provenance | Src:MaD:279 | +| test.go:87:20:87:30 | call to URI | test.go:87:13:87:31 | type conversion | provenance | Src:MaD:281 | +| test.go:92:20:92:30 | call to URL | test.go:92:13:92:31 | type conversion | provenance | Src:MaD:282 | +| test.go:97:20:97:36 | call to UserAgent | test.go:97:13:97:37 | type conversion | provenance | Src:MaD:283 | +| test.go:102:14:102:25 | call to Data | test.go:102:14:102:45 | type assertion | provenance | Src:MaD:272 | +| test.go:114:14:114:25 | call to Data | test.go:114:14:114:45 | type assertion | provenance | Src:MaD:272 | +| test.go:126:14:126:25 | call to Data | test.go:126:14:126:45 | type assertion | provenance | Src:MaD:272 | +| test.go:143:23:143:42 | call to Data | test.go:143:23:143:62 | type assertion | provenance | Src:MaD:272 | +| test.go:199:15:199:26 | call to Data | test.go:200:36:200:53 | type assertion | provenance | Src:MaD:272 | +| test.go:199:15:199:26 | call to Data | test.go:201:39:201:56 | type assertion | provenance | Src:MaD:272 | +| test.go:199:15:199:26 | call to Data | test.go:202:28:202:56 | type assertion | provenance | Src:MaD:272 | +| test.go:199:15:199:26 | call to Data | test.go:204:36:204:53 | type assertion | provenance | Src:MaD:272 | +| test.go:199:15:199:26 | call to Data | test.go:205:34:205:51 | type assertion | provenance | Src:MaD:272 | | test.go:200:21:200:54 | call to HTML2str | test.go:200:14:200:55 | type conversion | provenance | | -| test.go:200:36:200:53 | type assertion | test.go:200:21:200:54 | call to HTML2str | provenance | MaD:272 | +| test.go:200:36:200:53 | type assertion | test.go:200:21:200:54 | call to HTML2str | provenance | MaD:288 | | test.go:201:21:201:57 | call to Htmlunquote | test.go:201:14:201:58 | type conversion | provenance | | -| test.go:201:39:201:56 | type assertion | test.go:201:21:201:57 | call to Htmlunquote | provenance | MaD:274 | +| test.go:201:39:201:56 | type assertion | test.go:201:21:201:57 | call to Htmlunquote | provenance | MaD:290 | | test.go:202:2:202:68 | ... := ...[0] | test.go:203:14:203:28 | type assertion | provenance | | -| test.go:202:28:202:56 | type assertion | test.go:202:2:202:68 | ... := ...[0] | provenance | MaD:275 | +| test.go:202:28:202:56 | type assertion | test.go:202:2:202:68 | ... := ...[0] | provenance | MaD:291 | | test.go:204:21:204:54 | call to Str2html | test.go:204:14:204:55 | type conversion | provenance | | -| test.go:204:36:204:53 | type assertion | test.go:204:21:204:54 | call to Str2html | provenance | MaD:277 | +| test.go:204:36:204:53 | type assertion | test.go:204:21:204:54 | call to Str2html | provenance | MaD:293 | | test.go:205:21:205:58 | call to Substr | test.go:205:14:205:59 | type conversion | provenance | | -| test.go:205:34:205:51 | type assertion | test.go:205:21:205:58 | call to Substr | provenance | MaD:278 | +| test.go:205:34:205:51 | type assertion | test.go:205:21:205:58 | call to Substr | provenance | MaD:294 | | test.go:207:6:207:6 | definition of s | test.go:209:14:209:28 | type conversion | provenance | | -| test.go:208:18:208:33 | selection of Form | test.go:207:6:207:6 | definition of s | provenance | MaD:276 | -| test.go:223:2:223:34 | ... := ...[0] | test.go:225:31:225:31 | f | provenance | Src:MaD:280 | -| test.go:223:2:223:34 | ... := ...[1] | test.go:224:14:224:32 | type conversion | provenance | Src:MaD:280 | +| test.go:208:18:208:33 | selection of Form | test.go:207:6:207:6 | definition of s | provenance | MaD:292 | +| test.go:223:2:223:34 | ... := ...[0] | test.go:225:31:225:31 | f | provenance | Src:MaD:296 | +| test.go:223:2:223:34 | ... := ...[1] | test.go:224:14:224:32 | type conversion | provenance | Src:MaD:296 | | test.go:225:2:225:32 | ... := ...[0] | test.go:226:14:226:20 | content | provenance | | | test.go:225:31:225:31 | f | test.go:225:2:225:32 | ... := ...[0] | provenance | MaD:552 | -| test.go:228:2:228:40 | ... := ...[0] | test.go:229:14:229:38 | type conversion | provenance | Src:MaD:281 | -| test.go:231:7:231:28 | call to GetString | test.go:232:14:232:22 | type conversion | provenance | Src:MaD:282 | -| test.go:234:8:234:35 | call to GetStrings | test.go:235:14:235:26 | type conversion | provenance | Src:MaD:283 | -| test.go:237:9:237:17 | call to Input | test.go:238:14:238:27 | type conversion | provenance | Src:MaD:284 | -| test.go:240:6:240:8 | definition of str | test.go:242:14:242:30 | type conversion | provenance | Src:MaD:279 | -| test.go:246:15:246:36 | call to GetString | test.go:249:21:249:29 | untrusted | provenance | Src:MaD:282 | -| test.go:259:23:259:44 | call to GetCookie | test.go:259:16:259:45 | type conversion | provenance | Src:MaD:268 | -| test.go:270:62:270:83 | call to GetCookie | test.go:270:55:270:84 | type conversion | provenance | Src:MaD:268 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:278:21:278:28 | index expression | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:283:44:283:60 | selection of Filename | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:284:38:284:49 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:285:37:285:48 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:291:4:291:15 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:293:42:293:53 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:294:53:294:64 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:295:38:295:49 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:296:49:296:60 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:297:51:297:65 | index expression | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:298:36:298:47 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:299:37:299:48 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:301:39:301:50 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:302:40:302:51 | genericFiles | provenance | Src:MaD:281 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:303:39:303:50 | genericFiles | provenance | Src:MaD:281 | +| test.go:228:2:228:40 | ... := ...[0] | test.go:229:14:229:38 | type conversion | provenance | Src:MaD:297 | +| test.go:231:7:231:28 | call to GetString | test.go:232:14:232:22 | type conversion | provenance | Src:MaD:298 | +| test.go:234:8:234:35 | call to GetStrings | test.go:235:14:235:26 | type conversion | provenance | Src:MaD:299 | +| test.go:237:9:237:17 | call to Input | test.go:238:14:238:27 | type conversion | provenance | Src:MaD:300 | +| test.go:240:6:240:8 | definition of str | test.go:242:14:242:30 | type conversion | provenance | Src:MaD:295 | +| test.go:246:15:246:36 | call to GetString | test.go:249:21:249:29 | untrusted | provenance | Src:MaD:298 | +| test.go:259:23:259:44 | call to GetCookie | test.go:259:16:259:45 | type conversion | provenance | Src:MaD:284 | +| test.go:270:62:270:83 | call to GetCookie | test.go:270:55:270:84 | type conversion | provenance | Src:MaD:284 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:278:21:278:28 | index expression | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:283:44:283:60 | selection of Filename | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:284:38:284:49 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:285:37:285:48 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:291:4:291:15 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:293:42:293:53 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:294:53:294:64 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:295:38:295:49 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:296:49:296:60 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:297:51:297:65 | index expression | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:298:36:298:47 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:299:37:299:48 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:301:39:301:50 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:302:40:302:51 | genericFiles | provenance | Src:MaD:297 | +| test.go:275:2:275:40 | ... := ...[0] | test.go:303:39:303:50 | genericFiles | provenance | Src:MaD:297 | | test.go:276:2:276:13 | definition of genericFiles [array] | test.go:297:51:297:62 | genericFiles [array] | provenance | | | test.go:278:21:278:28 | index expression | test.go:276:2:276:13 | definition of genericFiles [array] | provenance | | | test.go:283:44:283:60 | selection of Filename | test.go:283:21:283:61 | call to GetDisplayString | provenance | FunctionModel | | test.go:284:21:284:53 | call to SliceChunk | test.go:284:21:284:92 | selection of Filename | provenance | | -| test.go:284:38:284:49 | genericFiles | test.go:284:21:284:53 | call to SliceChunk | provenance | MaD:288 | +| test.go:284:38:284:49 | genericFiles | test.go:284:21:284:53 | call to SliceChunk | provenance | MaD:253 | | test.go:285:21:285:60 | call to SliceDiff | test.go:285:21:285:96 | selection of Filename | provenance | | -| test.go:285:37:285:48 | genericFiles | test.go:285:21:285:60 | call to SliceDiff | provenance | MaD:289 | +| test.go:285:37:285:48 | genericFiles | test.go:285:21:285:60 | call to SliceDiff | provenance | MaD:254 | | test.go:290:3:292:44 | call to SliceFilter | test.go:290:3:292:80 | selection of Filename | provenance | | -| test.go:291:4:291:15 | genericFiles | test.go:290:3:292:44 | call to SliceFilter | provenance | MaD:290 | +| test.go:291:4:291:15 | genericFiles | test.go:290:3:292:44 | call to SliceFilter | provenance | MaD:255 | | test.go:293:21:293:65 | call to SliceIntersect | test.go:293:21:293:101 | selection of Filename | provenance | | -| test.go:293:42:293:53 | genericFiles | test.go:293:21:293:65 | call to SliceIntersect | provenance | MaD:291 | +| test.go:293:42:293:53 | genericFiles | test.go:293:21:293:65 | call to SliceIntersect | provenance | MaD:256 | | test.go:294:21:294:65 | call to SliceIntersect | test.go:294:21:294:101 | selection of Filename | provenance | | -| test.go:294:53:294:64 | genericFiles | test.go:294:21:294:65 | call to SliceIntersect | provenance | MaD:291 | +| test.go:294:53:294:64 | genericFiles | test.go:294:21:294:65 | call to SliceIntersect | provenance | MaD:256 | | test.go:295:21:295:61 | call to SliceMerge | test.go:295:21:295:97 | selection of Filename | provenance | | -| test.go:295:38:295:49 | genericFiles | test.go:295:21:295:61 | call to SliceMerge | provenance | MaD:292 | +| test.go:295:38:295:49 | genericFiles | test.go:295:21:295:61 | call to SliceMerge | provenance | MaD:257 | | test.go:296:21:296:61 | call to SliceMerge | test.go:296:21:296:97 | selection of Filename | provenance | | -| test.go:296:49:296:60 | genericFiles | test.go:296:21:296:61 | call to SliceMerge | provenance | MaD:292 | +| test.go:296:49:296:60 | genericFiles | test.go:296:21:296:61 | call to SliceMerge | provenance | MaD:257 | | test.go:297:21:297:66 | call to SlicePad | test.go:297:21:297:102 | selection of Filename | provenance | | | test.go:297:51:297:62 | genericFiles [array] | test.go:297:51:297:65 | index expression | provenance | | -| test.go:297:51:297:65 | index expression | test.go:297:21:297:66 | call to SlicePad | provenance | MaD:293 | +| test.go:297:51:297:65 | index expression | test.go:297:21:297:66 | call to SlicePad | provenance | MaD:258 | | test.go:298:21:298:66 | call to SlicePad | test.go:298:21:298:102 | selection of Filename | provenance | | -| test.go:298:36:298:47 | genericFiles | test.go:298:21:298:66 | call to SlicePad | provenance | MaD:293 | +| test.go:298:36:298:47 | genericFiles | test.go:298:21:298:66 | call to SlicePad | provenance | MaD:258 | | test.go:299:21:299:49 | call to SliceRand | test.go:299:21:299:82 | selection of Filename | provenance | | -| test.go:299:37:299:48 | genericFiles | test.go:299:21:299:49 | call to SliceRand | provenance | MaD:294 | +| test.go:299:37:299:48 | genericFiles | test.go:299:21:299:49 | call to SliceRand | provenance | MaD:259 | | test.go:301:21:301:97 | call to SliceReduce | test.go:301:21:301:133 | selection of Filename | provenance | | -| test.go:301:39:301:50 | genericFiles | test.go:301:21:301:97 | call to SliceReduce | provenance | MaD:295 | +| test.go:301:39:301:50 | genericFiles | test.go:301:21:301:97 | call to SliceReduce | provenance | MaD:260 | | test.go:302:21:302:52 | call to SliceShuffle | test.go:302:21:302:88 | selection of Filename | provenance | | -| test.go:302:40:302:51 | genericFiles | test.go:302:21:302:52 | call to SliceShuffle | provenance | MaD:296 | +| test.go:302:40:302:51 | genericFiles | test.go:302:21:302:52 | call to SliceShuffle | provenance | MaD:261 | | test.go:303:21:303:51 | call to SliceUnique | test.go:303:21:303:87 | selection of Filename | provenance | | -| test.go:303:39:303:50 | genericFiles | test.go:303:21:303:51 | call to SliceUnique | provenance | MaD:297 | +| test.go:303:39:303:50 | genericFiles | test.go:303:21:303:51 | call to SliceUnique | provenance | MaD:262 | | test.go:308:2:308:5 | definition of bMap | test.go:311:21:311:24 | bMap | provenance | | | test.go:308:2:308:5 | definition of bMap | test.go:312:21:312:24 | bMap | provenance | | -| test.go:309:15:309:36 | call to GetString | test.go:310:22:310:30 | untrusted | provenance | Src:MaD:282 | -| test.go:310:22:310:30 | untrusted | test.go:308:2:308:5 | definition of bMap | provenance | MaD:300 | -| test.go:311:21:311:24 | bMap | test.go:311:21:311:39 | call to Get | provenance | MaD:298 | +| test.go:309:15:309:36 | call to GetString | test.go:310:22:310:30 | untrusted | provenance | Src:MaD:298 | +| test.go:310:22:310:30 | untrusted | test.go:308:2:308:5 | definition of bMap | provenance | MaD:265 | +| test.go:311:21:311:24 | bMap | test.go:311:21:311:39 | call to Get | provenance | MaD:263 | | test.go:311:21:311:39 | call to Get | test.go:311:21:311:48 | type assertion | provenance | | -| test.go:312:21:312:24 | bMap | test.go:312:21:312:32 | call to Items | provenance | MaD:299 | +| test.go:312:21:312:24 | bMap | test.go:312:21:312:32 | call to Items | provenance | MaD:264 | | test.go:312:21:312:32 | call to Items | test.go:312:21:312:52 | type assertion | provenance | | nodes | test.go:33:6:33:10 | definition of bound | semmle.label | definition of bound | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Beego/TaintedPath.expected b/go/ql/test/library-tests/semmle/go/frameworks/Beego/TaintedPath.expected index 18d4f8ca300a..001f56be494f 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Beego/TaintedPath.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Beego/TaintedPath.expected @@ -1,12 +1,12 @@ edges -| test.go:215:15:215:26 | call to Data | test.go:216:18:216:26 | untrusted | provenance | Src:MaD:256 | -| test.go:215:15:215:26 | call to Data | test.go:217:10:217:18 | untrusted | provenance | Src:MaD:256 | -| test.go:215:15:215:26 | call to Data | test.go:218:35:218:43 | untrusted | provenance | Src:MaD:256 | -| test.go:324:17:324:37 | selection of RequestBody | test.go:324:40:324:43 | &... | provenance | Src:MaD:264 MaD:187 | +| test.go:215:15:215:26 | call to Data | test.go:216:18:216:26 | untrusted | provenance | Src:MaD:272 | +| test.go:215:15:215:26 | call to Data | test.go:217:10:217:18 | untrusted | provenance | Src:MaD:272 | +| test.go:215:15:215:26 | call to Data | test.go:218:35:218:43 | untrusted | provenance | Src:MaD:272 | +| test.go:324:17:324:37 | selection of RequestBody | test.go:324:40:324:43 | &... | provenance | Src:MaD:280 MaD:187 | | test.go:324:40:324:43 | &... | test.go:326:35:326:43 | untrusted | provenance | | -| test.go:332:15:332:26 | call to Data | test.go:334:23:334:31 | untrusted | provenance | Src:MaD:256 | -| test.go:340:15:340:26 | call to Data | test.go:342:53:342:61 | untrusted | provenance | Src:MaD:256 | -| test.go:340:15:340:26 | call to Data | test.go:344:23:344:31 | untrusted | provenance | Src:MaD:256 | +| test.go:332:15:332:26 | call to Data | test.go:334:23:334:31 | untrusted | provenance | Src:MaD:272 | +| test.go:340:15:340:26 | call to Data | test.go:342:53:342:61 | untrusted | provenance | Src:MaD:272 | +| test.go:340:15:340:26 | call to Data | test.go:344:23:344:31 | untrusted | provenance | Src:MaD:272 | nodes | test.go:215:15:215:26 | call to Data | semmle.label | call to Data | | test.go:216:18:216:26 | untrusted | semmle.label | untrusted | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/SqlInjection.expected b/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/SqlInjection.expected index cf07b5e5f74a..cbdfc45c9124 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/SqlInjection.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/SqlInjection.expected @@ -1,36 +1,36 @@ edges -| test.go:10:15:10:41 | call to UserAgent | test.go:12:11:12:19 | untrusted | provenance | Src:MaD:747 | -| test.go:10:15:10:41 | call to UserAgent | test.go:13:23:13:31 | untrusted | provenance | Src:MaD:747 | -| test.go:10:15:10:41 | call to UserAgent | test.go:14:14:14:22 | untrusted | provenance | Src:MaD:747 | -| test.go:10:15:10:41 | call to UserAgent | test.go:15:26:15:34 | untrusted | provenance | Src:MaD:747 | -| test.go:10:15:10:41 | call to UserAgent | test.go:16:12:16:20 | untrusted | provenance | Src:MaD:747 | -| test.go:10:15:10:41 | call to UserAgent | test.go:17:24:17:32 | untrusted | provenance | Src:MaD:747 | -| test.go:10:15:10:41 | call to UserAgent | test.go:18:15:18:23 | untrusted | provenance | Src:MaD:747 | -| test.go:10:15:10:41 | call to UserAgent | test.go:19:27:19:35 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:26:12:26:20 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:27:10:27:18 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:28:15:28:23 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:29:14:29:22 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:30:15:30:23 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:31:8:31:16 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:32:11:32:19 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:33:9:33:17 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:34:8:34:16 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:35:8:35:16 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:36:13:36:21 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:37:13:37:21 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:38:12:38:20 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:39:12:39:20 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:40:9:40:17 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:41:12:41:20 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:42:16:42:24 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:42:27:42:35 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:43:12:43:20 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:44:14:44:22 | untrusted | provenance | Src:MaD:747 | -| test.go:24:15:24:41 | call to UserAgent | test.go:44:25:44:33 | untrusted | provenance | Src:MaD:747 | -| test.go:48:15:48:41 | call to UserAgent | test.go:49:12:49:20 | untrusted | provenance | Src:MaD:747 | -| test.go:54:15:54:41 | call to UserAgent | test.go:56:31:56:39 | untrusted | provenance | Src:MaD:747 | -| test.go:60:15:60:41 | call to UserAgent | test.go:62:19:62:27 | untrusted | provenance | Src:MaD:747 | +| test.go:10:15:10:41 | call to UserAgent | test.go:12:11:12:19 | untrusted | provenance | Src:MaD:686 | +| test.go:10:15:10:41 | call to UserAgent | test.go:13:23:13:31 | untrusted | provenance | Src:MaD:686 | +| test.go:10:15:10:41 | call to UserAgent | test.go:14:14:14:22 | untrusted | provenance | Src:MaD:686 | +| test.go:10:15:10:41 | call to UserAgent | test.go:15:26:15:34 | untrusted | provenance | Src:MaD:686 | +| test.go:10:15:10:41 | call to UserAgent | test.go:16:12:16:20 | untrusted | provenance | Src:MaD:686 | +| test.go:10:15:10:41 | call to UserAgent | test.go:17:24:17:32 | untrusted | provenance | Src:MaD:686 | +| test.go:10:15:10:41 | call to UserAgent | test.go:18:15:18:23 | untrusted | provenance | Src:MaD:686 | +| test.go:10:15:10:41 | call to UserAgent | test.go:19:27:19:35 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:26:12:26:20 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:27:10:27:18 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:28:15:28:23 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:29:14:29:22 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:30:15:30:23 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:31:8:31:16 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:32:11:32:19 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:33:9:33:17 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:34:8:34:16 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:35:8:35:16 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:36:13:36:21 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:37:13:37:21 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:38:12:38:20 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:39:12:39:20 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:40:9:40:17 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:41:12:41:20 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:42:16:42:24 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:42:27:42:35 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:43:12:43:20 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:44:14:44:22 | untrusted | provenance | Src:MaD:686 | +| test.go:24:15:24:41 | call to UserAgent | test.go:44:25:44:33 | untrusted | provenance | Src:MaD:686 | +| test.go:48:15:48:41 | call to UserAgent | test.go:49:12:49:20 | untrusted | provenance | Src:MaD:686 | +| test.go:54:15:54:41 | call to UserAgent | test.go:56:31:56:39 | untrusted | provenance | Src:MaD:686 | +| test.go:60:15:60:41 | call to UserAgent | test.go:62:19:62:27 | untrusted | provenance | Src:MaD:686 | nodes | test.go:10:15:10:41 | call to UserAgent | semmle.label | call to UserAgent | | test.go:12:11:12:19 | untrusted | semmle.label | untrusted | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Echo/ReflectedXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/Echo/ReflectedXss.expected index ffb416f5824d..897c61f42154 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Echo/ReflectedXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Echo/ReflectedXss.expected @@ -8,28 +8,28 @@ edges | test.go:51:2:51:30 | ... := ...[0] | test.go:52:16:52:37 | index expression | provenance | | | test.go:57:2:57:46 | ... := ...[0] | test.go:58:13:58:22 | fileHeader | provenance | | | test.go:58:2:58:29 | ... := ...[0] | test.go:60:2:60:5 | file | provenance | | -| test.go:58:13:58:22 | fileHeader | test.go:58:2:58:29 | ... := ...[0] | provenance | MaD:700 | +| test.go:58:13:58:22 | fileHeader | test.go:58:2:58:29 | ... := ...[0] | provenance | MaD:639 | | test.go:59:2:59:7 | definition of buffer | test.go:61:20:61:25 | buffer | provenance | | -| test.go:60:2:60:5 | file | test.go:59:2:59:7 | definition of buffer | provenance | MaD:626 | +| test.go:60:2:60:5 | file | test.go:59:2:59:7 | definition of buffer | provenance | MaD:565 | | test.go:66:2:66:31 | ... := ...[0] | test.go:67:16:67:41 | index expression | provenance | | | test.go:72:2:72:31 | ... := ...[0] | test.go:74:13:74:22 | fileHeader | provenance | | | test.go:74:2:74:29 | ... := ...[0] | test.go:76:2:76:5 | file | provenance | | -| test.go:74:13:74:22 | fileHeader | test.go:74:2:74:29 | ... := ...[0] | provenance | MaD:700 | +| test.go:74:13:74:22 | fileHeader | test.go:74:2:74:29 | ... := ...[0] | provenance | MaD:639 | | test.go:75:2:75:7 | definition of buffer | test.go:77:20:77:25 | buffer | provenance | | -| test.go:76:2:76:5 | file | test.go:75:2:75:7 | definition of buffer | provenance | MaD:626 | +| test.go:76:2:76:5 | file | test.go:75:2:75:7 | definition of buffer | provenance | MaD:565 | | test.go:82:2:82:32 | ... := ...[0] | test.go:83:16:83:24 | selection of Value | provenance | | | test.go:88:13:88:25 | call to Cookies | test.go:89:16:89:31 | selection of Value | provenance | | | test.go:99:11:99:15 | &... | test.go:100:16:100:21 | selection of s | provenance | | | test.go:112:17:112:19 | definition of ctx | test.go:114:16:114:18 | ctx | provenance | | -| test.go:113:21:113:42 | call to Param | test.go:112:17:112:19 | definition of ctx | provenance | MaD:431 | -| test.go:114:16:114:18 | ctx | test.go:114:16:114:33 | call to Get | provenance | MaD:430 | +| test.go:113:21:113:42 | call to Param | test.go:112:17:112:19 | definition of ctx | provenance | MaD:370 | +| test.go:114:16:114:18 | ctx | test.go:114:16:114:33 | call to Get | provenance | MaD:369 | | test.go:114:16:114:33 | call to Get | test.go:114:16:114:42 | type assertion | provenance | | | test.go:124:11:124:32 | call to Param | test.go:125:16:125:20 | param | provenance | | | test.go:130:11:130:32 | call to Param | test.go:131:20:131:32 | type conversion | provenance | | | test.go:136:11:136:32 | call to Param | test.go:137:29:137:41 | type conversion | provenance | | | test.go:148:11:148:32 | call to Param | test.go:149:30:149:34 | param | provenance | | | test.go:149:12:149:35 | call to NewReader | test.go:150:31:150:36 | reader | provenance | | -| test.go:149:30:149:34 | param | test.go:149:12:149:35 | call to NewReader | provenance | MaD:909 | +| test.go:149:30:149:34 | param | test.go:149:12:149:35 | call to NewReader | provenance | MaD:848 | | test.go:164:11:164:32 | call to Param | test.go:165:23:165:35 | type conversion | provenance | | nodes | test.go:15:11:15:32 | call to Param | semmle.label | call to Param | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Encoding/jsoniter.expected b/go/ql/test/library-tests/semmle/go/frameworks/Encoding/jsoniter.expected index 36dc9d014faa..d16dc0b9c1f3 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Encoding/jsoniter.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Encoding/jsoniter.expected @@ -4,13 +4,13 @@ edges | jsoniter.go:23:20:23:38 | call to getUntrustedBytes | jsoniter.go:31:21:31:34 | untrustedInput | provenance | | | jsoniter.go:24:21:24:40 | call to getUntrustedString | jsoniter.go:35:27:35:41 | untrustedString | provenance | | | jsoniter.go:24:21:24:40 | call to getUntrustedString | jsoniter.go:39:31:39:45 | untrustedString | provenance | | -| jsoniter.go:27:17:27:30 | untrustedInput | jsoniter.go:27:33:27:37 | &... | provenance | MaD:422 | +| jsoniter.go:27:17:27:30 | untrustedInput | jsoniter.go:27:33:27:37 | &... | provenance | MaD:361 | | jsoniter.go:27:33:27:37 | &... | jsoniter.go:28:15:28:24 | selection of field | provenance | | -| jsoniter.go:31:21:31:34 | untrustedInput | jsoniter.go:31:37:31:42 | &... | provenance | MaD:420 | +| jsoniter.go:31:21:31:34 | untrustedInput | jsoniter.go:31:37:31:42 | &... | provenance | MaD:359 | | jsoniter.go:31:37:31:42 | &... | jsoniter.go:32:15:32:25 | selection of field | provenance | | -| jsoniter.go:35:27:35:41 | untrustedString | jsoniter.go:35:44:35:49 | &... | provenance | MaD:423 | +| jsoniter.go:35:27:35:41 | untrustedString | jsoniter.go:35:44:35:49 | &... | provenance | MaD:362 | | jsoniter.go:35:44:35:49 | &... | jsoniter.go:36:15:36:25 | selection of field | provenance | | -| jsoniter.go:39:31:39:45 | untrustedString | jsoniter.go:39:48:39:53 | &... | provenance | MaD:421 | +| jsoniter.go:39:31:39:45 | untrustedString | jsoniter.go:39:48:39:53 | &... | provenance | MaD:360 | | jsoniter.go:39:48:39:53 | &... | jsoniter.go:40:15:40:25 | selection of field | provenance | | nodes | jsoniter.go:23:20:23:38 | call to getUntrustedBytes | semmle.label | call to getUntrustedBytes | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Revel/ReflectedXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/Revel/ReflectedXss.expected index 1ebdd0f3afb0..d6bffa163255 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Revel/ReflectedXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Revel/ReflectedXss.expected @@ -1,10 +1,10 @@ edges | EndToEnd.go:35:2:35:4 | definition of buf | EndToEnd.go:37:24:37:26 | buf | provenance | | | EndToEnd.go:36:18:36:25 | selection of Params | EndToEnd.go:36:18:36:30 | selection of Form | provenance | | -| EndToEnd.go:36:18:36:30 | selection of Form | EndToEnd.go:36:18:36:47 | call to Get | provenance | MaD:815 | -| EndToEnd.go:36:18:36:47 | call to Get | EndToEnd.go:35:2:35:4 | definition of buf | provenance | MaD:629 | +| EndToEnd.go:36:18:36:30 | selection of Form | EndToEnd.go:36:18:36:47 | call to Get | provenance | MaD:754 | +| EndToEnd.go:36:18:36:47 | call to Get | EndToEnd.go:35:2:35:4 | definition of buf | provenance | MaD:568 | | EndToEnd.go:69:22:69:29 | selection of Params | EndToEnd.go:69:22:69:34 | selection of Form | provenance | | -| EndToEnd.go:69:22:69:34 | selection of Form | EndToEnd.go:69:22:69:51 | call to Get | provenance | MaD:815 | +| EndToEnd.go:69:22:69:34 | selection of Form | EndToEnd.go:69:22:69:51 | call to Get | provenance | MaD:754 | | Revel.go:70:22:70:29 | selection of Params | Revel.go:70:22:70:35 | selection of Query | provenance | | | examples/booking/app/init.go:36:44:36:48 | selection of URL | examples/booking/app/init.go:36:44:36:53 | selection of Path | provenance | | | examples/booking/app/init.go:40:49:40:53 | selection of URL | examples/booking/app/init.go:40:49:40:58 | selection of Path | provenance | | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Revel/TaintedPath.expected b/go/ql/test/library-tests/semmle/go/frameworks/Revel/TaintedPath.expected index 20f6a5bf62a6..20897225a40a 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Revel/TaintedPath.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Revel/TaintedPath.expected @@ -1,8 +1,8 @@ edges | EndToEnd.go:58:18:58:25 | selection of Params | EndToEnd.go:58:18:58:30 | selection of Form | provenance | | -| EndToEnd.go:58:18:58:30 | selection of Form | EndToEnd.go:58:18:58:47 | call to Get | provenance | MaD:815 | +| EndToEnd.go:58:18:58:30 | selection of Form | EndToEnd.go:58:18:58:47 | call to Get | provenance | MaD:754 | | EndToEnd.go:64:26:64:33 | selection of Params | EndToEnd.go:64:26:64:38 | selection of Form | provenance | | -| EndToEnd.go:64:26:64:38 | selection of Form | EndToEnd.go:64:26:64:55 | call to Get | provenance | MaD:815 | +| EndToEnd.go:64:26:64:38 | selection of Form | EndToEnd.go:64:26:64:55 | call to Get | provenance | MaD:754 | nodes | EndToEnd.go:58:18:58:25 | selection of Params | semmle.label | selection of Params | | EndToEnd.go:58:18:58:30 | selection of Form | semmle.label | selection of Form | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/RequestForgery.expected b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/RequestForgery.expected index d8d22b59dac9..b7e85057f325 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/RequestForgery.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/RequestForgery.expected @@ -6,9 +6,9 @@ edges | rpc/notes/service.twirp.go:493:2:493:2 | capture variable reqContent | rpc/notes/service.twirp.go:495:35:495:44 | reqContent | provenance | | | rpc/notes/service.twirp.go:495:35:495:44 | reqContent | server/main.go:19:56:19:61 | definition of params | provenance | | | rpc/notes/service.twirp.go:538:2:538:33 | ... := ...[0] | rpc/notes/service.twirp.go:544:27:544:29 | buf | provenance | | -| rpc/notes/service.twirp.go:538:25:538:32 | selection of Body | rpc/notes/service.twirp.go:538:2:538:33 | ... := ...[0] | provenance | MaD:620 | +| rpc/notes/service.twirp.go:538:25:538:32 | selection of Body | rpc/notes/service.twirp.go:538:2:538:33 | ... := ...[0] | provenance | MaD:559 | | rpc/notes/service.twirp.go:543:2:543:11 | definition of reqContent | rpc/notes/service.twirp.go:574:2:574:2 | capture variable reqContent | provenance | | -| rpc/notes/service.twirp.go:544:27:544:29 | buf | rpc/notes/service.twirp.go:543:2:543:11 | definition of reqContent | provenance | MaD:505 | +| rpc/notes/service.twirp.go:544:27:544:29 | buf | rpc/notes/service.twirp.go:543:2:543:11 | definition of reqContent | provenance | MaD:444 | | rpc/notes/service.twirp.go:554:6:554:13 | definition of typedReq | rpc/notes/service.twirp.go:558:44:558:51 | typedReq | provenance | | | rpc/notes/service.twirp.go:558:44:558:51 | typedReq | server/main.go:19:56:19:61 | definition of params | provenance | | | rpc/notes/service.twirp.go:574:2:574:2 | capture variable reqContent | rpc/notes/service.twirp.go:576:35:576:44 | reqContent | provenance | | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/ReflectedXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/ReflectedXss.expected index 165d6f040cd5..f4df600321f3 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/ReflectedXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/ReflectedXss.expected @@ -1,40 +1,40 @@ edges -| test.go:12:12:12:22 | selection of URL | test.go:12:12:12:30 | call to Query | provenance | MaD:808 | -| test.go:12:12:12:30 | call to Query | test.go:12:12:12:44 | call to Get | provenance | MaD:815 | +| test.go:12:12:12:22 | selection of URL | test.go:12:12:12:30 | call to Query | provenance | MaD:747 | +| test.go:12:12:12:30 | call to Query | test.go:12:12:12:44 | call to Get | provenance | MaD:754 | | test.go:12:12:12:44 | call to Get | test.go:15:42:15:47 | param1 | provenance | | | test.go:15:22:15:48 | call to UnescapeString | test.go:15:15:15:49 | type conversion | provenance | | -| test.go:15:42:15:47 | param1 | test.go:15:22:15:48 | call to UnescapeString | provenance | MaD:487 | +| test.go:15:42:15:47 | param1 | test.go:15:22:15:48 | call to UnescapeString | provenance | MaD:426 | | test.go:17:2:17:36 | ... := ...[0] | test.go:18:15:18:31 | type conversion | provenance | | | test.go:17:2:17:36 | ... := ...[0] | test.go:29:22:29:25 | node | provenance | | -| test.go:17:24:17:35 | selection of Body | test.go:17:2:17:36 | ... := ...[0] | provenance | MaD:482 | +| test.go:17:24:17:35 | selection of Body | test.go:17:2:17:36 | ... := ...[0] | provenance | MaD:421 | | test.go:20:2:20:48 | ... := ...[0] | test.go:21:15:21:32 | type conversion | provenance | | -| test.go:20:36:20:47 | selection of Body | test.go:20:2:20:48 | ... := ...[0] | provenance | MaD:485 | +| test.go:20:36:20:47 | selection of Body | test.go:20:2:20:48 | ... := ...[0] | provenance | MaD:424 | | test.go:23:2:23:50 | ... := ...[0] | test.go:24:15:24:35 | type conversion | provenance | | -| test.go:23:33:23:44 | selection of Body | test.go:23:2:23:50 | ... := ...[0] | provenance | MaD:483 | +| test.go:23:33:23:44 | selection of Body | test.go:23:2:23:50 | ... := ...[0] | provenance | MaD:422 | | test.go:26:2:26:62 | ... := ...[0] | test.go:27:15:27:36 | type conversion | provenance | | -| test.go:26:45:26:56 | selection of Body | test.go:26:2:26:62 | ... := ...[0] | provenance | MaD:484 | +| test.go:26:45:26:56 | selection of Body | test.go:26:2:26:62 | ... := ...[0] | provenance | MaD:423 | | test.go:31:15:31:45 | call to NewTokenizer | test.go:32:15:32:23 | tokenizer | provenance | | | test.go:31:15:31:45 | call to NewTokenizer | test.go:33:15:33:23 | tokenizer | provenance | | | test.go:31:15:31:45 | call to NewTokenizer | test.go:34:17:34:25 | tokenizer | provenance | | | test.go:31:15:31:45 | call to NewTokenizer | test.go:36:15:36:23 | tokenizer | provenance | | | test.go:31:15:31:45 | call to NewTokenizer | test.go:37:22:37:30 | tokenizer | provenance | | -| test.go:31:33:31:44 | selection of Body | test.go:31:15:31:45 | call to NewTokenizer | provenance | MaD:480 | -| test.go:32:15:32:23 | tokenizer | test.go:32:15:32:34 | call to Buffered | provenance | MaD:490 | -| test.go:33:15:33:23 | tokenizer | test.go:33:15:33:29 | call to Raw | provenance | MaD:491 | +| test.go:31:33:31:44 | selection of Body | test.go:31:15:31:45 | call to NewTokenizer | provenance | MaD:419 | +| test.go:32:15:32:23 | tokenizer | test.go:32:15:32:34 | call to Buffered | provenance | MaD:429 | +| test.go:33:15:33:23 | tokenizer | test.go:33:15:33:29 | call to Raw | provenance | MaD:430 | | test.go:34:2:34:35 | ... := ...[1] | test.go:35:15:35:19 | value | provenance | | -| test.go:34:17:34:25 | tokenizer | test.go:34:2:34:35 | ... := ...[1] | provenance | MaD:492 | -| test.go:36:15:36:23 | tokenizer | test.go:36:15:36:30 | call to Text | provenance | MaD:493 | -| test.go:37:22:37:30 | tokenizer | test.go:37:22:37:38 | call to Token | provenance | MaD:494 | +| test.go:34:17:34:25 | tokenizer | test.go:34:2:34:35 | ... := ...[1] | provenance | MaD:431 | +| test.go:36:15:36:23 | tokenizer | test.go:36:15:36:30 | call to Text | provenance | MaD:432 | +| test.go:37:22:37:30 | tokenizer | test.go:37:22:37:38 | call to Token | provenance | MaD:433 | | test.go:37:22:37:38 | call to Token | test.go:37:15:37:44 | type conversion | provenance | | | test.go:39:23:39:77 | call to NewTokenizerFragment | test.go:40:15:40:31 | tokenizerFragment | provenance | | -| test.go:39:49:39:60 | selection of Body | test.go:39:23:39:77 | call to NewTokenizerFragment | provenance | MaD:481 | -| test.go:40:15:40:31 | tokenizerFragment | test.go:40:15:40:42 | call to Buffered | provenance | MaD:490 | +| test.go:39:49:39:60 | selection of Body | test.go:39:23:39:77 | call to NewTokenizerFragment | provenance | MaD:420 | +| test.go:40:15:40:31 | tokenizerFragment | test.go:40:15:40:42 | call to Buffered | provenance | MaD:429 | | test.go:42:6:42:14 | definition of cleanNode | test.go:45:22:45:31 | &... | provenance | | | test.go:42:6:42:14 | definition of cleanNode | test.go:45:22:45:31 | &... | provenance | | | test.go:42:6:42:14 | definition of cleanNode | test.go:45:23:45:31 | cleanNode | provenance | | | test.go:43:2:43:43 | ... := ...[0] | test.go:44:24:44:34 | taintedNode | provenance | | -| test.go:43:31:43:42 | selection of Body | test.go:43:2:43:43 | ... := ...[0] | provenance | MaD:482 | -| test.go:44:24:44:34 | taintedNode | test.go:42:6:42:14 | definition of cleanNode | provenance | MaD:488 | +| test.go:43:31:43:42 | selection of Body | test.go:43:2:43:43 | ... := ...[0] | provenance | MaD:421 | +| test.go:44:24:44:34 | taintedNode | test.go:42:6:42:14 | definition of cleanNode | provenance | MaD:427 | | test.go:45:22:45:31 | &... | test.go:45:22:45:31 | &... | provenance | | | test.go:45:22:45:31 | &... | test.go:45:22:45:31 | &... | provenance | | | test.go:45:22:45:31 | &... | test.go:45:23:45:31 | cleanNode | provenance | | @@ -46,8 +46,8 @@ edges | test.go:47:6:47:15 | definition of cleanNode2 | test.go:50:22:50:32 | &... | provenance | | | test.go:47:6:47:15 | definition of cleanNode2 | test.go:50:23:50:32 | cleanNode2 | provenance | | | test.go:48:2:48:44 | ... := ...[0] | test.go:49:26:49:37 | taintedNode2 | provenance | | -| test.go:48:32:48:43 | selection of Body | test.go:48:2:48:44 | ... := ...[0] | provenance | MaD:482 | -| test.go:49:26:49:37 | taintedNode2 | test.go:47:6:47:15 | definition of cleanNode2 | provenance | MaD:489 | +| test.go:48:32:48:43 | selection of Body | test.go:48:2:48:44 | ... := ...[0] | provenance | MaD:421 | +| test.go:49:26:49:37 | taintedNode2 | test.go:47:6:47:15 | definition of cleanNode2 | provenance | MaD:428 | | test.go:50:22:50:32 | &... | test.go:50:22:50:32 | &... | provenance | | | test.go:50:22:50:32 | &... | test.go:50:22:50:32 | &... | provenance | | | test.go:50:22:50:32 | &... | test.go:50:23:50:32 | cleanNode2 | provenance | | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/SqlInjection.expected b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/SqlInjection.expected index 76d7f0dd9317..f11a0a8b7f64 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/SqlInjection.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/SqlInjection.expected @@ -1,6 +1,6 @@ edges -| test.go:56:2:56:42 | ... := ...[0] | test.go:57:29:57:40 | selection of Value | provenance | Src:MaD:740 | -| test.go:57:29:57:40 | selection of Value | test.go:57:11:57:41 | call to EscapeString | provenance | MaD:479 | +| test.go:56:2:56:42 | ... := ...[0] | test.go:57:29:57:40 | selection of Value | provenance | Src:MaD:679 | +| test.go:57:29:57:40 | selection of Value | test.go:57:11:57:41 | call to EscapeString | provenance | MaD:418 | nodes | test.go:56:2:56:42 | ... := ...[0] | semmle.label | ... := ...[0] | | test.go:57:11:57:41 | call to EscapeString | semmle.label | call to EscapeString | diff --git a/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected b/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected index 4112a9094927..ce874f03fab5 100644 --- a/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected +++ b/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected @@ -7,9 +7,9 @@ edges | UnsafeUnzipSymlinkGood.go:76:70:76:80 | selection of Name | UnsafeUnzipSymlinkGood.go:52:24:52:32 | definition of candidate | provenance | | | ZipSlip.go:11:2:15:2 | range statement[1] | ZipSlip.go:12:24:12:29 | selection of Name | provenance | | | ZipSlip.go:12:3:12:30 | ... := ...[0] | ZipSlip.go:14:20:14:20 | p | provenance | | -| ZipSlip.go:12:24:12:29 | selection of Name | ZipSlip.go:12:3:12:30 | ... := ...[0] | provenance | MaD:820 | +| ZipSlip.go:12:24:12:29 | selection of Name | ZipSlip.go:12:3:12:30 | ... := ...[0] | provenance | MaD:759 | | tarslip.go:15:2:15:30 | ... := ...[0] | tarslip.go:16:23:16:33 | selection of Name | provenance | | -| tarslip.go:16:23:16:33 | selection of Name | tarslip.go:16:14:16:34 | call to Dir | provenance | MaD:835 | +| tarslip.go:16:23:16:33 | selection of Name | tarslip.go:16:14:16:34 | call to Dir | provenance | MaD:774 | | tst.go:23:2:43:2 | range statement[1] | tst.go:29:20:29:23 | path | provenance | | nodes | UnsafeUnzipSymlinkGood.go:52:24:52:32 | definition of candidate | semmle.label | definition of candidate | diff --git a/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected b/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected index 6d399f758a3e..5a19b2063f5c 100644 --- a/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected +++ b/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected @@ -1,27 +1,27 @@ edges -| ArgumentInjection.go:9:10:9:16 | selection of URL | ArgumentInjection.go:9:10:9:24 | call to Query | provenance | MaD:808 | +| ArgumentInjection.go:9:10:9:16 | selection of URL | ArgumentInjection.go:9:10:9:24 | call to Query | provenance | MaD:747 | | ArgumentInjection.go:9:10:9:24 | call to Query | ArgumentInjection.go:10:31:10:34 | path | provenance | | -| CommandInjection2.go:13:15:13:21 | selection of URL | CommandInjection2.go:13:15:13:29 | call to Query | provenance | MaD:808 | +| CommandInjection2.go:13:15:13:21 | selection of URL | CommandInjection2.go:13:15:13:29 | call to Query | provenance | MaD:747 | | CommandInjection2.go:13:15:13:29 | call to Query | CommandInjection2.go:15:67:15:75 | imageName | provenance | | | CommandInjection2.go:15:34:15:88 | []type{args} [array] | CommandInjection2.go:15:34:15:88 | call to Sprintf | provenance | MaD:248 | | CommandInjection2.go:15:67:15:75 | imageName | CommandInjection2.go:15:34:15:88 | []type{args} [array] | provenance | | | CommandInjection2.go:15:67:15:75 | imageName | CommandInjection2.go:15:34:15:88 | call to Sprintf | provenance | FunctionModel | -| CommandInjection2.go:41:15:41:21 | selection of URL | CommandInjection2.go:41:15:41:29 | call to Query | provenance | MaD:808 | +| CommandInjection2.go:41:15:41:21 | selection of URL | CommandInjection2.go:41:15:41:29 | call to Query | provenance | MaD:747 | | CommandInjection2.go:41:15:41:29 | call to Query | CommandInjection2.go:44:67:44:75 | imageName | provenance | | | CommandInjection2.go:44:34:44:88 | []type{args} [array] | CommandInjection2.go:44:34:44:88 | call to Sprintf | provenance | MaD:248 | | CommandInjection2.go:44:67:44:75 | imageName | CommandInjection2.go:44:34:44:88 | []type{args} [array] | provenance | | | CommandInjection2.go:44:67:44:75 | imageName | CommandInjection2.go:44:34:44:88 | call to Sprintf | provenance | FunctionModel | -| CommandInjection.go:9:13:9:19 | selection of URL | CommandInjection.go:9:13:9:27 | call to Query | provenance | MaD:808 | +| CommandInjection.go:9:13:9:19 | selection of URL | CommandInjection.go:9:13:9:27 | call to Query | provenance | MaD:747 | | CommandInjection.go:9:13:9:27 | call to Query | CommandInjection.go:10:22:10:28 | cmdName | provenance | | -| GitSubcommands.go:11:13:11:19 | selection of URL | GitSubcommands.go:11:13:11:27 | call to Query | provenance | MaD:808 | +| GitSubcommands.go:11:13:11:19 | selection of URL | GitSubcommands.go:11:13:11:27 | call to Query | provenance | MaD:747 | | GitSubcommands.go:11:13:11:27 | call to Query | GitSubcommands.go:13:31:13:37 | tainted | provenance | | | GitSubcommands.go:11:13:11:27 | call to Query | GitSubcommands.go:14:31:14:37 | tainted | provenance | | | GitSubcommands.go:11:13:11:27 | call to Query | GitSubcommands.go:15:30:15:36 | tainted | provenance | | | GitSubcommands.go:11:13:11:27 | call to Query | GitSubcommands.go:16:35:16:41 | tainted | provenance | | | GitSubcommands.go:11:13:11:27 | call to Query | GitSubcommands.go:17:36:17:42 | tainted | provenance | | -| GitSubcommands.go:33:13:33:19 | selection of URL | GitSubcommands.go:33:13:33:27 | call to Query | provenance | MaD:808 | +| GitSubcommands.go:33:13:33:19 | selection of URL | GitSubcommands.go:33:13:33:27 | call to Query | provenance | MaD:747 | | GitSubcommands.go:33:13:33:27 | call to Query | GitSubcommands.go:38:32:38:38 | tainted | provenance | | -| SanitizingDoubleDash.go:9:13:9:19 | selection of URL | SanitizingDoubleDash.go:9:13:9:27 | call to Query | provenance | MaD:808 | +| SanitizingDoubleDash.go:9:13:9:19 | selection of URL | SanitizingDoubleDash.go:9:13:9:27 | call to Query | provenance | MaD:747 | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:13:25:13:31 | tainted | provenance | | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:14:23:14:33 | slice expression | provenance | | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:39:31:39:37 | tainted | provenance | | @@ -56,7 +56,7 @@ edges | SanitizingDoubleDash.go:69:21:69:28 | arrayLit | SanitizingDoubleDash.go:69:14:69:35 | call to append | provenance | MaD:28 | | SanitizingDoubleDash.go:69:21:69:28 | arrayLit [array] | SanitizingDoubleDash.go:69:14:69:35 | call to append | provenance | MaD:29 | | SanitizingDoubleDash.go:69:21:69:28 | arrayLit [array] | SanitizingDoubleDash.go:69:14:69:35 | call to append [array] | provenance | MaD:29 | -| SanitizingDoubleDash.go:92:13:92:19 | selection of URL | SanitizingDoubleDash.go:92:13:92:27 | call to Query | provenance | MaD:808 | +| SanitizingDoubleDash.go:92:13:92:19 | selection of URL | SanitizingDoubleDash.go:92:13:92:27 | call to Query | provenance | MaD:747 | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:95:25:95:31 | tainted | provenance | | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:96:24:96:34 | slice expression | provenance | | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:100:31:100:37 | tainted | provenance | | diff --git a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected index 13a97e6e7735..690d37f30b51 100644 --- a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected +++ b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected @@ -1,18 +1,18 @@ edges -| ReflectedXss.go:11:15:11:20 | selection of Form | ReflectedXss.go:11:15:11:36 | call to Get | provenance | MaD:815 | +| ReflectedXss.go:11:15:11:20 | selection of Form | ReflectedXss.go:11:15:11:36 | call to Get | provenance | MaD:754 | | ReflectedXss.go:11:15:11:36 | call to Get | ReflectedXss.go:14:44:14:51 | username | provenance | | -| contenttype.go:11:11:11:16 | selection of Form | contenttype.go:11:11:11:28 | call to Get | provenance | MaD:815 | +| contenttype.go:11:11:11:16 | selection of Form | contenttype.go:11:11:11:28 | call to Get | provenance | MaD:754 | | contenttype.go:11:11:11:28 | call to Get | contenttype.go:17:11:17:22 | type conversion | provenance | | -| contenttype.go:49:11:49:16 | selection of Form | contenttype.go:49:11:49:28 | call to Get | provenance | MaD:815 | +| contenttype.go:49:11:49:16 | selection of Form | contenttype.go:49:11:49:28 | call to Get | provenance | MaD:754 | | contenttype.go:49:11:49:28 | call to Get | contenttype.go:53:34:53:37 | data | provenance | | -| contenttype.go:63:10:63:28 | call to FormValue | contenttype.go:64:52:64:55 | data | provenance | Src:MaD:743 | -| contenttype.go:73:10:73:28 | call to FormValue | contenttype.go:79:11:79:14 | data | provenance | Src:MaD:743 | -| contenttype.go:88:10:88:28 | call to FormValue | contenttype.go:91:4:91:7 | data | provenance | Src:MaD:743 | -| contenttype.go:113:10:113:28 | call to FormValue | contenttype.go:114:50:114:53 | data | provenance | Src:MaD:743 | -| reflectedxsstest.go:31:2:31:44 | ... := ...[0] | reflectedxsstest.go:32:34:32:37 | file | provenance | Src:MaD:742 | -| reflectedxsstest.go:31:2:31:44 | ... := ...[1] | reflectedxsstest.go:34:46:34:60 | selection of Filename | provenance | Src:MaD:742 | +| contenttype.go:63:10:63:28 | call to FormValue | contenttype.go:64:52:64:55 | data | provenance | Src:MaD:682 | +| contenttype.go:73:10:73:28 | call to FormValue | contenttype.go:79:11:79:14 | data | provenance | Src:MaD:682 | +| contenttype.go:88:10:88:28 | call to FormValue | contenttype.go:91:4:91:7 | data | provenance | Src:MaD:682 | +| contenttype.go:113:10:113:28 | call to FormValue | contenttype.go:114:50:114:53 | data | provenance | Src:MaD:682 | +| reflectedxsstest.go:31:2:31:44 | ... := ...[0] | reflectedxsstest.go:32:34:32:37 | file | provenance | Src:MaD:681 | +| reflectedxsstest.go:31:2:31:44 | ... := ...[1] | reflectedxsstest.go:34:46:34:60 | selection of Filename | provenance | Src:MaD:681 | | reflectedxsstest.go:32:2:32:38 | ... := ...[0] | reflectedxsstest.go:33:49:33:55 | content | provenance | | -| reflectedxsstest.go:32:34:32:37 | file | reflectedxsstest.go:32:2:32:38 | ... := ...[0] | provenance | MaD:613 | +| reflectedxsstest.go:32:34:32:37 | file | reflectedxsstest.go:32:2:32:38 | ... := ...[0] | provenance | MaD:552 | | reflectedxsstest.go:33:17:33:56 | []type{args} [array] | reflectedxsstest.go:33:17:33:56 | call to Sprintf | provenance | MaD:248 | | reflectedxsstest.go:33:17:33:56 | call to Sprintf | reflectedxsstest.go:33:10:33:57 | type conversion | provenance | | | reflectedxsstest.go:33:49:33:55 | content | reflectedxsstest.go:33:17:33:56 | []type{args} [array] | provenance | | @@ -21,25 +21,25 @@ edges | reflectedxsstest.go:34:17:34:61 | call to Sprintf | reflectedxsstest.go:34:10:34:62 | type conversion | provenance | | | reflectedxsstest.go:34:46:34:60 | selection of Filename | reflectedxsstest.go:34:17:34:61 | []type{args} [array] | provenance | | | reflectedxsstest.go:34:46:34:60 | selection of Filename | reflectedxsstest.go:34:17:34:61 | call to Sprintf | provenance | FunctionModel | -| reflectedxsstest.go:38:2:38:35 | ... := ...[0] | reflectedxsstest.go:39:16:39:21 | reader | provenance | Src:MaD:744 | +| reflectedxsstest.go:38:2:38:35 | ... := ...[0] | reflectedxsstest.go:39:16:39:21 | reader | provenance | Src:MaD:683 | | reflectedxsstest.go:39:2:39:32 | ... := ...[0] | reflectedxsstest.go:40:14:40:17 | part | provenance | | | reflectedxsstest.go:39:2:39:32 | ... := ...[0] | reflectedxsstest.go:42:2:42:5 | part | provenance | | -| reflectedxsstest.go:39:16:39:21 | reader | reflectedxsstest.go:39:2:39:32 | ... := ...[0] | provenance | MaD:703 | -| reflectedxsstest.go:40:14:40:17 | part | reflectedxsstest.go:40:14:40:28 | call to FileName | provenance | MaD:701 | +| reflectedxsstest.go:39:16:39:21 | reader | reflectedxsstest.go:39:2:39:32 | ... := ...[0] | provenance | MaD:642 | +| reflectedxsstest.go:40:14:40:17 | part | reflectedxsstest.go:40:14:40:28 | call to FileName | provenance | MaD:640 | | reflectedxsstest.go:40:14:40:28 | call to FileName | reflectedxsstest.go:44:46:44:53 | partName | provenance | | | reflectedxsstest.go:41:2:41:10 | definition of byteSlice | reflectedxsstest.go:45:10:45:18 | byteSlice | provenance | | -| reflectedxsstest.go:42:2:42:5 | part | reflectedxsstest.go:41:2:41:10 | definition of byteSlice | provenance | MaD:626 | +| reflectedxsstest.go:42:2:42:5 | part | reflectedxsstest.go:41:2:41:10 | definition of byteSlice | provenance | MaD:565 | | reflectedxsstest.go:44:17:44:54 | []type{args} [array] | reflectedxsstest.go:44:17:44:54 | call to Sprintf | provenance | MaD:248 | | reflectedxsstest.go:44:17:44:54 | call to Sprintf | reflectedxsstest.go:44:10:44:55 | type conversion | provenance | | | reflectedxsstest.go:44:46:44:53 | partName | reflectedxsstest.go:44:17:44:54 | []type{args} [array] | provenance | | | reflectedxsstest.go:44:46:44:53 | partName | reflectedxsstest.go:44:17:44:54 | call to Sprintf | provenance | FunctionModel | -| reflectedxsstest.go:51:14:51:18 | selection of URL | reflectedxsstest.go:51:14:51:26 | call to Query | provenance | MaD:808 | +| reflectedxsstest.go:51:14:51:18 | selection of URL | reflectedxsstest.go:51:14:51:26 | call to Query | provenance | MaD:747 | | reflectedxsstest.go:51:14:51:26 | call to Query | reflectedxsstest.go:54:11:54:21 | type conversion | provenance | | -| tst.go:14:15:14:20 | selection of Form | tst.go:14:15:14:36 | call to Get | provenance | MaD:815 | +| tst.go:14:15:14:20 | selection of Form | tst.go:14:15:14:36 | call to Get | provenance | MaD:754 | | tst.go:14:15:14:36 | call to Get | tst.go:18:32:18:32 | a | provenance | | | tst.go:18:19:18:38 | call to Join | tst.go:18:12:18:39 | type conversion | provenance | | -| tst.go:18:32:18:32 | a | tst.go:18:19:18:38 | call to Join | provenance | MaD:907 | -| tst.go:48:14:48:19 | selection of Form | tst.go:48:14:48:34 | call to Get | provenance | MaD:815 | +| tst.go:18:32:18:32 | a | tst.go:18:19:18:38 | call to Join | provenance | MaD:846 | +| tst.go:48:14:48:19 | selection of Form | tst.go:48:14:48:34 | call to Get | provenance | MaD:754 | | tst.go:48:14:48:34 | call to Get | tst.go:53:12:53:26 | type conversion | provenance | | | websocketXss.go:30:7:30:10 | definition of xnet | websocketXss.go:32:24:32:27 | xnet | provenance | | | websocketXss.go:34:3:34:7 | definition of xnet2 | websocketXss.go:36:24:36:28 | xnet2 | provenance | | diff --git a/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected b/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected index 3e81377e6a45..3fca7405f8d1 100644 --- a/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected +++ b/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected @@ -1,12 +1,12 @@ edges | SqlInjection.go:10:7:11:30 | []type{args} [array] | SqlInjection.go:10:7:11:30 | call to Sprintf | provenance | MaD:248 | | SqlInjection.go:10:7:11:30 | call to Sprintf | SqlInjection.go:12:11:12:11 | q | provenance | | -| SqlInjection.go:11:3:11:9 | selection of URL | SqlInjection.go:11:3:11:17 | call to Query | provenance | MaD:808 | +| SqlInjection.go:11:3:11:9 | selection of URL | SqlInjection.go:11:3:11:17 | call to Query | provenance | MaD:747 | | SqlInjection.go:11:3:11:17 | call to Query | SqlInjection.go:11:3:11:29 | index expression | provenance | | | SqlInjection.go:11:3:11:29 | index expression | SqlInjection.go:10:7:11:30 | []type{args} [array] | provenance | | | SqlInjection.go:11:3:11:29 | index expression | SqlInjection.go:10:7:11:30 | call to Sprintf | provenance | FunctionModel | | issue48.go:17:2:17:33 | ... := ...[0] | issue48.go:18:17:18:17 | b | provenance | | -| issue48.go:17:25:17:32 | selection of Body | issue48.go:17:2:17:33 | ... := ...[0] | provenance | MaD:613 | +| issue48.go:17:25:17:32 | selection of Body | issue48.go:17:2:17:33 | ... := ...[0] | provenance | MaD:552 | | issue48.go:18:17:18:17 | b | issue48.go:18:20:18:39 | &... | provenance | MaD:187 | | issue48.go:18:20:18:39 | &... | issue48.go:21:3:21:33 | index expression | provenance | | | issue48.go:20:8:21:34 | []type{args} [array] | issue48.go:20:8:21:34 | call to Sprintf | provenance | MaD:248 | @@ -14,7 +14,7 @@ edges | issue48.go:21:3:21:33 | index expression | issue48.go:20:8:21:34 | []type{args} [array] | provenance | | | issue48.go:21:3:21:33 | index expression | issue48.go:20:8:21:34 | call to Sprintf | provenance | FunctionModel | | issue48.go:27:2:27:34 | ... := ...[0] | issue48.go:28:17:28:18 | b2 | provenance | | -| issue48.go:27:26:27:33 | selection of Body | issue48.go:27:2:27:34 | ... := ...[0] | provenance | MaD:613 | +| issue48.go:27:26:27:33 | selection of Body | issue48.go:27:2:27:34 | ... := ...[0] | provenance | MaD:552 | | issue48.go:28:17:28:18 | b2 | issue48.go:28:21:28:41 | &... | provenance | MaD:187 | | issue48.go:28:21:28:41 | &... | issue48.go:31:3:31:31 | selection of Category | provenance | | | issue48.go:30:8:31:32 | []type{args} [array] | issue48.go:30:8:31:32 | call to Sprintf | provenance | MaD:248 | @@ -22,7 +22,7 @@ edges | issue48.go:31:3:31:31 | selection of Category | issue48.go:30:8:31:32 | []type{args} [array] | provenance | | | issue48.go:31:3:31:31 | selection of Category | issue48.go:30:8:31:32 | call to Sprintf | provenance | FunctionModel | | issue48.go:37:17:37:50 | type conversion | issue48.go:37:53:37:73 | &... | provenance | MaD:187 | -| issue48.go:37:24:37:30 | selection of URL | issue48.go:37:24:37:38 | call to Query | provenance | MaD:808 | +| issue48.go:37:24:37:30 | selection of URL | issue48.go:37:24:37:38 | call to Query | provenance | MaD:747 | | issue48.go:37:24:37:38 | call to Query | issue48.go:37:17:37:50 | type conversion | provenance | | | issue48.go:37:53:37:73 | &... | issue48.go:40:3:40:31 | selection of Category | provenance | | | issue48.go:39:8:40:32 | []type{args} [array] | issue48.go:39:8:40:32 | call to Sprintf | provenance | MaD:248 | @@ -31,17 +31,17 @@ edges | issue48.go:40:3:40:31 | selection of Category | issue48.go:39:8:40:32 | call to Sprintf | provenance | FunctionModel | | main.go:11:11:11:16 | selection of Form | main.go:11:11:11:28 | index expression | provenance | | | main.go:15:11:15:84 | []type{args} [array] | main.go:15:11:15:84 | call to Sprintf | provenance | MaD:248 | -| main.go:15:63:15:67 | selection of URL | main.go:15:63:15:75 | call to Query | provenance | MaD:808 | +| main.go:15:63:15:67 | selection of URL | main.go:15:63:15:75 | call to Query | provenance | MaD:747 | | main.go:15:63:15:75 | call to Query | main.go:15:63:15:83 | index expression | provenance | | | main.go:15:63:15:83 | index expression | main.go:15:11:15:84 | []type{args} [array] | provenance | | | main.go:15:63:15:83 | index expression | main.go:15:11:15:84 | call to Sprintf | provenance | FunctionModel | | main.go:16:11:16:85 | []type{args} [array] | main.go:16:11:16:85 | call to Sprintf | provenance | MaD:248 | -| main.go:16:63:16:70 | selection of Header | main.go:16:63:16:84 | call to Get | provenance | MaD:728 | +| main.go:16:63:16:70 | selection of Header | main.go:16:63:16:84 | call to Get | provenance | MaD:667 | | main.go:16:63:16:84 | call to Get | main.go:16:11:16:85 | []type{args} [array] | provenance | | | main.go:16:63:16:84 | call to Get | main.go:16:11:16:85 | call to Sprintf | provenance | FunctionModel | | main.go:28:17:31:2 | &... [pointer, Category] | main.go:34:3:34:13 | RequestData [pointer, Category] | provenance | | | main.go:28:18:31:2 | struct literal [Category] | main.go:28:17:31:2 | &... [pointer, Category] | provenance | | -| main.go:30:13:30:19 | selection of URL | main.go:30:13:30:27 | call to Query | provenance | MaD:808 | +| main.go:30:13:30:19 | selection of URL | main.go:30:13:30:27 | call to Query | provenance | MaD:747 | | main.go:30:13:30:27 | call to Query | main.go:30:13:30:39 | index expression | provenance | | | main.go:30:13:30:39 | index expression | main.go:28:18:31:2 | struct literal [Category] | provenance | | | main.go:33:7:34:23 | []type{args} [array] | main.go:33:7:34:23 | call to Sprintf | provenance | MaD:248 | @@ -54,7 +54,7 @@ edges | main.go:39:2:39:12 | definition of RequestData [pointer, Category] | main.go:43:3:43:13 | RequestData [pointer, Category] | provenance | | | main.go:40:2:40:12 | RequestData [pointer, Category] | main.go:40:2:40:12 | implicit dereference [Category] | provenance | | | main.go:40:2:40:12 | implicit dereference [Category] | main.go:39:2:39:12 | definition of RequestData [pointer, Category] | provenance | | -| main.go:40:25:40:31 | selection of URL | main.go:40:25:40:39 | call to Query | provenance | MaD:808 | +| main.go:40:25:40:31 | selection of URL | main.go:40:25:40:39 | call to Query | provenance | MaD:747 | | main.go:40:25:40:39 | call to Query | main.go:40:25:40:51 | index expression | provenance | | | main.go:40:25:40:51 | index expression | main.go:40:2:40:12 | implicit dereference [Category] | provenance | | | main.go:42:7:43:23 | []type{args} [array] | main.go:42:7:43:23 | call to Sprintf | provenance | MaD:248 | @@ -67,7 +67,7 @@ edges | main.go:48:2:48:12 | definition of RequestData [pointer, Category] | main.go:52:3:52:13 | RequestData [pointer, Category] | provenance | | | main.go:49:3:49:14 | star expression [Category] | main.go:48:2:48:12 | definition of RequestData [pointer, Category] | provenance | | | main.go:49:4:49:14 | RequestData [pointer, Category] | main.go:49:3:49:14 | star expression [Category] | provenance | | -| main.go:49:28:49:34 | selection of URL | main.go:49:28:49:42 | call to Query | provenance | MaD:808 | +| main.go:49:28:49:34 | selection of URL | main.go:49:28:49:42 | call to Query | provenance | MaD:747 | | main.go:49:28:49:42 | call to Query | main.go:49:28:49:54 | index expression | provenance | | | main.go:49:28:49:54 | index expression | main.go:49:3:49:14 | star expression [Category] | provenance | | | main.go:51:7:52:23 | []type{args} [array] | main.go:51:7:52:23 | call to Sprintf | provenance | MaD:248 | @@ -80,7 +80,7 @@ edges | main.go:57:2:57:12 | definition of RequestData [pointer, Category] | main.go:61:5:61:15 | RequestData [pointer, Category] | provenance | | | main.go:58:3:58:14 | star expression [Category] | main.go:57:2:57:12 | definition of RequestData [pointer, Category] | provenance | | | main.go:58:4:58:14 | RequestData [pointer, Category] | main.go:58:3:58:14 | star expression [Category] | provenance | | -| main.go:58:28:58:34 | selection of URL | main.go:58:28:58:42 | call to Query | provenance | MaD:808 | +| main.go:58:28:58:34 | selection of URL | main.go:58:28:58:42 | call to Query | provenance | MaD:747 | | main.go:58:28:58:42 | call to Query | main.go:58:28:58:54 | index expression | provenance | | | main.go:58:28:58:54 | index expression | main.go:58:3:58:14 | star expression [Category] | provenance | | | main.go:60:7:61:26 | []type{args} [array] | main.go:60:7:61:26 | call to Sprintf | provenance | MaD:248 | @@ -89,7 +89,7 @@ edges | main.go:61:3:61:25 | selection of Category | main.go:60:7:61:26 | call to Sprintf | provenance | FunctionModel | | main.go:61:4:61:15 | star expression [Category] | main.go:61:3:61:25 | selection of Category | provenance | | | main.go:61:5:61:15 | RequestData [pointer, Category] | main.go:61:4:61:15 | star expression [Category] | provenance | | -| mongoDB.go:40:20:40:30 | call to Referer | mongoDB.go:42:28:42:41 | untrustedInput | provenance | Src:MaD:746 | +| mongoDB.go:40:20:40:30 | call to Referer | mongoDB.go:42:28:42:41 | untrustedInput | provenance | Src:MaD:685 | | mongoDB.go:42:19:42:42 | struct literal | mongoDB.go:50:34:50:39 | filter | provenance | | | mongoDB.go:42:19:42:42 | struct literal | mongoDB.go:61:27:61:32 | filter | provenance | | | mongoDB.go:42:19:42:42 | struct literal | mongoDB.go:63:23:63:28 | filter | provenance | | diff --git a/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected b/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected index 84f7c36e1acc..4caef4a3534d 100644 --- a/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected +++ b/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected @@ -2,10 +2,10 @@ edges | StringBreak.go:10:2:10:40 | ... := ...[0] | StringBreak.go:14:47:14:57 | versionJSON | provenance | | | StringBreakMismatched.go:12:2:12:40 | ... := ...[0] | StringBreakMismatched.go:13:29:13:47 | type conversion | provenance | | | StringBreakMismatched.go:13:13:13:62 | call to Replace | StringBreakMismatched.go:17:26:17:32 | escaped | provenance | | -| StringBreakMismatched.go:13:29:13:47 | type conversion | StringBreakMismatched.go:13:13:13:62 | call to Replace | provenance | MaD:911 | +| StringBreakMismatched.go:13:29:13:47 | type conversion | StringBreakMismatched.go:13:13:13:62 | call to Replace | provenance | MaD:850 | | StringBreakMismatched.go:24:2:24:40 | ... := ...[0] | StringBreakMismatched.go:25:29:25:47 | type conversion | provenance | | | StringBreakMismatched.go:25:13:25:61 | call to Replace | StringBreakMismatched.go:29:27:29:33 | escaped | provenance | | -| StringBreakMismatched.go:25:29:25:47 | type conversion | StringBreakMismatched.go:25:13:25:61 | call to Replace | provenance | MaD:911 | +| StringBreakMismatched.go:25:29:25:47 | type conversion | StringBreakMismatched.go:25:13:25:61 | call to Replace | provenance | MaD:850 | nodes | StringBreak.go:10:2:10:40 | ... := ...[0] | semmle.label | ... := ...[0] | | StringBreak.go:14:47:14:57 | versionJSON | semmle.label | versionJSON | diff --git a/go/ql/test/query-tests/Security/CWE-338/InsecureRandomness/InsecureRandomness.expected b/go/ql/test/query-tests/Security/CWE-338/InsecureRandomness/InsecureRandomness.expected index 18e9ba4abd44..fa8f9a02fed1 100644 --- a/go/ql/test/query-tests/Security/CWE-338/InsecureRandomness/InsecureRandomness.expected +++ b/go/ql/test/query-tests/Security/CWE-338/InsecureRandomness/InsecureRandomness.expected @@ -9,7 +9,7 @@ edges | sample.go:33:2:33:6 | definition of nonce | sample.go:37:25:37:29 | nonce | provenance | | | sample.go:33:2:33:6 | definition of nonce | sample.go:37:32:37:36 | nonce | provenance | | | sample.go:34:12:34:40 | call to New | sample.go:35:14:35:19 | random | provenance | | -| sample.go:35:14:35:19 | random | sample.go:33:2:33:6 | definition of nonce | provenance | MaD:622 | +| sample.go:35:14:35:19 | random | sample.go:33:2:33:6 | definition of nonce | provenance | MaD:561 | | sample.go:55:17:55:42 | call to Intn | sample.go:56:29:56:38 | randNumber | provenance | | | sample.go:56:11:56:40 | type conversion | sample.go:58:32:58:43 | type conversion | provenance | | | sample.go:56:18:56:39 | index expression | sample.go:56:11:56:40 | type conversion | provenance | | diff --git a/go/ql/test/query-tests/Security/CWE-347/MissingJwtSignatureCheck.expected b/go/ql/test/query-tests/Security/CWE-347/MissingJwtSignatureCheck.expected index 57c2fac8135d..1a14ca5e9598 100644 --- a/go/ql/test/query-tests/Security/CWE-347/MissingJwtSignatureCheck.expected +++ b/go/ql/test/query-tests/Security/CWE-347/MissingJwtSignatureCheck.expected @@ -1,16 +1,16 @@ edges -| go-jose.v3.go:25:16:25:20 | selection of URL | go-jose.v3.go:25:16:25:28 | call to Query | provenance | MaD:808 | -| go-jose.v3.go:25:16:25:28 | call to Query | go-jose.v3.go:25:16:25:47 | call to Get | provenance | MaD:815 | +| go-jose.v3.go:25:16:25:20 | selection of URL | go-jose.v3.go:25:16:25:28 | call to Query | provenance | MaD:747 | +| go-jose.v3.go:25:16:25:28 | call to Query | go-jose.v3.go:25:16:25:47 | call to Get | provenance | MaD:754 | | go-jose.v3.go:25:16:25:47 | call to Get | go-jose.v3.go:26:15:26:25 | signedToken | provenance | | | go-jose.v3.go:26:15:26:25 | signedToken | go-jose.v3.go:29:19:29:29 | definition of signedToken | provenance | | | go-jose.v3.go:29:19:29:29 | definition of signedToken | go-jose.v3.go:31:37:31:47 | signedToken | provenance | | -| go-jose.v3.go:31:2:31:48 | ... := ...[0] | go-jose.v3.go:33:12:33:23 | DecodedToken | provenance | Sink:MaD:394 | -| go-jose.v3.go:31:37:31:47 | signedToken | go-jose.v3.go:31:2:31:48 | ... := ...[0] | provenance | MaD:396 | -| golang-jwt-v5.go:28:16:28:20 | selection of URL | golang-jwt-v5.go:28:16:28:28 | call to Query | provenance | MaD:808 | -| golang-jwt-v5.go:28:16:28:28 | call to Query | golang-jwt-v5.go:28:16:28:47 | call to Get | provenance | MaD:815 | +| go-jose.v3.go:31:2:31:48 | ... := ...[0] | go-jose.v3.go:33:12:33:23 | DecodedToken | provenance | Sink:MaD:333 | +| go-jose.v3.go:31:37:31:47 | signedToken | go-jose.v3.go:31:2:31:48 | ... := ...[0] | provenance | MaD:335 | +| golang-jwt-v5.go:28:16:28:20 | selection of URL | golang-jwt-v5.go:28:16:28:28 | call to Query | provenance | MaD:747 | +| golang-jwt-v5.go:28:16:28:28 | call to Query | golang-jwt-v5.go:28:16:28:47 | call to Get | provenance | MaD:754 | | golang-jwt-v5.go:28:16:28:47 | call to Get | golang-jwt-v5.go:29:25:29:35 | signedToken | provenance | | | golang-jwt-v5.go:29:25:29:35 | signedToken | golang-jwt-v5.go:32:29:32:39 | definition of signedToken | provenance | | -| golang-jwt-v5.go:32:29:32:39 | definition of signedToken | golang-jwt-v5.go:34:58:34:68 | signedToken | provenance | Sink:MaD:408 | +| golang-jwt-v5.go:32:29:32:39 | definition of signedToken | golang-jwt-v5.go:34:58:34:68 | signedToken | provenance | Sink:MaD:347 | nodes | go-jose.v3.go:25:16:25:20 | selection of URL | semmle.label | selection of URL | | go-jose.v3.go:25:16:25:28 | call to Query | semmle.label | call to Query | diff --git a/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/BadRedirectCheck.expected b/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/BadRedirectCheck.expected index 86842f028d9c..117465d63153 100644 --- a/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/BadRedirectCheck.expected +++ b/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/BadRedirectCheck.expected @@ -12,8 +12,8 @@ edges | main.go:68:17:68:24 | argument corresponding to redirect | main.go:73:20:73:27 | redirect | provenance | | | main.go:68:17:68:24 | definition of redirect | main.go:73:20:73:27 | redirect | provenance | | | main.go:73:9:73:28 | call to Clean | main.go:77:25:77:39 | call to getTarget1 | provenance | | -| main.go:73:20:73:27 | redirect | main.go:73:9:73:28 | call to Clean | provenance | MaD:834 | -| main.go:73:20:73:27 | redirect | main.go:73:9:73:28 | call to Clean | provenance | MaD:834 | +| main.go:73:20:73:27 | redirect | main.go:73:9:73:28 | call to Clean | provenance | MaD:773 | +| main.go:73:20:73:27 | redirect | main.go:73:9:73:28 | call to Clean | provenance | MaD:773 | | main.go:76:19:76:21 | argument corresponding to url | main.go:77:36:77:38 | url | provenance | | | main.go:77:36:77:38 | url | main.go:68:17:68:24 | definition of redirect | provenance | | | main.go:77:36:77:38 | url | main.go:77:25:77:39 | call to getTarget1 | provenance | | diff --git a/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected index c24487ab4918..03a593151be5 100644 --- a/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected +++ b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected @@ -43,11 +43,11 @@ edges | stdlib.go:162:24:162:26 | url | stdlib.go:162:24:162:35 | call to String | provenance | Config | | stdlib.go:173:35:173:39 | selection of URL | stdlib.go:173:35:173:52 | call to RequestURI | provenance | Config | | stdlib.go:173:35:173:52 | call to RequestURI | stdlib.go:173:24:173:52 | ...+... | provenance | Config | -| stdlib.go:182:13:182:33 | call to FormValue | stdlib.go:184:23:184:28 | target | provenance | Src:MaD:743 | +| stdlib.go:182:13:182:33 | call to FormValue | stdlib.go:184:23:184:28 | target | provenance | Src:MaD:682 | | stdlib.go:190:3:190:8 | definition of target | stdlib.go:192:23:192:28 | target | provenance | | | stdlib.go:190:3:190:8 | definition of target | stdlib.go:194:23:194:28 | target | provenance | | | stdlib.go:190:3:190:57 | ... := ...[0] | stdlib.go:190:3:190:8 | definition of target | provenance | | -| stdlib.go:190:36:190:56 | call to FormValue | stdlib.go:190:3:190:57 | ... := ...[0] | provenance | Src:MaD:743 Config | +| stdlib.go:190:36:190:56 | call to FormValue | stdlib.go:190:3:190:57 | ... := ...[0] | provenance | Src:MaD:682 Config | | stdlib.go:192:23:192:28 | implicit dereference | stdlib.go:190:3:190:8 | definition of target | provenance | Config | | stdlib.go:192:23:192:28 | implicit dereference | stdlib.go:192:23:192:33 | selection of Path | provenance | Config | | stdlib.go:192:23:192:28 | target | stdlib.go:192:23:192:28 | implicit dereference | provenance | Config | diff --git a/go/ql/test/query-tests/Security/CWE-640/EmailInjection.expected b/go/ql/test/query-tests/Security/CWE-640/EmailInjection.expected index a1f71c46e203..e0ed89e75a4d 100644 --- a/go/ql/test/query-tests/Security/CWE-640/EmailInjection.expected +++ b/go/ql/test/query-tests/Security/CWE-640/EmailInjection.expected @@ -1,23 +1,23 @@ edges -| EmailBad.go:9:10:9:17 | selection of Header | EmailBad.go:9:10:9:29 | call to Get | provenance | MaD:728 | +| EmailBad.go:9:10:9:17 | selection of Header | EmailBad.go:9:10:9:29 | call to Get | provenance | MaD:667 | | EmailBad.go:9:10:9:29 | call to Get | EmailBad.go:12:56:12:67 | type conversion | provenance | | -| main.go:29:21:29:31 | call to Referer | main.go:31:57:31:78 | type conversion | provenance | Src:MaD:746 | -| main.go:37:21:37:31 | call to Referer | main.go:41:25:41:38 | untrustedInput | provenance | Src:MaD:746 | -| main.go:41:25:41:38 | untrustedInput | main.go:40:3:40:7 | definition of write | provenance | MaD:625 | -| main.go:46:21:46:31 | call to Referer | main.go:52:46:52:59 | untrustedInput | provenance | Src:MaD:746 | -| main.go:46:21:46:31 | call to Referer | main.go:53:52:53:65 | untrustedInput | provenance | Src:MaD:746 | -| main.go:58:21:58:31 | call to Referer | main.go:60:47:60:60 | untrustedInput | provenance | Src:MaD:746 | +| main.go:29:21:29:31 | call to Referer | main.go:31:57:31:78 | type conversion | provenance | Src:MaD:685 | +| main.go:37:21:37:31 | call to Referer | main.go:41:25:41:38 | untrustedInput | provenance | Src:MaD:685 | +| main.go:41:25:41:38 | untrustedInput | main.go:40:3:40:7 | definition of write | provenance | MaD:564 | +| main.go:46:21:46:31 | call to Referer | main.go:52:46:52:59 | untrustedInput | provenance | Src:MaD:685 | +| main.go:46:21:46:31 | call to Referer | main.go:53:52:53:65 | untrustedInput | provenance | Src:MaD:685 | +| main.go:58:21:58:31 | call to Referer | main.go:60:47:60:60 | untrustedInput | provenance | Src:MaD:685 | | main.go:60:14:60:61 | call to NewContent | main.go:63:16:63:22 | content | provenance | | -| main.go:60:47:60:60 | untrustedInput | main.go:60:14:60:61 | call to NewContent | provenance | MaD:457 | -| main.go:68:21:68:31 | call to Referer | main.go:74:47:74:60 | untrustedInput | provenance | Src:MaD:746 | +| main.go:60:47:60:60 | untrustedInput | main.go:60:14:60:61 | call to NewContent | provenance | MaD:396 | +| main.go:68:21:68:31 | call to Referer | main.go:74:47:74:60 | untrustedInput | provenance | Src:MaD:685 | | main.go:74:14:74:61 | call to NewContent | main.go:76:50:76:56 | content | provenance | | | main.go:74:14:74:61 | call to NewContent | main.go:76:59:76:65 | content | provenance | | | main.go:74:14:74:61 | call to NewContent | main.go:77:16:77:22 | content | provenance | | -| main.go:74:47:74:60 | untrustedInput | main.go:74:14:74:61 | call to NewContent | provenance | MaD:457 | -| main.go:82:21:82:31 | call to Referer | main.go:89:37:89:50 | untrustedInput | provenance | Src:MaD:746 | -| main.go:82:21:82:31 | call to Referer | main.go:91:48:91:61 | untrustedInput | provenance | Src:MaD:746 | +| main.go:74:47:74:60 | untrustedInput | main.go:74:14:74:61 | call to NewContent | provenance | MaD:396 | +| main.go:82:21:82:31 | call to Referer | main.go:89:37:89:50 | untrustedInput | provenance | Src:MaD:685 | +| main.go:82:21:82:31 | call to Referer | main.go:91:48:91:61 | untrustedInput | provenance | Src:MaD:685 | | main.go:91:15:91:62 | call to NewContent | main.go:93:16:93:23 | content2 | provenance | | -| main.go:91:48:91:61 | untrustedInput | main.go:91:15:91:62 | call to NewContent | provenance | MaD:457 | +| main.go:91:48:91:61 | untrustedInput | main.go:91:15:91:62 | call to NewContent | provenance | MaD:396 | nodes | EmailBad.go:9:10:9:17 | selection of Header | semmle.label | selection of Header | | EmailBad.go:9:10:9:29 | call to Get | semmle.label | call to Get | diff --git a/go/ql/test/query-tests/Security/CWE-643/XPathInjection.expected b/go/ql/test/query-tests/Security/CWE-643/XPathInjection.expected index 2aaa4d2dae4d..e7fd21bfc039 100644 --- a/go/ql/test/query-tests/Security/CWE-643/XPathInjection.expected +++ b/go/ql/test/query-tests/Security/CWE-643/XPathInjection.expected @@ -1,16 +1,16 @@ edges -| XPathInjection.go:13:14:13:19 | selection of Form | XPathInjection.go:13:14:13:35 | call to Get | provenance | MaD:815 | +| XPathInjection.go:13:14:13:19 | selection of Form | XPathInjection.go:13:14:13:35 | call to Get | provenance | MaD:754 | | XPathInjection.go:13:14:13:35 | call to Get | XPathInjection.go:16:29:16:91 | ...+... | provenance | | -| tst.go:34:14:34:19 | selection of Form | tst.go:34:14:34:35 | call to Get | provenance | MaD:815 | +| tst.go:34:14:34:19 | selection of Form | tst.go:34:14:34:35 | call to Get | provenance | MaD:754 | | tst.go:34:14:34:35 | call to Get | tst.go:37:23:37:85 | ...+... | provenance | | | tst.go:34:14:34:35 | call to Get | tst.go:40:24:40:86 | ...+... | provenance | | | tst.go:34:14:34:35 | call to Get | tst.go:43:24:43:82 | ...+... | provenance | | -| tst.go:48:14:48:19 | selection of Form | tst.go:48:14:48:35 | call to Get | provenance | MaD:815 | +| tst.go:48:14:48:19 | selection of Form | tst.go:48:14:48:35 | call to Get | provenance | MaD:754 | | tst.go:48:14:48:35 | call to Get | tst.go:51:26:51:84 | ...+... | provenance | | | tst.go:48:14:48:35 | call to Get | tst.go:54:29:54:87 | ...+... | provenance | | | tst.go:48:14:48:35 | call to Get | tst.go:57:33:57:91 | ...+... | provenance | | | tst.go:48:14:48:35 | call to Get | tst.go:60:30:60:88 | ...+... | provenance | | -| tst.go:65:14:65:19 | selection of Form | tst.go:65:14:65:35 | call to Get | provenance | MaD:815 | +| tst.go:65:14:65:19 | selection of Form | tst.go:65:14:65:35 | call to Get | provenance | MaD:754 | | tst.go:65:14:65:35 | call to Get | tst.go:68:25:68:83 | ...+... | provenance | | | tst.go:65:14:65:35 | call to Get | tst.go:71:28:71:86 | ...+... | provenance | | | tst.go:65:14:65:35 | call to Get | tst.go:74:25:74:83 | ...+... | provenance | | @@ -19,38 +19,38 @@ edges | tst.go:65:14:65:35 | call to Get | tst.go:83:29:83:87 | ...+... | provenance | | | tst.go:65:14:65:35 | call to Get | tst.go:86:23:86:85 | ...+... | provenance | | | tst.go:65:14:65:35 | call to Get | tst.go:89:22:89:84 | ...+... | provenance | | -| tst.go:94:14:94:19 | selection of Form | tst.go:94:14:94:35 | call to Get | provenance | MaD:815 | +| tst.go:94:14:94:19 | selection of Form | tst.go:94:14:94:35 | call to Get | provenance | MaD:754 | | tst.go:94:14:94:35 | call to Get | tst.go:97:26:97:84 | ...+... | provenance | | | tst.go:94:14:94:35 | call to Get | tst.go:100:29:100:87 | ...+... | provenance | | | tst.go:94:14:94:35 | call to Get | tst.go:103:33:103:91 | ...+... | provenance | | | tst.go:94:14:94:35 | call to Get | tst.go:106:30:106:88 | ...+... | provenance | | -| tst.go:111:14:111:19 | selection of Form | tst.go:111:14:111:35 | call to Get | provenance | MaD:815 | +| tst.go:111:14:111:19 | selection of Form | tst.go:111:14:111:35 | call to Get | provenance | MaD:754 | | tst.go:111:14:111:35 | call to Get | tst.go:114:25:114:87 | ...+... | provenance | | | tst.go:111:14:111:35 | call to Get | tst.go:117:26:117:88 | ...+... | provenance | | -| tst.go:122:14:122:19 | selection of Form | tst.go:122:14:122:35 | call to Get | provenance | MaD:815 | +| tst.go:122:14:122:19 | selection of Form | tst.go:122:14:122:35 | call to Get | provenance | MaD:754 | | tst.go:122:14:122:35 | call to Get | tst.go:126:23:126:126 | ...+... | provenance | | | tst.go:122:14:122:35 | call to Get | tst.go:129:24:129:127 | ...+... | provenance | | | tst.go:122:14:122:35 | call to Get | tst.go:132:27:132:122 | ...+... | provenance | | -| tst.go:123:14:123:19 | selection of Form | tst.go:123:14:123:35 | call to Get | provenance | MaD:815 | +| tst.go:123:14:123:19 | selection of Form | tst.go:123:14:123:35 | call to Get | provenance | MaD:754 | | tst.go:123:14:123:35 | call to Get | tst.go:126:23:126:126 | ...+... | provenance | | | tst.go:123:14:123:35 | call to Get | tst.go:129:24:129:127 | ...+... | provenance | | | tst.go:123:14:123:35 | call to Get | tst.go:132:27:132:122 | ...+... | provenance | | -| tst.go:140:14:140:19 | selection of Form | tst.go:140:14:140:35 | call to Get | provenance | MaD:815 | +| tst.go:140:14:140:19 | selection of Form | tst.go:140:14:140:35 | call to Get | provenance | MaD:754 | | tst.go:140:14:140:35 | call to Get | tst.go:143:27:143:89 | ...+... | provenance | | | tst.go:140:14:140:35 | call to Get | tst.go:146:28:146:90 | ...+... | provenance | | -| tst.go:151:14:151:19 | selection of Form | tst.go:151:14:151:35 | call to Get | provenance | MaD:815 | +| tst.go:151:14:151:19 | selection of Form | tst.go:151:14:151:35 | call to Get | provenance | MaD:754 | | tst.go:151:14:151:35 | call to Get | tst.go:155:33:155:136 | ...+... | provenance | | | tst.go:151:14:151:35 | call to Get | tst.go:158:18:158:121 | ...+... | provenance | | | tst.go:151:14:151:35 | call to Get | tst.go:164:31:164:126 | ...+... | provenance | | | tst.go:151:14:151:35 | call to Get | tst.go:173:21:173:116 | ...+... | provenance | | | tst.go:151:14:151:35 | call to Get | tst.go:182:27:182:122 | ...+... | provenance | | -| tst.go:152:14:152:19 | selection of Form | tst.go:152:14:152:35 | call to Get | provenance | MaD:815 | +| tst.go:152:14:152:19 | selection of Form | tst.go:152:14:152:35 | call to Get | provenance | MaD:754 | | tst.go:152:14:152:35 | call to Get | tst.go:155:33:155:136 | ...+... | provenance | | | tst.go:152:14:152:35 | call to Get | tst.go:158:18:158:121 | ...+... | provenance | | | tst.go:152:14:152:35 | call to Get | tst.go:164:31:164:126 | ...+... | provenance | | | tst.go:152:14:152:35 | call to Get | tst.go:173:21:173:116 | ...+... | provenance | | | tst.go:152:14:152:35 | call to Get | tst.go:182:27:182:122 | ...+... | provenance | | -| tst.go:193:14:193:19 | selection of Form | tst.go:193:14:193:35 | call to Get | provenance | MaD:815 | +| tst.go:193:14:193:19 | selection of Form | tst.go:193:14:193:35 | call to Get | provenance | MaD:754 | | tst.go:193:14:193:35 | call to Get | tst.go:198:23:198:85 | ...+... | provenance | | nodes | XPathInjection.go:13:14:13:19 | selection of Form | semmle.label | selection of Form | diff --git a/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected index dfe10af24ef4..f865e773b5c3 100644 --- a/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected +++ b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected @@ -1,12 +1,12 @@ edges -| RequestForgery.go:8:12:8:34 | call to FormValue | RequestForgery.go:11:24:11:65 | ...+... | provenance | Src:MaD:743 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:14:11:14:17 | tainted | provenance | Src:MaD:743 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:18:12:18:18 | tainted | provenance | Src:MaD:743 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:21:34:21:40 | tainted | provenance | Src:MaD:743 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:24:66:24:72 | tainted | provenance | Src:MaD:743 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:27:11:27:29 | ...+... | provenance | Src:MaD:743 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:29:11:29:40 | ...+... | provenance | Src:MaD:743 | -| tst.go:10:13:10:35 | call to FormValue | tst.go:36:11:36:17 | tainted | provenance | Src:MaD:743 | +| RequestForgery.go:8:12:8:34 | call to FormValue | RequestForgery.go:11:24:11:65 | ...+... | provenance | Src:MaD:682 | +| tst.go:10:13:10:35 | call to FormValue | tst.go:14:11:14:17 | tainted | provenance | Src:MaD:682 | +| tst.go:10:13:10:35 | call to FormValue | tst.go:18:12:18:18 | tainted | provenance | Src:MaD:682 | +| tst.go:10:13:10:35 | call to FormValue | tst.go:21:34:21:40 | tainted | provenance | Src:MaD:682 | +| tst.go:10:13:10:35 | call to FormValue | tst.go:24:66:24:72 | tainted | provenance | Src:MaD:682 | +| tst.go:10:13:10:35 | call to FormValue | tst.go:27:11:27:29 | ...+... | provenance | Src:MaD:682 | +| tst.go:10:13:10:35 | call to FormValue | tst.go:29:11:29:40 | ...+... | provenance | Src:MaD:682 | +| tst.go:10:13:10:35 | call to FormValue | tst.go:36:11:36:17 | tainted | provenance | Src:MaD:682 | | tst.go:35:2:35:2 | definition of u [pointer] | tst.go:36:2:36:2 | u [pointer] | provenance | | | tst.go:36:2:36:2 | implicit dereference | tst.go:35:2:35:2 | definition of u [pointer] | provenance | | | tst.go:36:2:36:2 | implicit dereference | tst.go:36:2:36:2 | u | provenance | | @@ -18,15 +18,15 @@ edges | tst.go:36:11:36:17 | tainted | tst.go:36:2:36:2 | u | provenance | Config | | tst.go:36:11:36:17 | tainted | tst.go:37:11:37:11 | u | provenance | Config | | tst.go:37:11:37:11 | u | tst.go:37:11:37:20 | call to String | provenance | MaD:238 | -| websocket.go:60:21:60:31 | call to Referer | websocket.go:65:27:65:40 | untrustedInput | provenance | Src:MaD:746 | -| websocket.go:74:21:74:31 | call to Referer | websocket.go:78:36:78:49 | untrustedInput | provenance | Src:MaD:746 | -| websocket.go:88:21:88:31 | call to Referer | websocket.go:91:31:91:44 | untrustedInput | provenance | Src:MaD:746 | -| websocket.go:107:21:107:31 | call to Referer | websocket.go:110:15:110:28 | untrustedInput | provenance | Src:MaD:746 | -| websocket.go:126:21:126:31 | call to Referer | websocket.go:129:38:129:51 | untrustedInput | provenance | Src:MaD:746 | -| websocket.go:154:21:154:31 | call to Referer | websocket.go:155:31:155:44 | untrustedInput | provenance | Src:MaD:746 | -| websocket.go:160:21:160:31 | call to Referer | websocket.go:162:31:162:44 | untrustedInput | provenance | Src:MaD:746 | -| websocket.go:195:21:195:31 | call to Referer | websocket.go:197:18:197:31 | untrustedInput | provenance | Src:MaD:746 | -| websocket.go:202:21:202:31 | call to Referer | websocket.go:204:11:204:24 | untrustedInput | provenance | Src:MaD:746 | +| websocket.go:60:21:60:31 | call to Referer | websocket.go:65:27:65:40 | untrustedInput | provenance | Src:MaD:685 | +| websocket.go:74:21:74:31 | call to Referer | websocket.go:78:36:78:49 | untrustedInput | provenance | Src:MaD:685 | +| websocket.go:88:21:88:31 | call to Referer | websocket.go:91:31:91:44 | untrustedInput | provenance | Src:MaD:685 | +| websocket.go:107:21:107:31 | call to Referer | websocket.go:110:15:110:28 | untrustedInput | provenance | Src:MaD:685 | +| websocket.go:126:21:126:31 | call to Referer | websocket.go:129:38:129:51 | untrustedInput | provenance | Src:MaD:685 | +| websocket.go:154:21:154:31 | call to Referer | websocket.go:155:31:155:44 | untrustedInput | provenance | Src:MaD:685 | +| websocket.go:160:21:160:31 | call to Referer | websocket.go:162:31:162:44 | untrustedInput | provenance | Src:MaD:685 | +| websocket.go:195:21:195:31 | call to Referer | websocket.go:197:18:197:31 | untrustedInput | provenance | Src:MaD:685 | +| websocket.go:202:21:202:31 | call to Referer | websocket.go:204:11:204:24 | untrustedInput | provenance | Src:MaD:685 | nodes | RequestForgery.go:8:12:8:34 | call to FormValue | semmle.label | call to FormValue | | RequestForgery.go:11:24:11:65 | ...+... | semmle.label | ...+... | From 0413e0e0901b80cd473d5fa0d86b7d7bd54ea641 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <jketema@github.com> Date: Thu, 11 Jul 2024 10:37:26 +0200 Subject: [PATCH 64/70] C++: Clean up QLDoc and add change note --- .../2024-07-11-additional-builtin-support.md | 4 ++ .../code/cpp/exprs/BuiltInOperations.qll | 45 +++++++++---------- 2 files changed, 26 insertions(+), 23 deletions(-) create mode 100644 cpp/ql/lib/change-notes/2024-07-11-additional-builtin-support.md diff --git a/cpp/ql/lib/change-notes/2024-07-11-additional-builtin-support.md b/cpp/ql/lib/change-notes/2024-07-11-additional-builtin-support.md new file mode 100644 index 000000000000..f389283ad1e1 --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-07-11-additional-builtin-support.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Added subclasses of `BuiltInOperations` for `__builtin_has_attribute`, `__builtin_is_corresponding_member`, `__builtin_is_pointer_interconvertible_with_class`, `__is_assignable_no_precondition_check`, `__is_bounded_array`, `__is_convertible`, `__is_corresponding_member`, `__is_nothrow_convertible`, `__is_pointer_interconvertible_with_class`, `__is_referenceable`, `__is_same_as`, `__is_trivially_copy_assignable`, `__is_unbounded_array`, `__is_valid_winrt_type`, `_is_win_class`, `__is_win_interface`, `__reference_binds_to_temporary`, `__reference_constructs_from_temporary`, and `__reference_converts_from_temporary`. diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll index 6748c3c27d22..20e5b42630a6 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll @@ -402,8 +402,8 @@ class BuiltInOperationIsConvertible extends BuiltInOperation, @isconvertible { * A C++ `__is_nothrow_convertible` built-in operation (used by some implementations * of the `<type_traits>` header). * - * Returns `true` if the first type can be converted to the second type without - * potentially rasing an exception. + * Returns `true` if the first type can be converted to the second type and the + * conversion operator has an empty exception specification. * ``` * bool v = __is_nothrow_convertible(MyType, OtherType); * ``` @@ -678,8 +678,7 @@ class BuiltInOperationIsTriviallyAssignable extends BuiltInOperation, @istrivial * The `__is_nothrow_assignable` built-in operation (used by some * implementations of the `<type_traits>` header). * - * Returns true if there exists a `C::operator =(const D& d) nothrow` - * assignment operator (i.e, with an empty exception specification). + * Returns true if there exists an assignment operator with an empty exception specification. * ``` * bool v = __is_nothrow_assignable(MyType1, MyType2); * ``` @@ -694,8 +693,7 @@ class BuiltInOperationIsNothrowAssignable extends BuiltInOperation, @isnothrowas * The `__is_assignable` built-in operation (used by some implementations * of the `<type_traits>` header). * - * Returns true if there exists a `C::operator =(const D& d)` assignment - * operator. + * Returns true if there exists an assignment operator. * ``` * bool v = __is_assignable(MyType1, MyType2); * ``` @@ -710,8 +708,7 @@ class BuiltInOperationIsAssignable extends BuiltInOperation, @isassignable { * The `__is_assignable_no_precondition_check` built-in operation (used by some * implementations of the `<type_traits>` header). * - * Returns true if there exists a `C::operator =(const D& d)` assignment - * operator. + * Returns true if there exists an assignment operator. * ``` * bool v = __is_assignable_no_precondition_check(MyType1, MyType2); * ``` @@ -1207,7 +1204,7 @@ class BuiltInOperationIsPointerInterconvertibleBaseOf extends BuiltInOperation, * A C++ `__is_pointer_interconvertible_with_class` built-in operation (used * by some implementations of the `<type_traits>` header). * - * Returns `true` if the member pointer is pointer-interconvertible with a + * Returns `true` if a member pointer is pointer-interconvertible with a * class type. * ``` * template<typename _Tp, typename _Up> @@ -1229,7 +1226,7 @@ class BuiltInOperationIsPointerInterconvertibleWithClass extends BuiltInOperatio * A C++ `__builtin_is_pointer_interconvertible_with_class` built-in operation (used * by some implementations of the `<type_traits>` header). * - * Returns `true` if the member pointer is pointer-interconvertible with a class type. + * Returns `true` if a member pointer is pointer-interconvertible with a class type. * ``` * template<typename _Tp, typename _Up> * constexpr bool is_pointer_interconvertible_with_class(_Up _Tp::*mp) noexcept @@ -1250,7 +1247,7 @@ class BuiltInOperationBuiltInIsPointerInterconvertible extends BuiltInOperation, * A C++ `__is_corresponding_member` built-in operation (used * by some implementations of the `<type_traits>` header). * - * Returns `true` if the member pointers refer to corresponding + * Returns `true` if two member pointers refer to corresponding * members in the initial sequences of two class types. * ``` * template<typename _Tp1, typename _Tp2, typename _Up1, typename _Up2> @@ -1268,7 +1265,7 @@ class BuiltInOperationIsCorrespondingMember extends BuiltInOperation, @iscorresp * A C++ `__builtin_is_corresponding_member` built-in operation (used * by some implementations of the `<type_traits>` header). * - * Returns `true` if the member pointers refer to corresponding + * Returns `true` if two member pointers refer to corresponding * members in the initial sequences of two class types. * ``` * template<typename _Tp1, typename _Tp2, typename _Up1, typename _Up2> @@ -1770,11 +1767,12 @@ class BuiltInIsTrivial extends BuiltInOperation, @istrivialexpr { * A C++ `__reference_constructs_from_temporary` built-in operation * (used by some implementations of the `<type_traits>` header). * - * Returns `true` if a type is a trivial type. + * Returns `true` if a reference type `_Tp` is bound to an expression of + * type `_Up` in direct-initialization, and a temporary object is bound. * ``` - * template<typename _Tp> + * template<typename _Tp, typename _Up> * struct reference_constructs_from_temporary - * : public integral_constant<bool, __reference_constructs_from_temporary(_Tp)> + * : public integral_constant<bool, __reference_constructs_from_temporary(_Tp, _Up)> * {}; * ``` */ @@ -1792,18 +1790,19 @@ class BuiltInOperationReferenceConstructsFromTemporary extends BuiltInOperation, * A C++ `__reference_converts_from_temporary` built-in operation * (used by some implementations of the `<type_traits>` header). * - * Returns `true` if a type is a trivial type. + * Returns `true` if a reference type `_Tp` is bound to an expression of + * type `_Up` in copy-initialization, and a temporary object is bound. * ``` - * template<typename _Tp> + * template<typename _Tp, typename _Up> * struct reference_converts_from_temporary - * : public integral_constant<bool, __reference_converts_from_temporary(_Tp)> + * : public integral_constant<bool, __reference_converts_from_temporary(_Tp, _Up)> * {}; * ``` */ class BuiltInOperationReferenceCovertsFromTemporary extends BuiltInOperation, @referenceconstructsfromtemporary { - override string toString() { result = "__reference_constructs_from_temporary" } + override string toString() { result = "__reference_converts_from_temporary" } override string getAPrimaryQlClass() { result = "BuiltInOperationReferenceCovertsFromTemporary" } } @@ -1812,8 +1811,8 @@ class BuiltInOperationReferenceCovertsFromTemporary extends BuiltInOperation, * A C++ `__reference_binds_to_temporary` built-in operation (used by some * implementations of the `<tuple>` header). * - * Returns `true` if a reference of type `Type1` bound to an expression of - * type `Type1` binds to a temporary object. + * Returns `true` if a reference of type `Type1` is bound to an expression of + * type `Type1`, and a temporary object is bound. * ``` * __reference_binds_to_temporary(Type1, Type2) */ @@ -1827,8 +1826,8 @@ class BuiltInOperationReferenceBindsToTemporary extends BuiltInOperation, @refer /** * A C++ `__builtin_has_attribute` built-in operation. * - * Returns `true` if a type or expression has been declared with an - * attribute. + * Returns `true` if a type or expression has been declared with the + * specified attribute. * ``` * __attribute__ ((aligned(8))) int v; * bool has_attribute = __builtin_has_attribute(v, aligned); From 48bf06f1aa67c9f819ef485896f746108fe09549 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <jketema@github.com> Date: Thu, 11 Jul 2024 10:43:17 +0200 Subject: [PATCH 65/70] C++: Fix `getAPrimaryQlClass` --- cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll index 20e5b42630a6..832803d134fd 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll @@ -1850,7 +1850,7 @@ class BuiltInOperationHasAttribute extends BuiltInOperation, @builtinhasattribut class BuiltInOperationIsReferenceable extends BuiltInOperation, @isreferenceable { override string toString() { result = "__is_referenceable" } - override string getAPrimaryQlClass() { result = "BuiltInIsReferenceable" } + override string getAPrimaryQlClass() { result = "BuiltInOperationIsReferenceable" } } /** From 16b142d3320b96a6b09e8692e4294113e029d2ce Mon Sep 17 00:00:00 2001 From: Tom Hvitved <hvitved@github.com> Date: Thu, 11 Jul 2024 11:34:56 +0200 Subject: [PATCH 66/70] SSA: Make barrier guards a parameterized module --- shared/ssa/codeql/ssa/Ssa.qll | 120 ++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 49 deletions(-) diff --git a/shared/ssa/codeql/ssa/Ssa.qll b/shared/ssa/codeql/ssa/Ssa.qll index 3e96636010d3..87811b005be2 100644 --- a/shared/ssa/codeql/ssa/Ssa.qll +++ b/shared/ssa/codeql/ssa/Ssa.qll @@ -1322,19 +1322,31 @@ module Make<LocationSig Location, InputSig<Location> Input> { } } - cached - private newtype TNode = - TParamNode(DfInput::Parameter p) { DfInput::ssaDefInitializesParam(_, p) } or - TExprNode(DfInput::Expr e, Boolean isPost) { - e = DfInput::getARead(_) - or - DfInput::ssaDefAssigns(_, e) and - isPost = false - } or - TSsaDefinitionNode(DefinitionExt def) or - TSsaInputNode(SsaInputDefinitionExt def, BasicBlock input) { - def.hasInputFromBlock(_, _, _, _, input) + private module Cached { + cached + newtype TNode = + TParamNode(DfInput::Parameter p) { DfInput::ssaDefInitializesParam(_, p) } or + TExprNode(DfInput::Expr e, Boolean isPost) { + e = DfInput::getARead(_) + or + DfInput::ssaDefAssigns(_, e) and + isPost = false + } or + TSsaDefinitionNode(DefinitionExt def) or + TSsaInputNode(SsaInputDefinitionExt def, BasicBlock input) { + def.hasInputFromBlock(_, _, _, _, input) + } + + cached + Definition getAPhiInputDef(SsaInputNode n) { + exists(SsaInputDefinitionExt phi, BasicBlock bb | + phi.hasInputFromBlock(result, _, _, _, bb) and + n.isInputInto(phi, bb) + ) } + } + + private import Cached /** * A data flow node that we need to reference in the value step relation. @@ -1606,46 +1618,56 @@ module Make<LocationSig Location, InputSig<Location> Input> { nodeTo.(ExprNode).getExpr() = DfInput::getARead(def) } - pragma[nomagic] - private predicate guardControlsSsaRead( - DfInput::Guard g, boolean branch, Definition def, ExprNode n - ) { - exists(BasicBlock bb, DfInput::Expr e | - e = n.getExpr() and - DfInput::getARead(def) = e and - DfInput::guardControlsBlock(g, bb, branch) and - e.hasCfgNode(bb, _) - ) - } - - pragma[nomagic] - private predicate guardControlsPhiInput( - DfInput::Guard g, boolean branch, Definition def, BasicBlock input, SsaInputDefinitionExt phi - ) { - phi.hasInputFromBlock(def, _, _, _, input) and - ( - DfInput::guardControlsBlock(g, input, branch) - or - exists(int last | - last = input.length() - 1 and - g.hasCfgNode(input, last) and - DfInput::getAConditionalBasicBlockSuccessor(input, branch) = phi.getBasicBlock() - ) - ) - } + /** + * Holds if the guard `g` validates the expression `e` upon evaluating to `branch`. + * + * The expression `e` is expected to be a syntactic part of the guard `g`. + * For example, the guard `g` might be a call `isSafe(x)` and the expression `e` + * the argument `x`. + */ + signature predicate guardChecksSig(DfInput::Guard g, DfInput::Expr e, boolean branch); /** - * Gets a node that reads SSA defininition `def`, and which is guarded by - * `g` evaluating to `branch`. + * Provides a set of barrier nodes for a guard that validates an expression. + * + * This is expected to be used in `isBarrier`/`isSanitizer` definitions + * in data flow and taint tracking. */ - pragma[nomagic] - Node getABarrierNode(DfInput::Guard g, Definition def, boolean branch) { - guardControlsSsaRead(g, branch, def, result) - or - exists(BasicBlock input, SsaInputDefinitionExt phi | - guardControlsPhiInput(g, branch, def, input, phi) and - result.(SsaInputNode).isInputInto(phi, input) - ) + module BarrierGuard<guardChecksSig/3 guardChecks> { + pragma[nomagic] + private predicate guardChecksSsaDef(DfInput::Guard g, Definition def, boolean branch) { + guardChecks(g, DfInput::getARead(def), branch) + } + + /** Gets a node that is safely guarded by the given guard check. */ + pragma[nomagic] + Node getABarrierNode() { + exists(DfInput::Guard g, boolean branch, Definition def, BasicBlock bb | + guardChecksSsaDef(g, def, branch) + | + // guard controls a read + exists(DfInput::Expr e | + e = DfInput::getARead(def) and + e.hasCfgNode(bb, _) and + DfInput::guardControlsBlock(g, bb, branch) and + result.(ExprNode).getExpr() = e + ) + or + // guard controls input block to a phi node + exists(SsaInputDefinitionExt phi | + def = getAPhiInputDef(result) and + result.(SsaInputNode).isInputInto(phi, bb) + | + DfInput::guardControlsBlock(g, bb, branch) + or + exists(int last | + last = bb.length() - 1 and + g.hasCfgNode(bb, last) and + DfInput::getAConditionalBasicBlockSuccessor(bb, branch) = phi.getBasicBlock() + ) + ) + ) + } } } } From ed42c3cd6f508e988cbae3e1f0e1139be20087bd Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <jketema@github.com> Date: Thu, 11 Jul 2024 11:48:01 +0200 Subject: [PATCH 67/70] C++: Fix class extension --- cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll index 832803d134fd..dcf72604ca92 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll @@ -1800,7 +1800,7 @@ class BuiltInOperationReferenceConstructsFromTemporary extends BuiltInOperation, * ``` */ class BuiltInOperationReferenceCovertsFromTemporary extends BuiltInOperation, - @referenceconstructsfromtemporary + @referenceconvertsfromtemporary { override string toString() { result = "__reference_converts_from_temporary" } From 5e0ce7efc4636f2272e6fbd342f43d3b135b7ecd Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <jketema@github.com> Date: Thu, 11 Jul 2024 11:58:25 +0200 Subject: [PATCH 68/70] C++: Fix test --- cpp/ql/test/library-tests/builtins/type_traits/expr.expected | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/library-tests/builtins/type_traits/expr.expected b/cpp/ql/test/library-tests/builtins/type_traits/expr.expected index da6812b2772b..edf63baef9e9 100644 --- a/cpp/ql/test/library-tests/builtins/type_traits/expr.expected +++ b/cpp/ql/test/library-tests/builtins/type_traits/expr.expected @@ -191,10 +191,10 @@ | gcc.cpp:26:47:26:97 | __reference_constructs_from_temporary | int &&,int && | 0 | | gcc.cpp:26:47:26:97 | int && | | <none> | | gcc.cpp:26:47:26:97 | int && | | <none> | -| gcc.cpp:28:45:28:91 | (no string representation) | int &&,int | 1 | +| gcc.cpp:28:45:28:91 | __reference_converts_from_temporary | int &&,int | 1 | | gcc.cpp:28:45:28:91 | int | | <none> | | gcc.cpp:28:45:28:91 | int && | | <none> | -| gcc.cpp:29:45:29:93 | (no string representation) | int &&,int && | 0 | +| gcc.cpp:29:45:29:93 | __reference_converts_from_temporary | int &&,int && | 0 | | gcc.cpp:29:45:29:93 | int && | | <none> | | gcc.cpp:29:45:29:93 | int && | | <none> | | ms.cpp:38:41:38:45 | 0 | | 0 | From 90641a51529fdc30c143391aedb5ec3dda2158a5 Mon Sep 17 00:00:00 2001 From: Angela P Wen <angelapwen@github.com> Date: Thu, 11 Jul 2024 13:22:06 +0200 Subject: [PATCH 69/70] Remove CI workaround for DatabaseQualityDiagnostics.ql --- .github/workflows/compile-queries.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/compile-queries.yml b/.github/workflows/compile-queries.yml index 292ae3b8b230..38452f97d36b 100644 --- a/.github/workflows/compile-queries.yml +++ b/.github/workflows/compile-queries.yml @@ -29,8 +29,6 @@ jobs: key: all-queries - name: check formatting run: find shared */ql -type f \( -name "*.qll" -o -name "*.ql" \) -print0 | xargs -0 -n 3000 -P 10 codeql query format -q --check-only - - name: Omit DatabaseQualityDiagnostics.ql from compile checking # Remove me once CodeQL 2.18.0 is released! - run: mv java/ql/src/Telemetry/DatabaseQualityDiagnostics.ql{,.hidden} - name: compile queries - check-only # run with --check-only if running in a PR (github.sha != main) if : ${{ github.event_name == 'pull_request' }} @@ -41,6 +39,3 @@ jobs: if : ${{ github.event_name != 'pull_request' }} shell: bash run: codeql query compile -q -j0 */ql/{src,examples} --keep-going --warnings=error --compilation-cache "${{ steps.query-cache.outputs.cache-dir }}" --compilation-cache-size=500 - - name: Restore DatabaseQualityDiagnostics.ql after compile checking # Remove me once CodeQL 2.18.0 is released - run: mv java/ql/src/Telemetry/DatabaseQualityDiagnostics.ql{.hidden,} - From 5ecde387afc76ebe4520ab0d9f6ffadb4fb428c6 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen <rasmuswl@github.com> Date: Thu, 11 Jul 2024 14:42:26 +0200 Subject: [PATCH 70/70] Python: Fix `.expected` --- .../experimental/query-tests/Security/CWE-094/Js2Py.expected | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.expected b/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.expected index 2d4542b92ec9..7798cdda143c 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-094/Js2Py.expected @@ -7,4 +7,4 @@ nodes | Js2PyTest.py:10:18:10:28 | ControlFlowNode for Fstring | semmle.label | ControlFlowNode for Fstring | subpaths #select -| Js2PyTest.py:10:18:10:28 | ControlFlowNode for Fstring | Js2PyTest.py:9:10:9:22 | ControlFlowNode for Attribute | Js2PyTest.py:10:18:10:28 | ControlFlowNode for Fstring | This can lead to arbitrary code execution | +| Js2PyTest.py:10:18:10:28 | ControlFlowNode for Fstring | Js2PyTest.py:9:10:9:22 | ControlFlowNode for Attribute | Js2PyTest.py:10:18:10:28 | ControlFlowNode for Fstring | This input to Js2Py depends on a $@. | Js2PyTest.py:9:10:9:22 | ControlFlowNode for Attribute | user-provided value |