From c4c1dfa2b990ab799de1a10e43b0d4b894e0aa43 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 16 Dec 2019 10:49:16 +0000 Subject: [PATCH 1/4] C++: Modernize the files tests. --- cpp/ql/test/library-tests/files/FilePath.expected | 4 ---- cpp/ql/test/library-tests/files/FilePath.ql | 5 ----- cpp/ql/test/library-tests/files/Files.expected | 4 ++++ cpp/ql/test/library-tests/files/Files.ql | 15 +++++++++++++++ cpp/ql/test/library-tests/files/Files1.expected | 1 - cpp/ql/test/library-tests/files/Files1.ql | 4 ---- cpp/ql/test/library-tests/files/Files2.expected | 8 -------- cpp/ql/test/library-tests/files/Files2.ql | 11 ----------- cpp/ql/test/library-tests/files/Files3.expected | 3 --- cpp/ql/test/library-tests/files/Files3.ql | 7 ------- cpp/ql/test/library-tests/files/Files4.expected | 3 --- cpp/ql/test/library-tests/files/Files4.ql | 5 ----- 12 files changed, 19 insertions(+), 51 deletions(-) delete mode 100644 cpp/ql/test/library-tests/files/FilePath.expected delete mode 100644 cpp/ql/test/library-tests/files/FilePath.ql create mode 100644 cpp/ql/test/library-tests/files/Files.expected create mode 100644 cpp/ql/test/library-tests/files/Files.ql delete mode 100644 cpp/ql/test/library-tests/files/Files1.expected delete mode 100644 cpp/ql/test/library-tests/files/Files1.ql delete mode 100644 cpp/ql/test/library-tests/files/Files2.expected delete mode 100644 cpp/ql/test/library-tests/files/Files2.ql delete mode 100644 cpp/ql/test/library-tests/files/Files3.expected delete mode 100644 cpp/ql/test/library-tests/files/Files3.ql delete mode 100644 cpp/ql/test/library-tests/files/Files4.expected delete mode 100644 cpp/ql/test/library-tests/files/Files4.ql diff --git a/cpp/ql/test/library-tests/files/FilePath.expected b/cpp/ql/test/library-tests/files/FilePath.expected deleted file mode 100644 index 6647c1e1fd7a..000000000000 --- a/cpp/ql/test/library-tests/files/FilePath.expected +++ /dev/null @@ -1,4 +0,0 @@ -| c.c | library-tests/files/c.c | -| files1.cpp | library-tests/files/files1.cpp | -| files1.h | library-tests/files/files1.h | -| files2.cpp | library-tests/files/files2.cpp | diff --git a/cpp/ql/test/library-tests/files/FilePath.ql b/cpp/ql/test/library-tests/files/FilePath.ql deleted file mode 100644 index 724c4b45ae79..000000000000 --- a/cpp/ql/test/library-tests/files/FilePath.ql +++ /dev/null @@ -1,5 +0,0 @@ -import cpp - -from File f -where f.toString() != "" -select f.toString(), f.getRelativePath() diff --git a/cpp/ql/test/library-tests/files/Files.expected b/cpp/ql/test/library-tests/files/Files.expected new file mode 100644 index 000000000000..68187793433b --- /dev/null +++ b/cpp/ql/test/library-tests/files/Files.expected @@ -0,0 +1,4 @@ +| c.c | library-tests/files/c.c | CFile, MetricFile | C | | | +| files1.cpp | library-tests/files/files1.cpp | CppFile, MetricFile | C++ | swap | t | +| files1.h | library-tests/files/files1.h | HeaderFile, MetricFile | | swap | | +| files2.cpp | library-tests/files/files2.cpp | CppFile, MetricFile | C++ | g | x, y | diff --git a/cpp/ql/test/library-tests/files/Files.ql b/cpp/ql/test/library-tests/files/Files.ql new file mode 100644 index 000000000000..58c6c9276bd8 --- /dev/null +++ b/cpp/ql/test/library-tests/files/Files.ql @@ -0,0 +1,15 @@ +import cpp + +string describe(File f) { + f.compiledAsC() and + result = "C" + or + f.compiledAsCpp() and + result = "C++" +} + +from File f +where f.toString() != "" +select f.toString(), f.getRelativePath(), concat(f.getAQlClass().toString(), ", "), + concat(describe(f), ", "), concat(f.getATopLevelDeclaration().toString(), ", "), + concat(LocalVariable v | f.getADeclaration() = v | v.toString(), ", ") diff --git a/cpp/ql/test/library-tests/files/Files1.expected b/cpp/ql/test/library-tests/files/Files1.expected deleted file mode 100644 index ef11fb83e9be..000000000000 --- a/cpp/ql/test/library-tests/files/Files1.expected +++ /dev/null @@ -1 +0,0 @@ -| files1.h:0:0:0:0 | files1.h | files1.cpp:4:6:4:9 | swap | diff --git a/cpp/ql/test/library-tests/files/Files1.ql b/cpp/ql/test/library-tests/files/Files1.ql deleted file mode 100644 index a4db35de1b83..000000000000 --- a/cpp/ql/test/library-tests/files/Files1.ql +++ /dev/null @@ -1,4 +0,0 @@ -import cpp - -from HeaderFile f -select f, f.getATopLevelDeclaration() diff --git a/cpp/ql/test/library-tests/files/Files2.expected b/cpp/ql/test/library-tests/files/Files2.expected deleted file mode 100644 index 7a2649c09e4a..000000000000 --- a/cpp/ql/test/library-tests/files/Files2.expected +++ /dev/null @@ -1,8 +0,0 @@ -| CFile | C | --- | c.c | -| CppFile | - | C++ | files1.cpp | -| CppFile | - | C++ | files2.cpp | -| HeaderFile | - | --- | files1.h | -| MetricFile | - | --- | files1.h | -| MetricFile | - | C++ | files1.cpp | -| MetricFile | - | C++ | files2.cpp | -| MetricFile | C | --- | c.c | diff --git a/cpp/ql/test/library-tests/files/Files2.ql b/cpp/ql/test/library-tests/files/Files2.ql deleted file mode 100644 index b87a06b97611..000000000000 --- a/cpp/ql/test/library-tests/files/Files2.ql +++ /dev/null @@ -1,11 +0,0 @@ -import cpp - -string isCompiledAsC(File f) { if f.compiledAsC() then result = "C" else result = "-" } - -string isCompiledAsCpp(File f) { if f.compiledAsCpp() then result = "C++" else result = "---" } - -from File f -// On 64bit Linux, __va_list_tag is in the unknown file (""). Ignore it. -where f.getAbsolutePath() != "" -select (f.getAQlClass().toString() + " ").prefix(10), isCompiledAsC(f), isCompiledAsCpp(f), - f.toString() diff --git a/cpp/ql/test/library-tests/files/Files3.expected b/cpp/ql/test/library-tests/files/Files3.expected deleted file mode 100644 index f17f4192871c..000000000000 --- a/cpp/ql/test/library-tests/files/Files3.expected +++ /dev/null @@ -1,3 +0,0 @@ -| files1.cpp | files1.cpp:4:6:4:9 | swap | -| files1.h | files1.cpp:4:6:4:9 | swap | -| files2.cpp | files2.cpp:3:6:3:6 | g | diff --git a/cpp/ql/test/library-tests/files/Files3.ql b/cpp/ql/test/library-tests/files/Files3.ql deleted file mode 100644 index 9d8d2ffc83c5..000000000000 --- a/cpp/ql/test/library-tests/files/Files3.ql +++ /dev/null @@ -1,7 +0,0 @@ -import cpp - -from File f, Declaration d -where - d = f.getATopLevelDeclaration() and - d.getName() != "__va_list_tag" -select f.toString(), d diff --git a/cpp/ql/test/library-tests/files/Files4.expected b/cpp/ql/test/library-tests/files/Files4.expected deleted file mode 100644 index 188b7161d991..000000000000 --- a/cpp/ql/test/library-tests/files/Files4.expected +++ /dev/null @@ -1,3 +0,0 @@ -| files1.cpp | files1.cpp:6:6:6:6 | t | -| files2.cpp | files2.cpp:4:6:4:6 | x | -| files2.cpp | files2.cpp:5:6:5:6 | y | diff --git a/cpp/ql/test/library-tests/files/Files4.ql b/cpp/ql/test/library-tests/files/Files4.ql deleted file mode 100644 index 104029795415..000000000000 --- a/cpp/ql/test/library-tests/files/Files4.ql +++ /dev/null @@ -1,5 +0,0 @@ -import cpp - -from File f, LocalVariable v -where f.getADeclaration() = v -select f.toString(), v From a6407f00a7948bbcaa4a646a63e5b05fbefb6c43 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 16 Dec 2019 11:02:28 +0000 Subject: [PATCH 2/4] C++: Extend the files test to cover the issue with XMLParent. --- cpp/ql/test/library-tests/files/Files.expected | 8 ++++---- cpp/ql/test/library-tests/files/Files.ql | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cpp/ql/test/library-tests/files/Files.expected b/cpp/ql/test/library-tests/files/Files.expected index 68187793433b..2d40908a0197 100644 --- a/cpp/ql/test/library-tests/files/Files.expected +++ b/cpp/ql/test/library-tests/files/Files.expected @@ -1,4 +1,4 @@ -| c.c | library-tests/files/c.c | CFile, MetricFile | C | | | -| files1.cpp | library-tests/files/files1.cpp | CppFile, MetricFile | C++ | swap | t | -| files1.h | library-tests/files/files1.h | HeaderFile, MetricFile | | swap | | -| files2.cpp | library-tests/files/files2.cpp | CppFile, MetricFile | C++ | g | x, y | +| c.c | library-tests/files/c.c | CFile, MetricFile | C, XMLParent | | | +| files1.cpp | library-tests/files/files1.cpp | CppFile, MetricFile | C++, XMLParent | swap | t | +| files1.h | library-tests/files/files1.h | HeaderFile, MetricFile | XMLParent | swap | | +| files2.cpp | library-tests/files/files2.cpp | CppFile, MetricFile | C++, XMLParent | g | x, y | diff --git a/cpp/ql/test/library-tests/files/Files.ql b/cpp/ql/test/library-tests/files/Files.ql index 58c6c9276bd8..4517d2b5bf8d 100644 --- a/cpp/ql/test/library-tests/files/Files.ql +++ b/cpp/ql/test/library-tests/files/Files.ql @@ -6,6 +6,9 @@ string describe(File f) { or f.compiledAsCpp() and result = "C++" + or + f instanceof XMLParent and + result = "XMLParent" // regression tests a bug in the constructor of XMLParent } from File f From f99063448160a202da8f0ff4fbc0ecd38445cb73 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 16 Dec 2019 11:06:40 +0000 Subject: [PATCH 3/4] C++: Fix the XMLParent Constructor. --- cpp/ql/src/semmle/code/cpp/XML.qll | 6 ++++++ cpp/ql/test/library-tests/files/Files.expected | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/XML.qll b/cpp/ql/src/semmle/code/cpp/XML.qll index 76e96fa1fc0a..21e48302788b 100644 --- a/cpp/ql/src/semmle/code/cpp/XML.qll +++ b/cpp/ql/src/semmle/code/cpp/XML.qll @@ -31,6 +31,12 @@ abstract class XMLLocatable extends @xmllocatable { * both of which can contain other elements. */ class XMLParent extends @xmlparent { + XMLParent() { + // explicitly restrict `this` to be either an `XMLElement` or an `XMLFile`; + // the type `@xmlparent` currently also includes non-XML files + this instanceof @xmlelement or xmlEncoding(this, _) + } + /** * Gets a printable representation of this XML parent. * (Intended to be overridden in subclasses.) diff --git a/cpp/ql/test/library-tests/files/Files.expected b/cpp/ql/test/library-tests/files/Files.expected index 2d40908a0197..68187793433b 100644 --- a/cpp/ql/test/library-tests/files/Files.expected +++ b/cpp/ql/test/library-tests/files/Files.expected @@ -1,4 +1,4 @@ -| c.c | library-tests/files/c.c | CFile, MetricFile | C, XMLParent | | | -| files1.cpp | library-tests/files/files1.cpp | CppFile, MetricFile | C++, XMLParent | swap | t | -| files1.h | library-tests/files/files1.h | HeaderFile, MetricFile | XMLParent | swap | | -| files2.cpp | library-tests/files/files2.cpp | CppFile, MetricFile | C++, XMLParent | g | x, y | +| c.c | library-tests/files/c.c | CFile, MetricFile | C | | | +| files1.cpp | library-tests/files/files1.cpp | CppFile, MetricFile | C++ | swap | t | +| files1.h | library-tests/files/files1.h | HeaderFile, MetricFile | | swap | | +| files2.cpp | library-tests/files/files2.cpp | CppFile, MetricFile | C++ | g | x, y | From 0a1fa08488601982a8fe00e3148f2b6219878daa Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 16 Dec 2019 13:38:36 +0000 Subject: [PATCH 4/4] Update cpp/ql/test/library-tests/files/Files.ql Co-Authored-By: Max Schaefer <54907921+max-schaefer@users.noreply.github.com> --- cpp/ql/test/library-tests/files/Files.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/files/Files.ql b/cpp/ql/test/library-tests/files/Files.ql index 4517d2b5bf8d..ee489c01843c 100644 --- a/cpp/ql/test/library-tests/files/Files.ql +++ b/cpp/ql/test/library-tests/files/Files.ql @@ -8,7 +8,7 @@ string describe(File f) { result = "C++" or f instanceof XMLParent and - result = "XMLParent" // regression tests a bug in the constructor of XMLParent + result = "XMLParent" // regression tests a bug in the characteristic predicate of XMLParent } from File f