From 0a9660a12a17edf33103eefeeecce3493cd88281 Mon Sep 17 00:00:00 2001 From: DrAlexD Date: Thu, 18 Jan 2024 17:59:42 +0300 Subject: [PATCH] Added support for hierarchy when `.ql` files are separate from `.cpp` files --- .github/workflows/codeql.yml | 3 +- README.md | 11 ++++- {languages => code}/cpp/codeql-pack.lock.yml | 0 {languages => code}/cpp/doStmt/doStmtCode.cpp | 0 .../cpp/doStmt/doStmtTest.expected | 0 code/cpp/doStmt/doStmtTest.qlref | 1 + code/cpp/qlpack.yml | 5 +++ .../rangeBasedForStmtCode.cpp | 0 .../rangeBasedForStmtTest.expected | 0 .../rangeBasedForStmtTest.qlref | 1 + codeWithQueries/cpp/codeql-pack.lock.yml | 4 ++ codeWithQueries/cpp/doStmt/doStmtCode.cpp | 40 +++++++++++++++++++ .../cpp/doStmt/doStmtTest.expected | 5 +++ .../cpp/doStmt/doStmtTest.ql | 0 codeWithQueries/cpp/qlpack.yml | 5 +++ .../rangeBasedForStmtCode.cpp | 17 ++++++++ .../rangeBasedForStmtTest.expected | 2 + .../rangeBasedForStmtTest.ql | 0 queries/cpp/codeql-pack.lock.yml | 4 ++ queries/cpp/doStmt/doStmtTest.ql | 10 +++++ {languages => queries}/cpp/qlpack.yml | 2 +- .../rangeBasedForStmtTest.ql | 10 +++++ 22 files changed, 116 insertions(+), 4 deletions(-) rename {languages => code}/cpp/codeql-pack.lock.yml (100%) rename {languages => code}/cpp/doStmt/doStmtCode.cpp (100%) rename {languages => code}/cpp/doStmt/doStmtTest.expected (100%) create mode 100644 code/cpp/doStmt/doStmtTest.qlref create mode 100644 code/cpp/qlpack.yml rename {languages => code}/cpp/rangeBasedForStmt/rangeBasedForStmtCode.cpp (100%) rename {languages => code}/cpp/rangeBasedForStmt/rangeBasedForStmtTest.expected (100%) create mode 100644 code/cpp/rangeBasedForStmt/rangeBasedForStmtTest.qlref create mode 100644 codeWithQueries/cpp/codeql-pack.lock.yml create mode 100644 codeWithQueries/cpp/doStmt/doStmtCode.cpp create mode 100644 codeWithQueries/cpp/doStmt/doStmtTest.expected rename {languages => codeWithQueries}/cpp/doStmt/doStmtTest.ql (100%) create mode 100644 codeWithQueries/cpp/qlpack.yml create mode 100644 codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtCode.cpp create mode 100644 codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.expected rename {languages => codeWithQueries}/cpp/rangeBasedForStmt/rangeBasedForStmtTest.ql (100%) create mode 100644 queries/cpp/codeql-pack.lock.yml create mode 100644 queries/cpp/doStmt/doStmtTest.ql rename {languages => queries}/cpp/qlpack.yml (68%) create mode 100644 queries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.ql diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 85dcf08..770a75a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -23,4 +23,5 @@ jobs: tar -xzf codeql-bundle-linux64.tar.gz - name: Run codeQL run: | - codeql/codeql test run languages/cpp + codeql/codeql test run -- codeWithQueries/cpp + codeql/codeql test run --additional-packs=queries/cpp -- code/cpp diff --git a/README.md b/README.md index 669f656..4fbad5b 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,15 @@ ```shell codeql test run -- ``` -Where `` is .ql or .qlref file that defines a test to run or directory which will be searched recursively for tests to run. -To run the test cases, use the path to the `languages` folder. +Where `` is `.ql` file that defines a test to run or directory which will be searched recursively for tests to run. +To run the test cases, use the path to the `codeWithQueries` folder. + +If you want to put `.ql` files are separate from `.cpp` files, then you can use the command: +```shell +codeql test run --additional-packs= -- +``` +Where `` is dir with `.ql` files and `` is `.qlref` file or directory which will be searched recursively for tests to run. +To run the test cases, use the path to the folders `queries` and `code`. After run, you will see the `NAME.actual` files (whose name matches to the `NAME.ql` test files). Each such file contains the result of running the test. diff --git a/languages/cpp/codeql-pack.lock.yml b/code/cpp/codeql-pack.lock.yml similarity index 100% rename from languages/cpp/codeql-pack.lock.yml rename to code/cpp/codeql-pack.lock.yml diff --git a/languages/cpp/doStmt/doStmtCode.cpp b/code/cpp/doStmt/doStmtCode.cpp similarity index 100% rename from languages/cpp/doStmt/doStmtCode.cpp rename to code/cpp/doStmt/doStmtCode.cpp diff --git a/languages/cpp/doStmt/doStmtTest.expected b/code/cpp/doStmt/doStmtTest.expected similarity index 100% rename from languages/cpp/doStmt/doStmtTest.expected rename to code/cpp/doStmt/doStmtTest.expected diff --git a/code/cpp/doStmt/doStmtTest.qlref b/code/cpp/doStmt/doStmtTest.qlref new file mode 100644 index 0000000..1ef8a15 --- /dev/null +++ b/code/cpp/doStmt/doStmtTest.qlref @@ -0,0 +1 @@ +doStmt/doStmtTest.ql \ No newline at end of file diff --git a/code/cpp/qlpack.yml b/code/cpp/qlpack.yml new file mode 100644 index 0000000..28a4aff --- /dev/null +++ b/code/cpp/qlpack.yml @@ -0,0 +1,5 @@ +name: codeql-code-test +dependencies: + codeql-queries-test: "*" +extractor: cpp +tests: . \ No newline at end of file diff --git a/languages/cpp/rangeBasedForStmt/rangeBasedForStmtCode.cpp b/code/cpp/rangeBasedForStmt/rangeBasedForStmtCode.cpp similarity index 100% rename from languages/cpp/rangeBasedForStmt/rangeBasedForStmtCode.cpp rename to code/cpp/rangeBasedForStmt/rangeBasedForStmtCode.cpp diff --git a/languages/cpp/rangeBasedForStmt/rangeBasedForStmtTest.expected b/code/cpp/rangeBasedForStmt/rangeBasedForStmtTest.expected similarity index 100% rename from languages/cpp/rangeBasedForStmt/rangeBasedForStmtTest.expected rename to code/cpp/rangeBasedForStmt/rangeBasedForStmtTest.expected diff --git a/code/cpp/rangeBasedForStmt/rangeBasedForStmtTest.qlref b/code/cpp/rangeBasedForStmt/rangeBasedForStmtTest.qlref new file mode 100644 index 0000000..11ff74f --- /dev/null +++ b/code/cpp/rangeBasedForStmt/rangeBasedForStmtTest.qlref @@ -0,0 +1 @@ +rangeBasedForStmt/rangeBasedForStmtTest.ql \ No newline at end of file diff --git a/codeWithQueries/cpp/codeql-pack.lock.yml b/codeWithQueries/cpp/codeql-pack.lock.yml new file mode 100644 index 0000000..5300427 --- /dev/null +++ b/codeWithQueries/cpp/codeql-pack.lock.yml @@ -0,0 +1,4 @@ +--- +lockVersion: 1.0.0 +dependencies: {} +compiled: false diff --git a/codeWithQueries/cpp/doStmt/doStmtCode.cpp b/codeWithQueries/cpp/doStmt/doStmtCode.cpp new file mode 100644 index 0000000..924f736 --- /dev/null +++ b/codeWithQueries/cpp/doStmt/doStmtCode.cpp @@ -0,0 +1,40 @@ +int get_square(int number = 0) { + return number * number; +} + +int foo1() { + int a = 0; + int b = 100; + do { + do { + a++; + } while (get_square(5) < a); + b--; + } while (get_square(a) > b); + return a; +} + +int foo2() { + int a = 0; + do { + a++; + } while (get_square() != 0); + return a; +} + +int foo3() { + int a = 0; + bool flag = get_square(5) != 25; + do { + a++; + } while (flag); + return a; +} + +int foo4(int a) { + bool flag = get_square(a) != 0; + do { + a++; + } while (flag && get_square(a) > 10); + return a; +} diff --git a/codeWithQueries/cpp/doStmt/doStmtTest.expected b/codeWithQueries/cpp/doStmt/doStmtTest.expected new file mode 100644 index 0000000..538721c --- /dev/null +++ b/codeWithQueries/cpp/doStmt/doStmtTest.expected @@ -0,0 +1,5 @@ +| doStmtCode.cpp:8:5:13:32 | do (...) ... | This is 'do' statement. | +| doStmtCode.cpp:9:9:11:36 | do (...) ... | This is 'do' statement. | +| doStmtCode.cpp:19:5:21:32 | do (...) ... | This is 'do' statement. | +| doStmtCode.cpp:28:5:30:19 | do (...) ... | This is 'do' statement. | +| doStmtCode.cpp:36:5:38:41 | do (...) ... | This is 'do' statement. | diff --git a/languages/cpp/doStmt/doStmtTest.ql b/codeWithQueries/cpp/doStmt/doStmtTest.ql similarity index 100% rename from languages/cpp/doStmt/doStmtTest.ql rename to codeWithQueries/cpp/doStmt/doStmtTest.ql diff --git a/codeWithQueries/cpp/qlpack.yml b/codeWithQueries/cpp/qlpack.yml new file mode 100644 index 0000000..499dffc --- /dev/null +++ b/codeWithQueries/cpp/qlpack.yml @@ -0,0 +1,5 @@ +name: codeql-code-with-queries-test +dependencies: + codeql/cpp-all: "*" +extractor: cpp +tests: . \ No newline at end of file diff --git a/codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtCode.cpp b/codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtCode.cpp new file mode 100644 index 0000000..1f17f3f --- /dev/null +++ b/codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtCode.cpp @@ -0,0 +1,17 @@ +int foo1() { + int a = 100; + int array1[] = {-6, 3, 10}; + for (int i: array1) { + a -= i; + } + return a; +} + +int foo2() { + int a = 0; + int array2[] = {-9, 5, 15}; + for (int j: array2) { + a += j; + } + return a; +} diff --git a/codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.expected b/codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.expected new file mode 100644 index 0000000..a8f88bf --- /dev/null +++ b/codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.expected @@ -0,0 +1,2 @@ +| rangeBasedForStmtCode.cpp:4:5:6:5 | for(...:...) ... | This is range based 'for' statement. | +| rangeBasedForStmtCode.cpp:13:5:15:5 | for(...:...) ... | This is range based 'for' statement. | diff --git a/languages/cpp/rangeBasedForStmt/rangeBasedForStmtTest.ql b/codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.ql similarity index 100% rename from languages/cpp/rangeBasedForStmt/rangeBasedForStmtTest.ql rename to codeWithQueries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.ql diff --git a/queries/cpp/codeql-pack.lock.yml b/queries/cpp/codeql-pack.lock.yml new file mode 100644 index 0000000..5300427 --- /dev/null +++ b/queries/cpp/codeql-pack.lock.yml @@ -0,0 +1,4 @@ +--- +lockVersion: 1.0.0 +dependencies: {} +compiled: false diff --git a/queries/cpp/doStmt/doStmtTest.ql b/queries/cpp/doStmt/doStmtTest.ql new file mode 100644 index 0000000..9536604 --- /dev/null +++ b/queries/cpp/doStmt/doStmtTest.ql @@ -0,0 +1,10 @@ +/** + * @name Test 'do' statement + * @kind problem + * @id cpp/doStmtTest + */ + +import cpp + +from DoStmt doStmt +select doStmt, "This is 'do' statement." \ No newline at end of file diff --git a/languages/cpp/qlpack.yml b/queries/cpp/qlpack.yml similarity index 68% rename from languages/cpp/qlpack.yml rename to queries/cpp/qlpack.yml index 3067122..6f85f2c 100644 --- a/languages/cpp/qlpack.yml +++ b/queries/cpp/qlpack.yml @@ -1,4 +1,4 @@ -name: codeql-test-examples +name: codeql-queries-test dependencies: codeql/cpp-all: "*" extractor: cpp diff --git a/queries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.ql b/queries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.ql new file mode 100644 index 0000000..69df3c2 --- /dev/null +++ b/queries/cpp/rangeBasedForStmt/rangeBasedForStmtTest.ql @@ -0,0 +1,10 @@ +/** + * @name Test range based 'for' statement + * @kind problem + * @id cpp/rangeBasedForStmtTest + */ + +import cpp + +from RangeBasedForStmt rangeBasedForStmt +select rangeBasedForStmt, "This is range based 'for' statement." \ No newline at end of file