From c82f1fe4507c3e00daa6ba9f7ad9928c92972a63 Mon Sep 17 00:00:00 2001 From: Marcono1234 Date: Mon, 4 Apr 2022 02:39:28 +0200 Subject: [PATCH 1/3] Java: Add inheritance test --- .../inheritance/inhertiance.expected | 156 ++++++++++++++++++ .../library-tests/inheritance/inhertiance.ql | 16 ++ .../ql/test/library-tests/inheritance/options | 1 + .../package_a/FieldInheritanceA.java | 59 +++++++ .../package_a/FieldInheritanceOtherA.java | 7 + .../package_a/MemberTypeInheritanceA.java | 67 ++++++++ .../MemberTypeInheritanceOtherA.java | 7 + .../package_a/MethodInheritanceA.java | 119 +++++++++++++ .../package_a/MethodInheritanceOtherA.java | 4 + .../package_b/FieldInheritanceB.java | 6 + .../package_b/MemberTypeInheritanceB.java | 6 + .../package_b/MethodInheritanceB.java | 6 + 12 files changed, 454 insertions(+) create mode 100644 java/ql/test/library-tests/inheritance/inhertiance.expected create mode 100644 java/ql/test/library-tests/inheritance/inhertiance.ql create mode 100644 java/ql/test/library-tests/inheritance/options create mode 100644 java/ql/test/library-tests/inheritance/package_a/FieldInheritanceA.java create mode 100644 java/ql/test/library-tests/inheritance/package_a/FieldInheritanceOtherA.java create mode 100644 java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceA.java create mode 100644 java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceOtherA.java create mode 100644 java/ql/test/library-tests/inheritance/package_a/MethodInheritanceA.java create mode 100644 java/ql/test/library-tests/inheritance/package_a/MethodInheritanceOtherA.java create mode 100644 java/ql/test/library-tests/inheritance/package_b/FieldInheritanceB.java create mode 100644 java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceB.java create mode 100644 java/ql/test/library-tests/inheritance/package_b/MethodInheritanceB.java diff --git a/java/ql/test/library-tests/inheritance/inhertiance.expected b/java/ql/test/library-tests/inheritance/inhertiance.expected new file mode 100644 index 000000000000..135b35816d0f --- /dev/null +++ b/java/ql/test/library-tests/inheritance/inhertiance.expected @@ -0,0 +1,156 @@ +onlyInherited +| package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | package_a/FieldInheritanceA.java:25:13:25:19 | staticI | +| package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | package_a/FieldInheritanceA.java:28:13:28:19 | staticI | +| package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | package_a/FieldInheritanceA.java:31:20:31:20 | i | +| package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | package_a/FieldInheritanceA.java:32:27:32:33 | staticI | +| package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | package_a/FieldInheritanceA.java:40:27:40:27 | i | +| package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | package_a/FieldInheritanceA.java:41:20:41:26 | staticI | +| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:9:9:9:27 | packagePrivateField | +| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:10:16:10:40 | packagePrivateStaticField | +| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:12:19:12:32 | protectedField | +| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:13:26:13:45 | protectedStaticField | +| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:15:16:15:26 | publicField | +| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:16:23:16:39 | publicStaticField | +| package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | package_a/MemberTypeInheritanceA.java:58:36:58:36 | o | +| package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | package_a/MemberTypeInheritanceA.java:60:21:60:21 | m | +| package_a/MethodInheritanceA.java:48:23:48:40 | ExtendingInterface | package_a/MethodInheritanceA.java:45:22:45:22 | d | +| package_a/MethodInheritanceA.java:48:23:48:40 | ExtendingInterface | package_a/MethodInheritanceA.java:46:14:46:14 | a | +| package_a/MethodInheritanceA.java:53:23:53:50 | ExtendingInterfaceWithPublic | package_a/MethodInheritanceA.java:51:14:51:14 | m | +| package_a/MethodInheritanceA.java:68:28:68:53 | AbstractInheritingClashing | package_a/MethodInheritanceA.java:64:30:64:30 | m | +| package_a/MethodInheritanceA.java:71:19:71:36 | InheritingClashing | package_a/MethodInheritanceA.java:61:21:61:21 | m | +| package_a/MethodInheritanceA.java:77:23:77:46 | ExtendingMulitpleMethods | package_a/MethodInheritanceA.java:75:14:75:14 | m | +| package_a/MethodInheritanceA.java:96:26:96:40 | BaseAndOverride | package_a/MethodInheritanceA.java:91:22:91:22 | m | +| package_a/MethodInheritanceA.java:98:23:98:45 | ExtendingOverridingBase | package_a/MethodInheritanceA.java:91:22:91:22 | m | +| package_a/MethodInheritanceA.java:106:26:106:49 | BaseAndExtendingOverride | package_a/MethodInheritanceA.java:91:22:91:22 | m | +| package_a/MethodInheritanceA.java:114:19:114:32 | InheritingBoth | package_a/MethodInheritanceA.java:109:21:109:21 | m | +| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:9:9:9:27 | packagePrivateField | +| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:10:16:10:40 | packagePrivateStaticField | +| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:12:19:12:32 | protectedField | +| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:13:26:13:45 | protectedStaticField | +| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:15:16:15:26 | publicField | +| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:16:23:16:39 | publicStaticField | +| package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:17:20:17:34 | protectedMethod | +| package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:18:27:18:47 | protectedStaticMethod | +| package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:20:17:20:28 | publicMethod | +| package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:21:24:21:41 | publicStaticMethod | +bugDeclaredButNotInherited +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:18:26:18:41 | ClassWithPrivate | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:22:19:22:43 | ExtendingClassWithPrivate | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:24:23:24:41 | InterfaceWithPublic | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:27:23:27:46 | OtherInterfaceWithPublic | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:30:26:30:40 | ClassWithPublic | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:38:26:38:36 | HidingField | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:44:26:44:46 | HidingTransitiveField | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:49:26:49:48 | HidingWithDifferentType | +| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:55:18:55:35 | PrivateHidingField | +| package_a/FieldInheritanceA.java:18:26:18:41 | ClassWithPrivate | package_a/FieldInheritanceA.java:18:26:18:41 | ClassWithPrivate | +| package_a/FieldInheritanceA.java:22:19:22:43 | ExtendingClassWithPrivate | package_a/FieldInheritanceA.java:22:19:22:43 | ExtendingClassWithPrivate | +| package_a/FieldInheritanceA.java:30:26:30:40 | ClassWithPublic | package_a/FieldInheritanceA.java:30:26:30:40 | ClassWithPublic | +| package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | +| package_a/FieldInheritanceA.java:38:26:38:36 | HidingField | package_a/FieldInheritanceA.java:38:26:38:36 | HidingField | +| package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | +| package_a/FieldInheritanceA.java:44:26:44:46 | HidingTransitiveField | package_a/FieldInheritanceA.java:44:26:44:46 | HidingTransitiveField | +| package_a/FieldInheritanceA.java:49:26:49:48 | HidingWithDifferentType | package_a/FieldInheritanceA.java:49:26:49:48 | HidingWithDifferentType | +| package_a/FieldInheritanceA.java:55:18:55:35 | PrivateHidingField | package_a/FieldInheritanceA.java:55:18:55:35 | PrivateHidingField | +| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | +| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceOtherA.java:6:11:6:37 | ExtendingPrivateHidingField | +| package_a/FieldInheritanceOtherA.java:6:11:6:37 | ExtendingPrivateHidingField | package_a/FieldInheritanceOtherA.java:6:11:6:37 | ExtendingPrivateHidingField | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:6:19:6:30 | PrivateClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:9:19:9:39 | ExtendingPrivateClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:11:23:11:38 | PrivateInterface | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:13:11:13:29 | PackagePrivateClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:14:15:14:37 | PackagePrivateInterface | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:17:25:17:42 | ProtectedInterface | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:25:22:25:45 | ExtendingPublicInterface | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:26:22:26:54 | ExtendingExtendingPublicInterface | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:29:23:29:36 | OtherInterface | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:32:26:32:35 | OtherClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:38:23:38:39 | HidingNestedClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:41:23:41:48 | ExtendingHidingNestedClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:42:23:42:49 | HidingTransitiveNestedClass | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:51:19:51:32 | WithLocalTypes | +| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | +| package_a/MemberTypeInheritanceA.java:6:19:6:30 | PrivateClass | package_a/MemberTypeInheritanceA.java:6:19:6:30 | PrivateClass | +| package_a/MemberTypeInheritanceA.java:6:19:6:30 | PrivateClass | package_a/MemberTypeInheritanceA.java:7:23:7:28 | Nested | +| package_a/MemberTypeInheritanceA.java:7:23:7:28 | Nested | package_a/MemberTypeInheritanceA.java:7:23:7:28 | Nested | +| package_a/MemberTypeInheritanceA.java:9:19:9:39 | ExtendingPrivateClass | package_a/MemberTypeInheritanceA.java:9:19:9:39 | ExtendingPrivateClass | +| package_a/MemberTypeInheritanceA.java:13:11:13:29 | PackagePrivateClass | package_a/MemberTypeInheritanceA.java:13:11:13:29 | PackagePrivateClass | +| package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | +| package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | +| package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | +| package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | +| package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | +| package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | +| package_a/MemberTypeInheritanceA.java:29:23:29:36 | OtherInterface | package_a/MemberTypeInheritanceA.java:30:29:30:34 | Nested | +| package_a/MemberTypeInheritanceA.java:30:29:30:34 | Nested | package_a/MemberTypeInheritanceA.java:30:29:30:34 | Nested | +| package_a/MemberTypeInheritanceA.java:32:26:32:35 | OtherClass | package_a/MemberTypeInheritanceA.java:32:26:32:35 | OtherClass | +| package_a/MemberTypeInheritanceA.java:32:26:32:35 | OtherClass | package_a/MemberTypeInheritanceA.java:33:29:33:34 | Nested | +| package_a/MemberTypeInheritanceA.java:33:29:33:34 | Nested | package_a/MemberTypeInheritanceA.java:33:29:33:34 | Nested | +| package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | +| package_a/MemberTypeInheritanceA.java:38:23:38:39 | HidingNestedClass | package_a/MemberTypeInheritanceA.java:39:26:39:31 | Nested | +| package_a/MemberTypeInheritanceA.java:42:23:42:49 | HidingTransitiveNestedClass | package_a/MemberTypeInheritanceA.java:43:26:43:31 | Nested | +| package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | +| package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | package_a/MemberTypeInheritanceA.java:48:27:48:32 | Nested | +| package_a/MemberTypeInheritanceA.java:51:19:51:32 | WithLocalTypes | package_a/MemberTypeInheritanceA.java:51:19:51:32 | WithLocalTypes | +| package_a/MemberTypeInheritanceA.java:55:19:55:28 | LocalClass | package_a/MemberTypeInheritanceA.java:55:19:55:28 | LocalClass | +| package_a/MemberTypeInheritanceA.java:58:44:58:49 | new Object(...) { ... } | package_a/MemberTypeInheritanceA.java:58:44:58:49 | | +| package_a/MemberTypeInheritanceA.java:61:19:61:28 | LocalClass | package_a/MemberTypeInheritanceA.java:61:19:61:28 | LocalClass | +| package_a/MemberTypeInheritanceA.java:63:20:63:30 | LocalRecord | package_a/MemberTypeInheritanceA.java:63:20:63:30 | LocalRecord | +| package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceOtherA.java:6:26:6:61 | ExtendendingHidingNestedClassPrivate | +| package_a/MemberTypeInheritanceOtherA.java:6:26:6:61 | ExtendendingHidingNestedClassPrivate | package_a/MemberTypeInheritanceOtherA.java:6:26:6:61 | ExtendendingHidingNestedClassPrivate | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:9:12:9:29 | MethodInheritanceA | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:23:26:23:41 | ClassWithPrivate | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:34:26:34:50 | ExtendingClassWithPrivate | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:36:23:36:42 | InterfaceWithPrivate | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:41:23:41:51 | ExtendingInterfaceWithPrivate | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:42:19:42:50 | ImplementingInterfaceWithPrivate | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:44:23:44:31 | Interface | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:48:23:48:40 | ExtendingInterface | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:50:23:50:41 | InterfaceWithPublic | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:53:23:53:50 | ExtendingInterfaceWithPublic | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:54:23:54:46 | OtherInterfaceWithPublic | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:57:23:57:42 | InterfaceWithDefault | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:60:26:60:40 | ClassWithPublic | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:63:35:63:57 | AbstractClassWithPublic | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:68:28:68:53 | AbstractInheritingClashing | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:71:19:71:36 | InheritingClashing | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:73:23:73:37 | MulitpleMethods | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:77:23:77:46 | ExtendingMulitpleMethods | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:84:23:84:26 | Base | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:89:23:89:36 | OverridingBase | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:96:26:96:40 | BaseAndOverride | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:98:23:98:45 | ExtendingOverridingBase | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:106:26:106:49 | BaseAndExtendingOverride | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:108:19:108:30 | ClassWithRaw | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:111:23:111:42 | InterfaceWithGeneric | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:114:19:114:32 | InheritingBoth | +| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:115:19:115:32 | OverridingBoth | +| package_a/MethodInheritanceA.java:23:26:23:41 | ClassWithPrivate | package_a/MethodInheritanceA.java:23:26:23:41 | ClassWithPrivate | +| package_a/MethodInheritanceA.java:34:26:34:50 | ExtendingClassWithPrivate | package_a/MethodInheritanceA.java:34:26:34:50 | ExtendingClassWithPrivate | +| package_a/MethodInheritanceA.java:42:19:42:50 | ImplementingInterfaceWithPrivate | package_a/MethodInheritanceA.java:42:19:42:50 | ImplementingInterfaceWithPrivate | +| package_a/MethodInheritanceA.java:60:26:60:40 | ClassWithPublic | package_a/MethodInheritanceA.java:60:26:60:40 | ClassWithPublic | +| package_a/MethodInheritanceA.java:63:35:63:57 | AbstractClassWithPublic | package_a/MethodInheritanceA.java:63:35:63:57 | AbstractClassWithPublic | +| package_a/MethodInheritanceA.java:68:28:68:53 | AbstractInheritingClashing | package_a/MethodInheritanceA.java:68:28:68:53 | AbstractInheritingClashing | +| package_a/MethodInheritanceA.java:71:19:71:36 | InheritingClashing | package_a/MethodInheritanceA.java:71:19:71:36 | InheritingClashing | +| package_a/MethodInheritanceA.java:96:26:96:40 | BaseAndOverride | package_a/MethodInheritanceA.java:96:26:96:40 | BaseAndOverride | +| package_a/MethodInheritanceA.java:106:26:106:49 | BaseAndExtendingOverride | package_a/MethodInheritanceA.java:106:26:106:49 | BaseAndExtendingOverride | +| package_a/MethodInheritanceA.java:108:19:108:30 | ClassWithRaw | package_a/MethodInheritanceA.java:108:19:108:30 | ClassWithRaw | +| package_a/MethodInheritanceA.java:114:19:114:32 | InheritingBoth | package_a/MethodInheritanceA.java:114:19:114:32 | InheritingBoth | +| package_a/MethodInheritanceA.java:115:19:115:32 | OverridingBoth | package_a/MethodInheritanceA.java:115:19:115:32 | OverridingBoth | +| package_a/MethodInheritanceOtherA.java:3:14:3:36 | MethodInheritanceOtherA | package_a/MethodInheritanceOtherA.java:3:14:3:36 | MethodInheritanceOtherA | +| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | +| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | +| package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | diff --git a/java/ql/test/library-tests/inheritance/inhertiance.ql b/java/ql/test/library-tests/inheritance/inhertiance.ql new file mode 100644 index 000000000000..5f96b3a2612c --- /dev/null +++ b/java/ql/test/library-tests/inheritance/inhertiance.ql @@ -0,0 +1,16 @@ +import java + +query Member onlyInherited(RefType t) { + t.fromSource() and + t.inherits(result) and + not result.getDeclaringType() instanceof TypeObject and + // Ignore declared members; query predicate below verifies that they are a subset + not result.getDeclaringType() = t +} + +/** Verify that declared members are a subset of inherited members */ +query Member bugDeclaredButNotInherited(RefType t) { + t.fromSource() and + result.getDeclaringType() = t and + not t.inherits(result) +} diff --git a/java/ql/test/library-tests/inheritance/options b/java/ql/test/library-tests/inheritance/options new file mode 100644 index 000000000000..fc57fe025b9a --- /dev/null +++ b/java/ql/test/library-tests/inheritance/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -source 16 -target 16 diff --git a/java/ql/test/library-tests/inheritance/package_a/FieldInheritanceA.java b/java/ql/test/library-tests/inheritance/package_a/FieldInheritanceA.java new file mode 100644 index 000000000000..143192e513ee --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_a/FieldInheritanceA.java @@ -0,0 +1,59 @@ +// See https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#jls-8.3 + +package package_a; + +public class FieldInheritanceA { + private int privateField; + private static int privateStaticField; + + int packagePrivateField; + static int packagePrivateStaticField; + + protected int protectedField; + protected static int protectedStaticField; + + public int publicField; + public static int publicStaticField; + + private static class ClassWithPrivate { + private int i; + private static int staticI; + } + private class ExtendingClassWithPrivate extends ClassWithPrivate {} + + private interface InterfaceWithPublic { + int staticI = 1; + } + private interface OtherInterfaceWithPublic { + int staticI = 1; + } + private static class ClassWithPublic { + public int i; + public static int staticI; + } + + // Should inherit all fields called staticI + private class InheritingClashing extends ClassWithPublic implements InterfaceWithPublic, OtherInterfaceWithPublic {} + + private static class HidingField extends ClassWithPublic { + // Whether fields are static or not does not make a difference + public static int i; + public int staticI; + } + private static class ExtendingHidingField extends HidingField {} + private static class HidingTransitiveField extends ExtendingHidingField { + public int i; + public static int staticI; + } + + private static class HidingWithDifferentType extends ClassWithPublic { + private String i; + private static String staticI; + } + + // Has subclass in FieldInheritanceOtherA + static class PrivateHidingField extends ClassWithPublic { + private String i; + private static String staticI; + } +} diff --git a/java/ql/test/library-tests/inheritance/package_a/FieldInheritanceOtherA.java b/java/ql/test/library-tests/inheritance/package_a/FieldInheritanceOtherA.java new file mode 100644 index 000000000000..4aa675a5f7bc --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_a/FieldInheritanceOtherA.java @@ -0,0 +1,7 @@ +package package_a; + +public class FieldInheritanceOtherA extends FieldInheritanceA { + // Cannot inheriting original fields, due to fields in PrivateHidingField + // even though they are not accessible here + class ExtendingPrivateHidingField extends PrivateHidingField {} +} diff --git a/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceA.java b/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceA.java new file mode 100644 index 000000000000..b9bf7030cc44 --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceA.java @@ -0,0 +1,67 @@ +// See https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#jls-8.5 + +package package_a; + +public class MemberTypeInheritanceA { + private class PrivateClass { + private class Nested {} + } + private class ExtendingPrivateClass extends PrivateClass {} + + private interface PrivateInterface {} + + class PackagePrivateClass {} + interface PackagePrivateInterface {} + + protected class ProtectedClass {} + protected interface ProtectedInterface {} + + public class PublicClass {} + public static class PublicStaticClass {} + public interface PublicInterface { + public static class Nested {} + } + + public interface ExtendingPublicInterface extends PublicInterface {} + public interface ExtendingExtendingPublicInterface extends ExtendingPublicInterface {} + public class ImplementingPublicInterface implements PublicInterface {} + + private interface OtherInterface { + public static class Nested {} + } + private static class OtherClass { + public static class Nested {} + } + // Should inherit all classes called Nested + private static class InheritingClashing extends OtherClass implements PublicInterface, OtherInterface {} + + private interface HidingNestedClass extends OtherInterface { + public interface Nested {} + } + private interface ExtendingHidingNestedClass extends HidingNestedClass {} + private interface HidingTransitiveNestedClass extends ExtendingPublicInterface { + public interface Nested {} + } + + // Has subclass in MemberTypeInheritanceOtherA + static class HidingNestedClassPrivate implements OtherInterface { + private interface Nested {} + } + + private class WithLocalTypes { + // Local and anonymous types are not inherited + + { + class LocalClass {} + } + + public static final Object o = new Object() {}; + + public void m() { + class LocalClass {} + interface LocalInterface {} + record LocalRecord() {} + } + } + private class ExtendingWithLocalTypes extends WithLocalTypes {} +} diff --git a/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceOtherA.java b/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceOtherA.java new file mode 100644 index 000000000000..8dba7058eccc --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceOtherA.java @@ -0,0 +1,7 @@ +package package_a; + +public class MemberTypeInheritanceOtherA extends MemberTypeInheritanceA { + // Cannot inheriting original class, due to class in HidingNestedClassPrivate + // even though it is not accessible here + private static class ExtendendingHidingNestedClassPrivate extends HidingNestedClassPrivate {} +} diff --git a/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceA.java b/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceA.java new file mode 100644 index 000000000000..e4fd93d4d2fe --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceA.java @@ -0,0 +1,119 @@ +// See https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#jls-8.4.8 + +package package_a; + +import java.util.List; + +public class MethodInheritanceA { + // Constructor is not inherited + public MethodInheritanceA() {} + + private void privateMethod() {} + private static void privateStaticMethod() {} + + void packagePrivateMethod() {} + static void packagePrivateStaticMethod() {} + + protected void protectedMethod() {} + protected static void protectedStaticMethod() {} + + public void publicMethod() {} + public static void publicStaticMethod() {} + + private static class ClassWithPrivate { + // Initializer are not inherited + { + System.out.println("init"); + } + static { + System.out.println("static init"); + } + + private void m() {} + } + private static class ExtendingClassWithPrivate extends ClassWithPrivate {} + + private interface InterfaceWithPrivate { + private void m() {} + private static void staticM() {} + public static void publicStaticM() {} + } + private interface ExtendingInterfaceWithPrivate extends InterfaceWithPrivate {} + private class ImplementingInterfaceWithPrivate implements InterfaceWithPrivate {} + + private interface Interface { + default void d() {} + void a(); + } + private interface ExtendingInterface extends Interface {} + + private interface InterfaceWithPublic { + void m(); + } + private interface ExtendingInterfaceWithPublic extends InterfaceWithPublic {} + private interface OtherInterfaceWithPublic { + void m(); + } + private interface InterfaceWithDefault { + default void m() {} + } + private static class ClassWithPublic { + public void m() {} + } + private static abstract class AbstractClassWithPublic { + public abstract void m(); + } + + // Should inherit all methods called m() + private abstract class AbstractInheritingClashing extends AbstractClassWithPublic implements InterfaceWithPublic, OtherInterfaceWithPublic, InterfaceWithDefault {} + + // Should only inherit m() from ClassWithPublic + private class InheritingClashing extends ClassWithPublic implements InterfaceWithPublic, OtherInterfaceWithPublic, InterfaceWithDefault {} + + private interface MulitpleMethods { + void m(int i); + void m(Integer i); + } + private interface ExtendingMulitpleMethods extends MulitpleMethods { + @Override + void m(int i); + + // Other method should still be inherited + } + + private interface Base { + default void m() { + System.out.println("base"); + } + } + private interface OverridingBase extends Base { + @Override + default void m() { + System.out.println("overridden"); + } + } + + private static class BaseAndOverride implements OverridingBase, Base {} + + private interface ExtendingOverridingBase extends OverridingBase {} + /* + * JLS is imprecise here, it currently says: + * > There exists no method m' that is a member of the direct superclass type or a direct superinterface type of C + * + * Based on how this code currently behaves it should be "that is a **declared or inherited** member"; otherwise + * if one does not consider inherited members, in this case one might expect that Base.m() is used when calling m() + */ + private static class BaseAndExtendingOverride implements ExtendingOverridingBase, Base {} + + private class ClassWithRaw { + public void m(List raw) {} + } + private interface InterfaceWithGeneric { + void m(List l); + } + private class InheritingBoth extends ClassWithRaw implements InterfaceWithGeneric {} + private class OverridingBoth extends ClassWithRaw implements InterfaceWithGeneric { + @Override + public void m(List raw) {} + } +} diff --git a/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceOtherA.java b/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceOtherA.java new file mode 100644 index 000000000000..2867439b1114 --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceOtherA.java @@ -0,0 +1,4 @@ +package package_a; + +public class MethodInheritanceOtherA { +} diff --git a/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceB.java b/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceB.java new file mode 100644 index 000000000000..a09bfb9dd618 --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceB.java @@ -0,0 +1,6 @@ +package package_b; + +import package_a.FieldInheritanceA; + +class FieldInheritanceB extends FieldInheritanceA { +} diff --git a/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceB.java b/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceB.java new file mode 100644 index 000000000000..97a5210c3aa6 --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceB.java @@ -0,0 +1,6 @@ +package package_b; + +import package_a.MemberTypeInheritanceA; + +class MemberTypeInheritanceB extends MemberTypeInheritanceA { +} diff --git a/java/ql/test/library-tests/inheritance/package_b/MethodInheritanceB.java b/java/ql/test/library-tests/inheritance/package_b/MethodInheritanceB.java new file mode 100644 index 000000000000..8fcc43a7108e --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_b/MethodInheritanceB.java @@ -0,0 +1,6 @@ +package package_b; + +import package_a.MethodInheritanceA; + +public class MethodInheritanceB extends MethodInheritanceA { +} From 9099b7fde97c69cec5379007ffe24bdf939b6375 Mon Sep 17 00:00:00 2001 From: Marcono1234 Date: Mon, 4 Apr 2022 10:22:30 +0200 Subject: [PATCH 2/3] Java: Consider constructors and member types as inherited --- java/ql/lib/semmle/code/java/Type.qll | 20 +++ .../inheritance/inhertiance.expected | 147 ++++-------------- 2 files changed, 47 insertions(+), 120 deletions(-) diff --git a/java/ql/lib/semmle/code/java/Type.qll b/java/ql/lib/semmle/code/java/Type.qll index a6977e954e14..3130de3765b5 100755 --- a/java/ql/lib/semmle/code/java/Type.qll +++ b/java/ql/lib/semmle/code/java/Type.qll @@ -574,6 +574,26 @@ class RefType extends Type, Annotatable, Modifiable, @reftype { ) or this.hasMethod(m, _) + or + // Constructors are not inherited, but this predicate also considers declared members + m.(Constructor).getDeclaringType() = this.getSourceDeclaration() + or + m.(MemberType).getDeclaringType() = this.getSourceDeclaration() + or + // Or inherits member type + exists(RefType declaringType, MemberType memberType | + declaringType = this.getSourceDeclaration().getASourceSupertype+() and + memberType = m and + memberType.getDeclaringType() = declaringType and + not memberType.isPrivate() and + (memberType.isPackageProtected() implies memberType.getPackage() = this.getPackage()) and + // And member type is not hidden by another member type with the same name (regardless of visibility) + not exists(RefType hidingType | + hidingType = this.getSourceDeclaration().getASourceSupertype*() and + hidingType.getASourceSupertype+() = declaringType and + hidingType.getAMember().(MemberType).getName() = memberType.getName() + ) + ) } /** Holds if this is a top-level type, which is not nested inside any other types. */ diff --git a/java/ql/test/library-tests/inheritance/inhertiance.expected b/java/ql/test/library-tests/inheritance/inhertiance.expected index 135b35816d0f..88e66e8b67e1 100644 --- a/java/ql/test/library-tests/inheritance/inhertiance.expected +++ b/java/ql/test/library-tests/inheritance/inhertiance.expected @@ -11,8 +11,27 @@ onlyInherited | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:13:26:13:45 | protectedStaticField | | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:15:16:15:26 | publicField | | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:16:23:16:39 | publicStaticField | +| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:55:18:55:35 | PrivateHidingField | +| package_a/MemberTypeInheritanceA.java:25:22:25:45 | ExtendingPublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | +| package_a/MemberTypeInheritanceA.java:26:22:26:54 | ExtendingExtendingPublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | +| package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | +| package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | +| package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | package_a/MemberTypeInheritanceA.java:30:29:30:34 | Nested | +| package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | package_a/MemberTypeInheritanceA.java:33:29:33:34 | Nested | +| package_a/MemberTypeInheritanceA.java:41:23:41:48 | ExtendingHidingNestedClass | package_a/MemberTypeInheritanceA.java:39:26:39:31 | Nested | | package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | package_a/MemberTypeInheritanceA.java:58:36:58:36 | o | | package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | package_a/MemberTypeInheritanceA.java:60:21:60:21 | m | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:13:11:13:29 | PackagePrivateClass | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:14:15:14:37 | PackagePrivateInterface | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:17:25:17:42 | ProtectedInterface | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:25:22:25:45 | ExtendingPublicInterface | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:26:22:26:54 | ExtendingExtendingPublicInterface | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | +| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | | package_a/MethodInheritanceA.java:48:23:48:40 | ExtendingInterface | package_a/MethodInheritanceA.java:45:22:45:22 | d | | package_a/MethodInheritanceA.java:48:23:48:40 | ExtendingInterface | package_a/MethodInheritanceA.java:46:14:46:14 | a | | package_a/MethodInheritanceA.java:53:23:53:50 | ExtendingInterfaceWithPublic | package_a/MethodInheritanceA.java:51:14:51:14 | m | @@ -29,128 +48,16 @@ onlyInherited | package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:13:26:13:45 | protectedStaticField | | package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:15:16:15:26 | publicField | | package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:16:23:16:39 | publicStaticField | +| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | +| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:17:25:17:42 | ProtectedInterface | +| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | +| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | +| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | +| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:25:22:25:45 | ExtendingPublicInterface | +| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:26:22:26:54 | ExtendingExtendingPublicInterface | +| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:17:20:17:34 | protectedMethod | | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:18:27:18:47 | protectedStaticMethod | | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:20:17:20:28 | publicMethod | | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:21:24:21:41 | publicStaticMethod | bugDeclaredButNotInherited -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:18:26:18:41 | ClassWithPrivate | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:22:19:22:43 | ExtendingClassWithPrivate | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:24:23:24:41 | InterfaceWithPublic | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:27:23:27:46 | OtherInterfaceWithPublic | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:30:26:30:40 | ClassWithPublic | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:38:26:38:36 | HidingField | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:44:26:44:46 | HidingTransitiveField | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:49:26:49:48 | HidingWithDifferentType | -| package_a/FieldInheritanceA.java:5:14:5:30 | FieldInheritanceA | package_a/FieldInheritanceA.java:55:18:55:35 | PrivateHidingField | -| package_a/FieldInheritanceA.java:18:26:18:41 | ClassWithPrivate | package_a/FieldInheritanceA.java:18:26:18:41 | ClassWithPrivate | -| package_a/FieldInheritanceA.java:22:19:22:43 | ExtendingClassWithPrivate | package_a/FieldInheritanceA.java:22:19:22:43 | ExtendingClassWithPrivate | -| package_a/FieldInheritanceA.java:30:26:30:40 | ClassWithPublic | package_a/FieldInheritanceA.java:30:26:30:40 | ClassWithPublic | -| package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | -| package_a/FieldInheritanceA.java:38:26:38:36 | HidingField | package_a/FieldInheritanceA.java:38:26:38:36 | HidingField | -| package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | -| package_a/FieldInheritanceA.java:44:26:44:46 | HidingTransitiveField | package_a/FieldInheritanceA.java:44:26:44:46 | HidingTransitiveField | -| package_a/FieldInheritanceA.java:49:26:49:48 | HidingWithDifferentType | package_a/FieldInheritanceA.java:49:26:49:48 | HidingWithDifferentType | -| package_a/FieldInheritanceA.java:55:18:55:35 | PrivateHidingField | package_a/FieldInheritanceA.java:55:18:55:35 | PrivateHidingField | -| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | -| package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceOtherA.java:6:11:6:37 | ExtendingPrivateHidingField | -| package_a/FieldInheritanceOtherA.java:6:11:6:37 | ExtendingPrivateHidingField | package_a/FieldInheritanceOtherA.java:6:11:6:37 | ExtendingPrivateHidingField | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:6:19:6:30 | PrivateClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:9:19:9:39 | ExtendingPrivateClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:11:23:11:38 | PrivateInterface | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:13:11:13:29 | PackagePrivateClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:14:15:14:37 | PackagePrivateInterface | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:17:25:17:42 | ProtectedInterface | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:25:22:25:45 | ExtendingPublicInterface | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:26:22:26:54 | ExtendingExtendingPublicInterface | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:29:23:29:36 | OtherInterface | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:32:26:32:35 | OtherClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:38:23:38:39 | HidingNestedClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:41:23:41:48 | ExtendingHidingNestedClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:42:23:42:49 | HidingTransitiveNestedClass | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:51:19:51:32 | WithLocalTypes | -| package_a/MemberTypeInheritanceA.java:5:14:5:35 | MemberTypeInheritanceA | package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | -| package_a/MemberTypeInheritanceA.java:6:19:6:30 | PrivateClass | package_a/MemberTypeInheritanceA.java:6:19:6:30 | PrivateClass | -| package_a/MemberTypeInheritanceA.java:6:19:6:30 | PrivateClass | package_a/MemberTypeInheritanceA.java:7:23:7:28 | Nested | -| package_a/MemberTypeInheritanceA.java:7:23:7:28 | Nested | package_a/MemberTypeInheritanceA.java:7:23:7:28 | Nested | -| package_a/MemberTypeInheritanceA.java:9:19:9:39 | ExtendingPrivateClass | package_a/MemberTypeInheritanceA.java:9:19:9:39 | ExtendingPrivateClass | -| package_a/MemberTypeInheritanceA.java:13:11:13:29 | PackagePrivateClass | package_a/MemberTypeInheritanceA.java:13:11:13:29 | PackagePrivateClass | -| package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | -| package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | -| package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | -| package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | -| package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | -| package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | -| package_a/MemberTypeInheritanceA.java:29:23:29:36 | OtherInterface | package_a/MemberTypeInheritanceA.java:30:29:30:34 | Nested | -| package_a/MemberTypeInheritanceA.java:30:29:30:34 | Nested | package_a/MemberTypeInheritanceA.java:30:29:30:34 | Nested | -| package_a/MemberTypeInheritanceA.java:32:26:32:35 | OtherClass | package_a/MemberTypeInheritanceA.java:32:26:32:35 | OtherClass | -| package_a/MemberTypeInheritanceA.java:32:26:32:35 | OtherClass | package_a/MemberTypeInheritanceA.java:33:29:33:34 | Nested | -| package_a/MemberTypeInheritanceA.java:33:29:33:34 | Nested | package_a/MemberTypeInheritanceA.java:33:29:33:34 | Nested | -| package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | -| package_a/MemberTypeInheritanceA.java:38:23:38:39 | HidingNestedClass | package_a/MemberTypeInheritanceA.java:39:26:39:31 | Nested | -| package_a/MemberTypeInheritanceA.java:42:23:42:49 | HidingTransitiveNestedClass | package_a/MemberTypeInheritanceA.java:43:26:43:31 | Nested | -| package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | -| package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | package_a/MemberTypeInheritanceA.java:48:27:48:32 | Nested | -| package_a/MemberTypeInheritanceA.java:51:19:51:32 | WithLocalTypes | package_a/MemberTypeInheritanceA.java:51:19:51:32 | WithLocalTypes | -| package_a/MemberTypeInheritanceA.java:55:19:55:28 | LocalClass | package_a/MemberTypeInheritanceA.java:55:19:55:28 | LocalClass | -| package_a/MemberTypeInheritanceA.java:58:44:58:49 | new Object(...) { ... } | package_a/MemberTypeInheritanceA.java:58:44:58:49 | | -| package_a/MemberTypeInheritanceA.java:61:19:61:28 | LocalClass | package_a/MemberTypeInheritanceA.java:61:19:61:28 | LocalClass | -| package_a/MemberTypeInheritanceA.java:63:20:63:30 | LocalRecord | package_a/MemberTypeInheritanceA.java:63:20:63:30 | LocalRecord | -| package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | -| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | -| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceOtherA.java:6:26:6:61 | ExtendendingHidingNestedClassPrivate | -| package_a/MemberTypeInheritanceOtherA.java:6:26:6:61 | ExtendendingHidingNestedClassPrivate | package_a/MemberTypeInheritanceOtherA.java:6:26:6:61 | ExtendendingHidingNestedClassPrivate | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:9:12:9:29 | MethodInheritanceA | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:23:26:23:41 | ClassWithPrivate | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:34:26:34:50 | ExtendingClassWithPrivate | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:36:23:36:42 | InterfaceWithPrivate | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:41:23:41:51 | ExtendingInterfaceWithPrivate | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:42:19:42:50 | ImplementingInterfaceWithPrivate | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:44:23:44:31 | Interface | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:48:23:48:40 | ExtendingInterface | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:50:23:50:41 | InterfaceWithPublic | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:53:23:53:50 | ExtendingInterfaceWithPublic | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:54:23:54:46 | OtherInterfaceWithPublic | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:57:23:57:42 | InterfaceWithDefault | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:60:26:60:40 | ClassWithPublic | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:63:35:63:57 | AbstractClassWithPublic | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:68:28:68:53 | AbstractInheritingClashing | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:71:19:71:36 | InheritingClashing | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:73:23:73:37 | MulitpleMethods | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:77:23:77:46 | ExtendingMulitpleMethods | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:84:23:84:26 | Base | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:89:23:89:36 | OverridingBase | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:96:26:96:40 | BaseAndOverride | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:98:23:98:45 | ExtendingOverridingBase | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:106:26:106:49 | BaseAndExtendingOverride | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:108:19:108:30 | ClassWithRaw | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:111:23:111:42 | InterfaceWithGeneric | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:114:19:114:32 | InheritingBoth | -| package_a/MethodInheritanceA.java:7:14:7:31 | MethodInheritanceA | package_a/MethodInheritanceA.java:115:19:115:32 | OverridingBoth | -| package_a/MethodInheritanceA.java:23:26:23:41 | ClassWithPrivate | package_a/MethodInheritanceA.java:23:26:23:41 | ClassWithPrivate | -| package_a/MethodInheritanceA.java:34:26:34:50 | ExtendingClassWithPrivate | package_a/MethodInheritanceA.java:34:26:34:50 | ExtendingClassWithPrivate | -| package_a/MethodInheritanceA.java:42:19:42:50 | ImplementingInterfaceWithPrivate | package_a/MethodInheritanceA.java:42:19:42:50 | ImplementingInterfaceWithPrivate | -| package_a/MethodInheritanceA.java:60:26:60:40 | ClassWithPublic | package_a/MethodInheritanceA.java:60:26:60:40 | ClassWithPublic | -| package_a/MethodInheritanceA.java:63:35:63:57 | AbstractClassWithPublic | package_a/MethodInheritanceA.java:63:35:63:57 | AbstractClassWithPublic | -| package_a/MethodInheritanceA.java:68:28:68:53 | AbstractInheritingClashing | package_a/MethodInheritanceA.java:68:28:68:53 | AbstractInheritingClashing | -| package_a/MethodInheritanceA.java:71:19:71:36 | InheritingClashing | package_a/MethodInheritanceA.java:71:19:71:36 | InheritingClashing | -| package_a/MethodInheritanceA.java:96:26:96:40 | BaseAndOverride | package_a/MethodInheritanceA.java:96:26:96:40 | BaseAndOverride | -| package_a/MethodInheritanceA.java:106:26:106:49 | BaseAndExtendingOverride | package_a/MethodInheritanceA.java:106:26:106:49 | BaseAndExtendingOverride | -| package_a/MethodInheritanceA.java:108:19:108:30 | ClassWithRaw | package_a/MethodInheritanceA.java:108:19:108:30 | ClassWithRaw | -| package_a/MethodInheritanceA.java:114:19:114:32 | InheritingBoth | package_a/MethodInheritanceA.java:114:19:114:32 | InheritingBoth | -| package_a/MethodInheritanceA.java:115:19:115:32 | OverridingBoth | package_a/MethodInheritanceA.java:115:19:115:32 | OverridingBoth | -| package_a/MethodInheritanceOtherA.java:3:14:3:36 | MethodInheritanceOtherA | package_a/MethodInheritanceOtherA.java:3:14:3:36 | MethodInheritanceOtherA | -| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | -| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | -| package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | From 719d87e32f6d22989fdbf53bbf8b6796de56714e Mon Sep 17 00:00:00 2001 From: Marcono1234 Date: Mon, 4 Apr 2022 14:48:04 +0200 Subject: [PATCH 3/3] Java: Improve cross-package inheritance handling --- java/ql/lib/semmle/code/java/Type.qll | 24 +++--- .../inheritance/inhertiance.expected | 79 ++++++++++++------- .../library-tests/inheritance/inhertiance.ql | 3 +- .../package_a/FieldInheritanceAB.java | 9 +++ .../package_a/MemberTypeInheritanceA.java | 6 +- .../package_a/MemberTypeInheritanceAB.java | 9 +++ .../package_a/MethodInheritanceA.java | 41 ++++++---- .../package_a/MethodInheritanceAB.java | 14 ++++ .../package_b/FieldInheritanceB.java | 2 +- .../FieldInheritanceBTransitive.java | 4 + .../package_b/MemberTypeInheritanceB.java | 2 +- .../MemberTypeInheritanceBTransitive.java | 4 + .../MethodInheritanceBTransitive.java | 4 + 13 files changed, 135 insertions(+), 66 deletions(-) create mode 100644 java/ql/test/library-tests/inheritance/package_a/FieldInheritanceAB.java create mode 100644 java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceAB.java create mode 100644 java/ql/test/library-tests/inheritance/package_a/MethodInheritanceAB.java create mode 100644 java/ql/test/library-tests/inheritance/package_b/FieldInheritanceBTransitive.java create mode 100644 java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceBTransitive.java create mode 100644 java/ql/test/library-tests/inheritance/package_b/MethodInheritanceBTransitive.java diff --git a/java/ql/lib/semmle/code/java/Type.qll b/java/ql/lib/semmle/code/java/Type.qll index 3130de3765b5..7ce62ac0b859 100755 --- a/java/ql/lib/semmle/code/java/Type.qll +++ b/java/ql/lib/semmle/code/java/Type.qll @@ -568,7 +568,10 @@ class RefType extends Type, Annotatable, Modifiable, @reftype { exists(Field f | f = m | f = this.getAField() or - not f.isPrivate() and not this.declaresField(f.getName()) and this.getASupertype().inherits(f) + not f.isPrivate() and + (f.isPackageProtected() implies f.getDeclaringType().getPackage() = this.getPackage()) and + not this.declaresField(f.getName()) and + this.getASupertype().inherits(f) or this.getSourceDeclaration().inherits(f) ) @@ -578,21 +581,16 @@ class RefType extends Type, Annotatable, Modifiable, @reftype { // Constructors are not inherited, but this predicate also considers declared members m.(Constructor).getDeclaringType() = this.getSourceDeclaration() or - m.(MemberType).getDeclaringType() = this.getSourceDeclaration() - or - // Or inherits member type - exists(RefType declaringType, MemberType memberType | - declaringType = this.getSourceDeclaration().getASourceSupertype+() and - memberType = m and - memberType.getDeclaringType() = declaringType and + exists(MemberType memberType | memberType = m | + m.(MemberType).getDeclaringType() = this + or not memberType.isPrivate() and (memberType.isPackageProtected() implies memberType.getPackage() = this.getPackage()) and // And member type is not hidden by another member type with the same name (regardless of visibility) - not exists(RefType hidingType | - hidingType = this.getSourceDeclaration().getASourceSupertype*() and - hidingType.getASourceSupertype+() = declaringType and - hidingType.getAMember().(MemberType).getName() = memberType.getName() - ) + not this.getAMember().(MemberType).getName() = memberType.getName() and + this.getASupertype().inherits(memberType) + or + this.getSourceDeclaration().inherits(memberType) ) } diff --git a/java/ql/test/library-tests/inheritance/inhertiance.expected b/java/ql/test/library-tests/inheritance/inhertiance.expected index 88e66e8b67e1..84a645de09d9 100644 --- a/java/ql/test/library-tests/inheritance/inhertiance.expected +++ b/java/ql/test/library-tests/inheritance/inhertiance.expected @@ -5,6 +5,10 @@ onlyInherited | package_a/FieldInheritanceA.java:36:19:36:36 | InheritingClashing | package_a/FieldInheritanceA.java:32:27:32:33 | staticI | | package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | package_a/FieldInheritanceA.java:40:27:40:27 | i | | package_a/FieldInheritanceA.java:43:26:43:45 | ExtendingHidingField | package_a/FieldInheritanceA.java:41:20:41:26 | staticI | +| package_a/FieldInheritanceAB.java:8:14:8:31 | FieldInheritanceAB | package_a/FieldInheritanceA.java:12:19:12:32 | protectedField | +| package_a/FieldInheritanceAB.java:8:14:8:31 | FieldInheritanceAB | package_a/FieldInheritanceA.java:13:26:13:45 | protectedStaticField | +| package_a/FieldInheritanceAB.java:8:14:8:31 | FieldInheritanceAB | package_a/FieldInheritanceA.java:15:16:15:26 | publicField | +| package_a/FieldInheritanceAB.java:8:14:8:31 | FieldInheritanceAB | package_a/FieldInheritanceA.java:16:23:16:39 | publicStaticField | | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:9:9:9:27 | packagePrivateField | | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:10:16:10:40 | packagePrivateStaticField | | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:12:19:12:32 | protectedField | @@ -12,15 +16,20 @@ onlyInherited | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:15:16:15:26 | publicField | | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:16:23:16:39 | publicStaticField | | package_a/FieldInheritanceOtherA.java:3:14:3:35 | FieldInheritanceOtherA | package_a/FieldInheritanceA.java:55:18:55:35 | PrivateHidingField | -| package_a/MemberTypeInheritanceA.java:25:22:25:45 | ExtendingPublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | -| package_a/MemberTypeInheritanceA.java:26:22:26:54 | ExtendingExtendingPublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | -| package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | +| package_a/MemberTypeInheritanceA.java:25:23:25:46 | ExtendingPublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | +| package_a/MemberTypeInheritanceA.java:26:23:26:55 | ExtendingExtendingPublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | +| package_a/MemberTypeInheritanceA.java:27:19:27:45 | ImplementingPublicInterface | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | | package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | package_a/MemberTypeInheritanceA.java:22:29:22:34 | Nested | | package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | package_a/MemberTypeInheritanceA.java:30:29:30:34 | Nested | | package_a/MemberTypeInheritanceA.java:36:26:36:43 | InheritingClashing | package_a/MemberTypeInheritanceA.java:33:29:33:34 | Nested | | package_a/MemberTypeInheritanceA.java:41:23:41:48 | ExtendingHidingNestedClass | package_a/MemberTypeInheritanceA.java:39:26:39:31 | Nested | | package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | package_a/MemberTypeInheritanceA.java:58:36:58:36 | o | | package_a/MemberTypeInheritanceA.java:66:19:66:41 | ExtendingWithLocalTypes | package_a/MemberTypeInheritanceA.java:60:21:60:21 | m | +| package_a/MemberTypeInheritanceAB.java:8:14:8:36 | MemberTypeInheritanceAB | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | +| package_a/MemberTypeInheritanceAB.java:8:14:8:36 | MemberTypeInheritanceAB | package_a/MemberTypeInheritanceA.java:17:25:17:42 | ProtectedInterface | +| package_a/MemberTypeInheritanceAB.java:8:14:8:36 | MemberTypeInheritanceAB | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | +| package_a/MemberTypeInheritanceAB.java:8:14:8:36 | MemberTypeInheritanceAB | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | +| package_a/MemberTypeInheritanceAB.java:8:14:8:36 | MemberTypeInheritanceAB | package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | | package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:13:11:13:29 | PackagePrivateClass | | package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:14:15:14:37 | PackagePrivateInterface | | package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | @@ -28,36 +37,46 @@ onlyInherited | package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | | package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | | package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | -| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:25:22:25:45 | ExtendingPublicInterface | -| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:26:22:26:54 | ExtendingExtendingPublicInterface | -| package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | | package_a/MemberTypeInheritanceOtherA.java:3:14:3:40 | MemberTypeInheritanceOtherA | package_a/MemberTypeInheritanceA.java:47:18:47:41 | HidingNestedClassPrivate | -| package_a/MethodInheritanceA.java:48:23:48:40 | ExtendingInterface | package_a/MethodInheritanceA.java:45:22:45:22 | d | -| package_a/MethodInheritanceA.java:48:23:48:40 | ExtendingInterface | package_a/MethodInheritanceA.java:46:14:46:14 | a | -| package_a/MethodInheritanceA.java:53:23:53:50 | ExtendingInterfaceWithPublic | package_a/MethodInheritanceA.java:51:14:51:14 | m | -| package_a/MethodInheritanceA.java:68:28:68:53 | AbstractInheritingClashing | package_a/MethodInheritanceA.java:64:30:64:30 | m | -| package_a/MethodInheritanceA.java:71:19:71:36 | InheritingClashing | package_a/MethodInheritanceA.java:61:21:61:21 | m | -| package_a/MethodInheritanceA.java:77:23:77:46 | ExtendingMulitpleMethods | package_a/MethodInheritanceA.java:75:14:75:14 | m | -| package_a/MethodInheritanceA.java:96:26:96:40 | BaseAndOverride | package_a/MethodInheritanceA.java:91:22:91:22 | m | -| package_a/MethodInheritanceA.java:98:23:98:45 | ExtendingOverridingBase | package_a/MethodInheritanceA.java:91:22:91:22 | m | -| package_a/MethodInheritanceA.java:106:26:106:49 | BaseAndExtendingOverride | package_a/MethodInheritanceA.java:91:22:91:22 | m | -| package_a/MethodInheritanceA.java:114:19:114:32 | InheritingBoth | package_a/MethodInheritanceA.java:109:21:109:21 | m | -| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:9:9:9:27 | packagePrivateField | -| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:10:16:10:40 | packagePrivateStaticField | -| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:12:19:12:32 | protectedField | -| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:13:26:13:45 | protectedStaticField | -| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:15:16:15:26 | publicField | -| package_b/FieldInheritanceB.java:5:7:5:23 | FieldInheritanceB | package_a/FieldInheritanceA.java:16:23:16:39 | publicStaticField | -| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | -| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:17:25:17:42 | ProtectedInterface | -| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | -| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | -| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | -| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:25:22:25:45 | ExtendingPublicInterface | -| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:26:22:26:54 | ExtendingExtendingPublicInterface | -| package_b/MemberTypeInheritanceB.java:5:7:5:28 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:27:18:27:44 | ImplementingPublicInterface | +| package_a/MethodInheritanceA.java:49:23:49:40 | ExtendingInterface | package_a/MethodInheritanceA.java:46:22:46:22 | d | +| package_a/MethodInheritanceA.java:49:23:49:40 | ExtendingInterface | package_a/MethodInheritanceA.java:47:14:47:14 | a | +| package_a/MethodInheritanceA.java:66:26:66:49 | ExtendingClassWithPublic | package_a/MethodInheritanceA.java:64:21:64:21 | m | +| package_a/MethodInheritanceA.java:69:28:69:53 | AbstractInheritingClashing | package_a/MethodInheritanceA.java:61:30:61:30 | m | +| package_a/MethodInheritanceA.java:72:19:72:36 | InheritingClashing | package_a/MethodInheritanceA.java:64:21:64:21 | m | +| package_a/MethodInheritanceA.java:76:19:76:46 | InheritingClashingTransitive | package_a/MethodInheritanceA.java:64:21:64:21 | m | +| package_a/MethodInheritanceA.java:82:23:82:46 | ExtendingMultipleMethods | package_a/MethodInheritanceA.java:80:14:80:14 | m | +| package_a/MethodInheritanceA.java:102:26:102:40 | BaseAndOverride | package_a/MethodInheritanceA.java:96:22:96:22 | m | +| package_a/MethodInheritanceA.java:104:23:104:45 | ExtendingOverridingBase | package_a/MethodInheritanceA.java:96:22:96:22 | m | +| package_a/MethodInheritanceA.java:106:26:106:49 | BaseAndExtendingOverride | package_a/MethodInheritanceA.java:96:22:96:22 | m | +| package_a/MethodInheritanceA.java:117:19:117:40 | InheritingSubsignature | package_a/MethodInheritanceA.java:112:21:112:21 | m | +| package_a/MethodInheritanceAB.java:7:14:7:32 | MethodInheritanceAB | package_a/MethodInheritanceA.java:17:20:17:34 | protectedMethod | +| package_a/MethodInheritanceAB.java:7:14:7:32 | MethodInheritanceAB | package_a/MethodInheritanceA.java:18:27:18:47 | protectedStaticMethod | +| package_a/MethodInheritanceAB.java:7:14:7:32 | MethodInheritanceAB | package_a/MethodInheritanceA.java:20:17:20:28 | publicMethod | +| package_a/MethodInheritanceAB.java:7:14:7:32 | MethodInheritanceAB | package_a/MethodInheritanceA.java:21:24:21:41 | publicStaticMethod | +| package_b/FieldInheritanceB.java:5:14:5:30 | FieldInheritanceB | package_a/FieldInheritanceA.java:12:19:12:32 | protectedField | +| package_b/FieldInheritanceB.java:5:14:5:30 | FieldInheritanceB | package_a/FieldInheritanceA.java:13:26:13:45 | protectedStaticField | +| package_b/FieldInheritanceB.java:5:14:5:30 | FieldInheritanceB | package_a/FieldInheritanceA.java:15:16:15:26 | publicField | +| package_b/FieldInheritanceB.java:5:14:5:30 | FieldInheritanceB | package_a/FieldInheritanceA.java:16:23:16:39 | publicStaticField | +| package_b/FieldInheritanceBTransitive.java:3:14:3:40 | FieldInheritanceBTransitive | package_a/FieldInheritanceA.java:12:19:12:32 | protectedField | +| package_b/FieldInheritanceBTransitive.java:3:14:3:40 | FieldInheritanceBTransitive | package_a/FieldInheritanceA.java:13:26:13:45 | protectedStaticField | +| package_b/FieldInheritanceBTransitive.java:3:14:3:40 | FieldInheritanceBTransitive | package_a/FieldInheritanceA.java:15:16:15:26 | publicField | +| package_b/FieldInheritanceBTransitive.java:3:14:3:40 | FieldInheritanceBTransitive | package_a/FieldInheritanceA.java:16:23:16:39 | publicStaticField | +| package_b/MemberTypeInheritanceB.java:5:14:5:35 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | +| package_b/MemberTypeInheritanceB.java:5:14:5:35 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:17:25:17:42 | ProtectedInterface | +| package_b/MemberTypeInheritanceB.java:5:14:5:35 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | +| package_b/MemberTypeInheritanceB.java:5:14:5:35 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | +| package_b/MemberTypeInheritanceB.java:5:14:5:35 | MemberTypeInheritanceB | package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | +| package_b/MemberTypeInheritanceBTransitive.java:3:14:3:45 | MemberTypeInheritanceBTransitive | package_a/MemberTypeInheritanceA.java:16:21:16:34 | ProtectedClass | +| package_b/MemberTypeInheritanceBTransitive.java:3:14:3:45 | MemberTypeInheritanceBTransitive | package_a/MemberTypeInheritanceA.java:17:25:17:42 | ProtectedInterface | +| package_b/MemberTypeInheritanceBTransitive.java:3:14:3:45 | MemberTypeInheritanceBTransitive | package_a/MemberTypeInheritanceA.java:19:18:19:28 | PublicClass | +| package_b/MemberTypeInheritanceBTransitive.java:3:14:3:45 | MemberTypeInheritanceBTransitive | package_a/MemberTypeInheritanceA.java:20:25:20:41 | PublicStaticClass | +| package_b/MemberTypeInheritanceBTransitive.java:3:14:3:45 | MemberTypeInheritanceBTransitive | package_a/MemberTypeInheritanceA.java:21:22:21:36 | PublicInterface | | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:17:20:17:34 | protectedMethod | | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:18:27:18:47 | protectedStaticMethod | | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:20:17:20:28 | publicMethod | | package_b/MethodInheritanceB.java:5:14:5:31 | MethodInheritanceB | package_a/MethodInheritanceA.java:21:24:21:41 | publicStaticMethod | +| package_b/MethodInheritanceBTransitive.java:3:14:3:41 | MethodInheritanceBTransitive | package_a/MethodInheritanceA.java:17:20:17:34 | protectedMethod | +| package_b/MethodInheritanceBTransitive.java:3:14:3:41 | MethodInheritanceBTransitive | package_a/MethodInheritanceA.java:18:27:18:47 | protectedStaticMethod | +| package_b/MethodInheritanceBTransitive.java:3:14:3:41 | MethodInheritanceBTransitive | package_a/MethodInheritanceA.java:20:17:20:28 | publicMethod | +| package_b/MethodInheritanceBTransitive.java:3:14:3:41 | MethodInheritanceBTransitive | package_a/MethodInheritanceA.java:21:24:21:41 | publicStaticMethod | bugDeclaredButNotInherited diff --git a/java/ql/test/library-tests/inheritance/inhertiance.ql b/java/ql/test/library-tests/inheritance/inhertiance.ql index 5f96b3a2612c..c159407ea9b3 100644 --- a/java/ql/test/library-tests/inheritance/inhertiance.ql +++ b/java/ql/test/library-tests/inheritance/inhertiance.ql @@ -1,5 +1,6 @@ import java +/** Matches members which are only inherited, but not declared by the type */ query Member onlyInherited(RefType t) { t.fromSource() and t.inherits(result) and @@ -8,7 +9,7 @@ query Member onlyInherited(RefType t) { not result.getDeclaringType() = t } -/** Verify that declared members are a subset of inherited members */ +/** Verifies that declared members are a subset of inherited members */ query Member bugDeclaredButNotInherited(RefType t) { t.fromSource() and result.getDeclaringType() = t and diff --git a/java/ql/test/library-tests/inheritance/package_a/FieldInheritanceAB.java b/java/ql/test/library-tests/inheritance/package_a/FieldInheritanceAB.java new file mode 100644 index 000000000000..efa8f7ddfa00 --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_a/FieldInheritanceAB.java @@ -0,0 +1,9 @@ +package package_a; + +import package_b.FieldInheritanceB; + +// Tries to transitively inherit package-private fields which were not inherited by FieldInheritanceB +// These fields should not be considered inherited per JLS, even though the javac error message when +// trying to access them is misleading: "cannot be accessed from outside package" +public class FieldInheritanceAB extends FieldInheritanceB { +} diff --git a/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceA.java b/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceA.java index b9bf7030cc44..c18f12ffa9dd 100644 --- a/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceA.java +++ b/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceA.java @@ -22,9 +22,9 @@ public interface PublicInterface { public static class Nested {} } - public interface ExtendingPublicInterface extends PublicInterface {} - public interface ExtendingExtendingPublicInterface extends ExtendingPublicInterface {} - public class ImplementingPublicInterface implements PublicInterface {} + private interface ExtendingPublicInterface extends PublicInterface {} + private interface ExtendingExtendingPublicInterface extends ExtendingPublicInterface {} + private class ImplementingPublicInterface implements PublicInterface {} private interface OtherInterface { public static class Nested {} diff --git a/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceAB.java b/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceAB.java new file mode 100644 index 000000000000..a317e6295927 --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_a/MemberTypeInheritanceAB.java @@ -0,0 +1,9 @@ +package package_a; + +import package_b.MemberTypeInheritanceB; + +// Tries to transitively inherit package-private member types which were not inherited by MemberTypeInheritanceB +// These member types should not be considered inherited per JLS, even though the javac error message when +// trying to access them is misleading: "cannot be accessed from outside package" +public class MemberTypeInheritanceAB extends MemberTypeInheritanceB { +} diff --git a/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceA.java b/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceA.java index e4fd93d4d2fe..97846291b328 100644 --- a/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceA.java +++ b/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceA.java @@ -36,6 +36,7 @@ private static class ExtendingClassWithPrivate extends ClassWithPrivate {} private interface InterfaceWithPrivate { private void m() {} private static void staticM() {} + // Static methods are not inherited from interfaces public static void publicStaticM() {} } private interface ExtendingInterfaceWithPrivate extends InterfaceWithPrivate {} @@ -50,19 +51,19 @@ private interface ExtendingInterface extends Interface {} private interface InterfaceWithPublic { void m(); } - private interface ExtendingInterfaceWithPublic extends InterfaceWithPublic {} private interface OtherInterfaceWithPublic { void m(); } private interface InterfaceWithDefault { default void m() {} } - private static class ClassWithPublic { - public void m() {} - } private static abstract class AbstractClassWithPublic { public abstract void m(); } + private static class ClassWithPublic { + public void m() {} + } + private static class ExtendingClassWithPublic extends ClassWithPublic {} // Should inherit all methods called m() private abstract class AbstractInheritingClashing extends AbstractClassWithPublic implements InterfaceWithPublic, OtherInterfaceWithPublic, InterfaceWithDefault {} @@ -70,11 +71,15 @@ private abstract class AbstractInheritingClashing extends AbstractClassWithPubli // Should only inherit m() from ClassWithPublic private class InheritingClashing extends ClassWithPublic implements InterfaceWithPublic, OtherInterfaceWithPublic, InterfaceWithDefault {} - private interface MulitpleMethods { + // Should only inherit concrete method m() from ClassWithPublic, even though it is only + // transitively inherited + private class InheritingClashingTransitive extends ExtendingClassWithPublic implements InterfaceWithPublic, OtherInterfaceWithPublic, InterfaceWithDefault {} + + private interface MultipleMethods { void m(int i); void m(Integer i); } - private interface ExtendingMulitpleMethods extends MulitpleMethods { + private interface ExtendingMultipleMethods extends MultipleMethods { @Override void m(int i); @@ -93,26 +98,28 @@ default void m() { } } + // Should only inherit OverridingBase.m() private static class BaseAndOverride implements OverridingBase, Base {} private interface ExtendingOverridingBase extends OverridingBase {} - /* - * JLS is imprecise here, it currently says: - * > There exists no method m' that is a member of the direct superclass type or a direct superinterface type of C - * - * Based on how this code currently behaves it should be "that is a **declared or inherited** member"; otherwise - * if one does not consider inherited members, in this case one might expect that Base.m() is used when calling m() - */ + // Should only inherit OverridingBase.m() private static class BaseAndExtendingOverride implements ExtendingOverridingBase, Base {} + private class ClassWithParameterized { + public void m(List l) {} + } private class ClassWithRaw { public void m(List raw) {} } - private interface InterfaceWithGeneric { - void m(List l); + private interface InterfaceWithParameterized { + void m(List l); + } + private class InheritingSubsignature extends ClassWithRaw implements InterfaceWithParameterized {} + private class OverridingSubsignatureRawClass extends ClassWithRaw implements InterfaceWithParameterized { + @Override + public void m(List raw) {} } - private class InheritingBoth extends ClassWithRaw implements InterfaceWithGeneric {} - private class OverridingBoth extends ClassWithRaw implements InterfaceWithGeneric { + private class OverridingSubsignatureParameterized extends ClassWithParameterized implements InterfaceWithParameterized { @Override public void m(List raw) {} } diff --git a/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceAB.java b/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceAB.java new file mode 100644 index 000000000000..7bf985450c4b --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_a/MethodInheritanceAB.java @@ -0,0 +1,14 @@ +package package_a; + +import package_b.MethodInheritanceB; + +// Tries to transitively inherit package-private methods which were not inherited by FieldInheritanceB +// These methods should not be considered inherited per JLS +public class MethodInheritanceAB extends MethodInheritanceB { + // Interestingly it is possible to override the method, but not to refer to the super implementation + @Override + void packagePrivateMethod() { + // Does not compile + // super.packagePrivateMethod(); + } +} diff --git a/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceB.java b/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceB.java index a09bfb9dd618..4a799fa0a84f 100644 --- a/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceB.java +++ b/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceB.java @@ -2,5 +2,5 @@ import package_a.FieldInheritanceA; -class FieldInheritanceB extends FieldInheritanceA { +public class FieldInheritanceB extends FieldInheritanceA { } diff --git a/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceBTransitive.java b/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceBTransitive.java new file mode 100644 index 000000000000..19fed8cac031 --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_b/FieldInheritanceBTransitive.java @@ -0,0 +1,4 @@ +package package_b; + +public class FieldInheritanceBTransitive extends FieldInheritanceB { +} diff --git a/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceB.java b/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceB.java index 97a5210c3aa6..94e47c825e96 100644 --- a/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceB.java +++ b/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceB.java @@ -2,5 +2,5 @@ import package_a.MemberTypeInheritanceA; -class MemberTypeInheritanceB extends MemberTypeInheritanceA { +public class MemberTypeInheritanceB extends MemberTypeInheritanceA { } diff --git a/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceBTransitive.java b/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceBTransitive.java new file mode 100644 index 000000000000..949766d1ce2a --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_b/MemberTypeInheritanceBTransitive.java @@ -0,0 +1,4 @@ +package package_b; + +public class MemberTypeInheritanceBTransitive extends MemberTypeInheritanceB { +} diff --git a/java/ql/test/library-tests/inheritance/package_b/MethodInheritanceBTransitive.java b/java/ql/test/library-tests/inheritance/package_b/MethodInheritanceBTransitive.java new file mode 100644 index 000000000000..7bb24b71b44c --- /dev/null +++ b/java/ql/test/library-tests/inheritance/package_b/MethodInheritanceBTransitive.java @@ -0,0 +1,4 @@ +package package_b; + +public class MethodInheritanceBTransitive extends MethodInheritanceB { +}