diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index cdec3b9f543..ae9e6c19685 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -255,8 +255,10 @@ module Stdlib { */ module Logger { /** Gets a reference to the `logging.Logger` class or any subclass. */ - private API::Node subclassRef() { + API::Node subclassRef() { result = API::moduleImport("logging").getMember("Logger").getASubclass*() + or + result = ModelOutput::getATypeNode("logging.Logger~Subclass").getASubclass*() } /** diff --git a/python/ql/src/meta/ClassHierarchy/Find.ql b/python/ql/src/meta/ClassHierarchy/Find.ql index 18d75440032..df378bdee51 100644 --- a/python/ql/src/meta/ClassHierarchy/Find.ql +++ b/python/ql/src/meta/ClassHierarchy/Find.ql @@ -404,6 +404,12 @@ class Urllib3PoolManager extends FindSubclassesSpec { override API::Node getAlreadyModeledClass() { result = Urllib3::PoolManager::classRef() } } +class StdlibLogger extends FindSubclassesSpec { + StdlibLogger() { this = "logging.Logger~Subclass" } + + override API::Node getAlreadyModeledClass() { result = Stdlib::Logger::subclassRef() } +} + bindingset[fullyQualified] predicate fullyQualifiedToYamlFormat(string fullyQualified, string type2, string path) { exists(int firstDot | firstDot = fullyQualified.indexOf(".", 0, 0) |