diff --git a/python/ql/src/Imports/Cyclic.qll b/python/ql/src/Imports/Cyclic.qll index bcda354ed954..c550c163c667 100644 --- a/python/ql/src/Imports/Cyclic.qll +++ b/python/ql/src/Imports/Cyclic.qll @@ -21,7 +21,8 @@ predicate circular_import(ModuleValue m1, ModuleValue m2) { ModuleValue stmt_imports(ImportingStmt s) { exists(string name | result.importedAs(name) and not name = "__main__" | name = s.getAnImportedModuleName() and - s.getASubExpression().pointsTo(result) + s.getASubExpression().pointsTo(result) and + not result.isPackage() ) } diff --git a/python/ql/src/semmle/python/objects/ObjectAPI.qll b/python/ql/src/semmle/python/objects/ObjectAPI.qll index dd6b856875a9..3678c760ea2b 100644 --- a/python/ql/src/semmle/python/objects/ObjectAPI.qll +++ b/python/ql/src/semmle/python/objects/ObjectAPI.qll @@ -139,6 +139,11 @@ class ModuleValue extends Value { PointsToInternal::module_imported_as(this, name) } + /** Whether this module is a package. */ + predicate isPackage() { + this instanceof PackageObjectInternal + } + } module Module { diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/CyclicImport.expected b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/CyclicImport.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/CyclicImport.qlref b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/CyclicImport.qlref new file mode 100644 index 000000000000..814bba9fad6a --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/CyclicImport.qlref @@ -0,0 +1 @@ +Imports/CyclicImport.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/ModuleLevelCyclicImport.expected b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/ModuleLevelCyclicImport.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/ModuleLevelCyclicImport.qlref b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/ModuleLevelCyclicImport.qlref new file mode 100644 index 000000000000..5119f8fdaae2 --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/ModuleLevelCyclicImport.qlref @@ -0,0 +1 @@ +Imports/ModuleLevelCyclicImport.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/bar/__init__.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/bar/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/bar/foo.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/bar/foo.py new file mode 100644 index 000000000000..702712c61be5 --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/bar/foo.py @@ -0,0 +1,2 @@ +from package import p +foo = 5 diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/options b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/options new file mode 100644 index 000000000000..3819071b01cc --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/options @@ -0,0 +1 @@ +semmle-extractor-options: -R . diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/package/__init__.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/package/__init__.py new file mode 100644 index 000000000000..ccbe206d503c --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/package/__init__.py @@ -0,0 +1,3 @@ +from bar.foo import foo +from package import baz +p = 1 diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/package/baz.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/package/baz.py new file mode 100644 index 000000000000..fe6879840787 --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/package/baz.py @@ -0,0 +1,2 @@ +from package import p +from bar.foo import foo diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/test.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/test.py new file mode 100644 index 000000000000..7479d4678c2f --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/false-negative/test.py @@ -0,0 +1 @@ +from package import p diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/CyclicImport.expected b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/CyclicImport.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/CyclicImport.qlref b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/CyclicImport.qlref new file mode 100644 index 000000000000..814bba9fad6a --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/CyclicImport.qlref @@ -0,0 +1 @@ +Imports/CyclicImport.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/ModuleLevelCyclicImport.expected b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/ModuleLevelCyclicImport.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/ModuleLevelCyclicImport.qlref b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/ModuleLevelCyclicImport.qlref new file mode 100644 index 000000000000..5119f8fdaae2 --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/ModuleLevelCyclicImport.qlref @@ -0,0 +1 @@ +Imports/ModuleLevelCyclicImport.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/bar/__init__.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/bar/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/bar/foo.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/bar/foo.py new file mode 100644 index 000000000000..702712c61be5 --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/bar/foo.py @@ -0,0 +1,2 @@ +from package import p +foo = 5 diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/options b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/options new file mode 100644 index 000000000000..3819071b01cc --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/options @@ -0,0 +1 @@ +semmle-extractor-options: -R . diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/package/__init__.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/package/__init__.py new file mode 100644 index 000000000000..b3586a190cf8 --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/package/__init__.py @@ -0,0 +1,3 @@ +p = 1 +from bar.foo import foo +from package import baz diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/package/baz.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/package/baz.py new file mode 100644 index 000000000000..fe6879840787 --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/package/baz.py @@ -0,0 +1,2 @@ +from package import p +from bar.foo import foo diff --git a/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/test.py b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/test.py new file mode 100644 index 000000000000..7479d4678c2f --- /dev/null +++ b/python/ql/test/query-tests/Imports/cyclic-module-package-fp/true-negative/test.py @@ -0,0 +1 @@ +from package import p