From a32214d41e5811d6a26552034f1260145450bb1a Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Thu, 5 Sep 2019 15:37:46 +0100 Subject: [PATCH 1/2] C++: Resolve all classes We used to only resolve top-level classes. --- .../src/semmle/code/cpp/internal/ResolveClass.qll | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/internal/ResolveClass.qll b/cpp/ql/src/semmle/code/cpp/internal/ResolveClass.qll index 73d3cb6772e..564596e5d06 100644 --- a/cpp/ql/src/semmle/code/cpp/internal/ResolveClass.qll +++ b/cpp/ql/src/semmle/code/cpp/internal/ResolveClass.qll @@ -55,32 +55,29 @@ private predicate oldHasCompleteTwin(@usertype c, @usertype d) { } pragma[noinline] -private @mangledname getTopLevelClassMangledName(@usertype c) { +private @mangledname getClassMangledName(@usertype c) { isClass(c) and - mangled_name(c, result) and - not namespacembrs(_, c) and // not in a namespace - not member(_, _, c) and // not in some structure - not class_instantiation(c, _) // not a template instantiation + mangled_name(c, result) } /** Holds if `d` is a unique complete class named `name`. */ pragma[noinline] private predicate existsCompleteWithMangledName(@mangledname name, @usertype d) { is_complete(d) and - name = getTopLevelClassMangledName(d) and + name = getClassMangledName(d) and onlyOneCompleteClassExistsWithMangledName(name) } pragma[noinline] private predicate onlyOneCompleteClassExistsWithMangledName(@mangledname name) { - strictcount(@usertype c | is_complete(c) and getTopLevelClassMangledName(c) = name) = 1 + strictcount(@usertype c | is_complete(c) and getClassMangledName(c) = name) = 1 } /** Holds if `c` is an incomplete class named `name`. */ pragma[noinline] private predicate existsIncompleteWithMangledName(@mangledname name, @usertype c) { not is_complete(c) and - name = getTopLevelClassMangledName(c) + name = getClassMangledName(c) } /** From 4190a535748e3e6bc86819923dbe1cc75507316f Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Thu, 5 Sep 2019 16:14:55 +0100 Subject: [PATCH 2/2] C++: Update test output --- .../structs/qualified_names/pointerBaseType.expected | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/structs/qualified_names/pointerBaseType.expected b/cpp/ql/test/library-tests/structs/qualified_names/pointerBaseType.expected index 1573f1c446e..b5b2d6f4b73 100644 --- a/cpp/ql/test/library-tests/structs/qualified_names/pointerBaseType.expected +++ b/cpp/ql/test/library-tests/structs/qualified_names/pointerBaseType.expected @@ -1,4 +1,4 @@ -| decls.cpp:4:6:4:6 | x | decls.cpp:2:9:2:9 | C | +| decls.cpp:4:6:4:6 | x | defs.cpp:2:9:2:9 | C | | defs.cpp:18:21:18:38 | definedAndDeclared | defs.cpp:11:7:11:24 | DefinedAndDeclared | | defs.cpp:25:28:25:32 | mdbsh | header.h:1:8:1:32 | MultipleDefsButSameHeader | | defs.cpp:29:24:29:28 | odidf | c1.cpp:7:8:7:28 | OneDefInDifferentFile |