diff --git a/cpp/ql/lib/change-notes/2025-06-17-arraytype-typedefs.md b/cpp/ql/lib/change-notes/2025-06-17-arraytype-typedefs.md new file mode 100644 index 00000000000..0bc3130e6a3 --- /dev/null +++ b/cpp/ql/lib/change-notes/2025-06-17-arraytype-typedefs.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* `resolveTypedefs` now properly resolves typedefs for `ArrayType`s. diff --git a/cpp/ql/lib/semmle/code/cpp/Type.qll b/cpp/ql/lib/semmle/code/cpp/Type.qll index fef978b198d..3db3cd49e54 100644 --- a/cpp/ql/lib/semmle/code/cpp/Type.qll +++ b/cpp/ql/lib/semmle/code/cpp/Type.qll @@ -1589,6 +1589,11 @@ class ArrayType extends DerivedType { * Holds if this array is a variable-length array (VLA). */ predicate isVla() { type_is_vla(underlyingElement(this)) } + + override Type resolveTypedefs() { + result.(ArrayType).getBaseType() = this.getBaseType().resolveTypedefs() and + result.(ArrayType).getArraySize() = this.getArraySize() + } } /** diff --git a/cpp/ql/test/library-tests/resolve_typedefs/ArrayTypedefs.cpp b/cpp/ql/test/library-tests/resolve_typedefs/ArrayTypedefs.cpp new file mode 100644 index 00000000000..393ab4c7d9e --- /dev/null +++ b/cpp/ql/test/library-tests/resolve_typedefs/ArrayTypedefs.cpp @@ -0,0 +1,7 @@ +typedef int int_t; +int_t g1[10]; +int_t g2[2][4]; + +typedef float float_t; +float_t arr1[5]; +float_t (*a_pointer)[10]; diff --git a/cpp/ql/test/library-tests/resolve_typedefs/ArrayTypedefs.expected b/cpp/ql/test/library-tests/resolve_typedefs/ArrayTypedefs.expected new file mode 100644 index 00000000000..83e003b5bb1 --- /dev/null +++ b/cpp/ql/test/library-tests/resolve_typedefs/ArrayTypedefs.expected @@ -0,0 +1,5 @@ +| file://:0:0:0:0 | float_t[5] | file://:0:0:0:0 | float[5] | ArrayTypedefs.cpp:6:9:6:12 | definition of arr1 | +| file://:0:0:0:0 | float_t[10] | file://:0:0:0:0 | float[10] | ArrayTypedefs.cpp:7:11:7:19 | definition of a_pointer | +| file://:0:0:0:0 | int_t[2][4] | file://:0:0:0:0 | int[2][4] | ArrayTypedefs.cpp:3:7:3:8 | definition of g2 | +| file://:0:0:0:0 | int_t[4] | file://:0:0:0:0 | int[4] | ArrayTypedefs.cpp:3:7:3:8 | definition of g2 | +| file://:0:0:0:0 | int_t[10] | file://:0:0:0:0 | int[10] | ArrayTypedefs.cpp:2:7:2:8 | definition of g1 | diff --git a/cpp/ql/test/library-tests/resolve_typedefs/ArrayTypedefs.ql b/cpp/ql/test/library-tests/resolve_typedefs/ArrayTypedefs.ql new file mode 100644 index 00000000000..73ebe35d8ff --- /dev/null +++ b/cpp/ql/test/library-tests/resolve_typedefs/ArrayTypedefs.ql @@ -0,0 +1,4 @@ +import cpp + +from ArrayType type +select type, type.resolveTypedefs(), type.getATypeNameUse()