From 442dad4ff90361c6c602c1dcdf3689cdb55256f2 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 21 Jan 2025 18:02:28 +0100 Subject: [PATCH] C++: Update `PreprocBlock.qll` QLDoc and add C++23 test --- .../semmle/code/cpp/headers/PreprocBlock.qll | 15 +++++++------ .../preprocBlock/preprocblock.expected | 6 +++++ .../headers/preprocBlock/preprocblock23.cpp | 22 +++++++++++++++++++ .../preprocBlock/preprocinclude.expected | 4 ++++ 4 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 cpp/ql/test/library-tests/headers/preprocBlock/preprocblock23.cpp diff --git a/cpp/ql/lib/semmle/code/cpp/headers/PreprocBlock.qll b/cpp/ql/lib/semmle/code/cpp/headers/PreprocBlock.qll index e723d2b50a0..6488ffa9792 100644 --- a/cpp/ql/lib/semmle/code/cpp/headers/PreprocBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/headers/PreprocBlock.qll @@ -1,8 +1,9 @@ /** * This library offers a view of preprocessor branches (`#if`, `#ifdef`, - * `#ifndef`, `#elif` and `#else`) as blocks of code between the opening and - * closing directives, with navigable parent-child relationships to other - * blocks. The main class is `PreprocessorBlock`. + * `#ifndef`, `#elif`, `#elifdef`, `#elifndef`, and `#else`) as blocks of + * code between the opening and closing directives, with navigable + * parent-child relationships to other blocks. The main class is + * `PreprocessorBlock`. */ import cpp @@ -32,10 +33,10 @@ private int getPreprocIndex(PreprocessorBranchDirective directive) { /** * A chunk of code from one preprocessor branch (`#if`, `#ifdef`, - * `#ifndef`, `#elif` or `#else`) to the directive that closes it - * (`#elif`, `#else` or `#endif`). The `getParent()` method - * allows these blocks to be navigated as a tree, with the root - * being the entire file. + * `#ifndef`, `#elif`, `#elifdef`, `#elifndef`, or `#else`) to the + * directive that closes it (`#elif`, `#elifdef`, `#elifndef`, `#else`, + * or `#endif`). The `getParent()` method allows these blocks to be + * navigated as a tree, with the root being the entire file. */ class PreprocessorBlock extends @element { PreprocessorBlock() { diff --git a/cpp/ql/test/library-tests/headers/preprocBlock/preprocblock.expected b/cpp/ql/test/library-tests/headers/preprocBlock/preprocblock.expected index 1370a6ed11e..52fbb33090f 100644 --- a/cpp/ql/test/library-tests/headers/preprocBlock/preprocblock.expected +++ b/cpp/ql/test/library-tests/headers/preprocBlock/preprocblock.expected @@ -1,10 +1,16 @@ | #elif defined GREEN | preprocblock.cpp:10:0:11:0 | #ifndef BLUE | | #elif defined GREEN | preprocblock.cpp:14:0:15:0 | #if 0 | | #elif defined GREEN | preprocblock.cpp:16:0:17:0 | #else | +| #elifdef GREEN | preprocblock23.cpp:11:0:12:0 | #if 0 | +| #elifdef GREEN | preprocblock23.cpp:13:0:14:0 | #elifndef BLUE | | (no parent) | file://:0:0:0:0 | | | (no parent) | header.h:0:0:8:0 | header.h | +| (no parent) | preprocblock23.cpp:0:0:22:0 | preprocblock23.cpp | | (no parent) | preprocblock.cpp:0:0:25:0 | preprocblock.cpp | | header.h | header.h:3:0:7:0 | #ifndef HEADER_H | +| preprocblock23.cpp | preprocblock23.cpp:7:0:7:0 | #ifdef RED | +| preprocblock23.cpp | preprocblock23.cpp:8:0:17:0 | #elifdef GREEN | +| preprocblock23.cpp | preprocblock23.cpp:18:0:21:0 | #else | | preprocblock.cpp | preprocblock.cpp:6:0:6:0 | #ifdef RED | | preprocblock.cpp | preprocblock.cpp:7:0:20:0 | #elif defined GREEN | | preprocblock.cpp | preprocblock.cpp:21:0:24:0 | #else | diff --git a/cpp/ql/test/library-tests/headers/preprocBlock/preprocblock23.cpp b/cpp/ql/test/library-tests/headers/preprocBlock/preprocblock23.cpp new file mode 100644 index 00000000000..710112711a1 --- /dev/null +++ b/cpp/ql/test/library-tests/headers/preprocBlock/preprocblock23.cpp @@ -0,0 +1,22 @@ +// preprocblock23.cpp +// semmle-extractor-options: -std=c++23 + +#include "header.h" +#define GREEN + +#ifdef RED +#elifdef GREEN + #include "header.h" + + #if 0 + #include "header.h" // not reached + #elifndef BLUE + #include "header.h" + #endif + + #include "header.h" +#else + + // ... + +#endif diff --git a/cpp/ql/test/library-tests/headers/preprocBlock/preprocinclude.expected b/cpp/ql/test/library-tests/headers/preprocBlock/preprocinclude.expected index 3b65b0a31df..d0c71f59f02 100644 --- a/cpp/ql/test/library-tests/headers/preprocBlock/preprocinclude.expected +++ b/cpp/ql/test/library-tests/headers/preprocBlock/preprocinclude.expected @@ -1,3 +1,7 @@ +| preprocblock23.cpp:4:1:4:19 | #include "header.h" | preprocblock23.cpp:0:0:22:0 | preprocblock23.cpp | +| preprocblock23.cpp:9:2:9:20 | #include "header.h" | preprocblock23.cpp:8:0:17:0 | #elifdef GREEN | +| preprocblock23.cpp:14:3:14:21 | #include "header.h" | preprocblock23.cpp:13:0:14:0 | #elifndef BLUE | +| preprocblock23.cpp:17:2:17:20 | #include "header.h" | preprocblock23.cpp:8:0:17:0 | #elifdef GREEN | | preprocblock.cpp:3:1:3:19 | #include "header.h" | preprocblock.cpp:0:0:25:0 | preprocblock.cpp | | preprocblock.cpp:8:2:8:20 | #include "header.h" | preprocblock.cpp:7:0:20:0 | #elif defined GREEN | | preprocblock.cpp:11:3:11:21 | #include "header.h" | preprocblock.cpp:10:0:11:0 | #ifndef BLUE |