Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b8cc914
SONARJAVA-6783: Implement rule S9345 Classes with throwing constructo…
romainbrenguier Aug 21, 2026
50133ac
Update ruling results
github-actions[bot] Aug 21, 2026
ea06a0f
SONARJAVA-6783: Fix compilation error, add Sonar way profile, and wit…
romainbrenguier Aug 21, 2026
b04aa3b
SONARJAVA-6783: Move primary location to throwing constructor with cl…
romainbrenguier Aug 21, 2026
210ab68
SONARJAVA-6783: Fix NPE on anonymous classes, skip sealed classes, up…
romainbrenguier Aug 24, 2026
f58ad99
Update ruling results for PR #5981 (#5983)
github-actions[bot] Aug 24, 2026
20b8c8e
Update ruling results for PR #5981 (#6000)
github-actions[bot] Aug 24, 2026
09126f5
SONARJAVA-6783: Address review feedback for S9345 FinalizerAttackCheck
romainbrenguier Aug 24, 2026
f0c1680
SONARJAVA-6783: Reduce cognitive complexity and add test coverage for…
romainbrenguier Aug 24, 2026
9cbfead
Update ruling results for PR #5981 (#6007)
github-actions[bot] Aug 24, 2026
e98ae92
SONARJAVA-6783: Flag constructors when class has throwing initializers
romainbrenguier Aug 24, 2026
6630fc7
Update ruling results
github-actions[bot] Aug 24, 2026
de2188c
Update ruling results for eclipse-jetty-similar-to-main S9345
romainbrenguier Aug 24, 2026
a3aeff0
SONARJAVA-6783: Fix duplicate branch code, reduce complexity, and add…
romainbrenguier Aug 24, 2026
3758ad1
Merge remote-tracking branch 'origin/fix/update-ruling-for-romain/new…
romainbrenguier Aug 24, 2026
695ec01
SONARJAVA-6783: Add test coverage and merge ruling fix for S9345
romainbrenguier Aug 24, 2026
d03d535
SONARJAVA-6783: Remove unused Symbol import in FinalizerAttackCheck
romainbrenguier Aug 24, 2026
a4994f5
SONARJAVA-6783: Reduce complexity, add test coverage for S9345
romainbrenguier Aug 24, 2026
6b66ea1
SONARJAVA-6783: Extract isThrowingInitializer to fix S1871 duplicate …
romainbrenguier Aug 24, 2026
3919b14
SONARJAVA-6783: Address PR review findings for S9345
romainbrenguier Aug 25, 2026
7520446
SONARJAVA-6783: Fix compilation error and update ruling results for S…
romainbrenguier Aug 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 123 additions & 0 deletions its/ruling/src/test/resources/commons-beanutils/java-S9345.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
{
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BaseDynaBeanMapDecorator.java": [
78
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BeanPredicate.java": [
49
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BeanPropertyValueChangeClosure.java": [
117,
134
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BeanPropertyValueEqualsPredicate.java": [
149,
164
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BeanToPropertyValueTransformer.java": [
103,
119
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/BeanUtilsBean.java": [
111,
124,
136
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/ConvertUtilsBean.java": [
158
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/FluentPropertyBeanIntrospector.java": [
97,
110
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/LazyDynaBean.java": [
172,
181,
192
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/MappedPropertyDescriptor.java": [
85,
151,
197
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/MethodUtils.java": [
1319
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/PropertyUtilsBean.java": [
128
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/ResultSetDynaClass.java": [
100,
128,
159
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/RowSetDynaClass.java": [
101,
123,
148,
176,
206,
236
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/SuppressPropertiesBeanIntrospector.java": [
62
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/ArrayConverter.java": [
150
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/BaseLocaleConverter.java": [
70,
83,
97,
111
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/LocaleBeanUtilsBean.java": [
92,
104,
118
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java": [
118
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/converters/DateLocaleConverter.java": [
69,
82,
94,
107,
120,
134,
148,
162,
175,
189,
204,
219
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/converters/DecimalLocaleConverter.java": [
59,
72,
84,
97,
110,
124,
138,
152,
165,
179,
193,
208
],
"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java": [
63,
76,
88,
101,
114,
128,
142,
156,
169,
183,
197,
212
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HostPortHttpField.java": [
37
],
"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpCookie.java": [
125
],
"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/PrecompressedHttpContent.java": [
36
],
"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpec.java": [
76
],
"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java": [
51
],
"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java": [
90
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/CustomRequestLog.java": [
303
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java": [
68
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/EncodingHttpWriter.java": [
33
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelListeners.java": [
54
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartFormInputStream.java": [
370
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ServletPathMapping.java": [
47
]
}
123 changes: 123 additions & 0 deletions its/ruling/src/test/resources/eclipse-jetty/java-S9345.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
{
"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HostPortHttpField.java": [
37
],
"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpCookie.java": [
125
],
"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/PrecompressedHttpContent.java": [
36
],
"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpec.java": [
76
],
"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java": [
51
],
"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java": [
90
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/CustomRequestLog.java": [
303
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java": [
68
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/EncodingHttpWriter.java": [
33
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelListeners.java": [
54
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartFormInputStream.java": [
370
],
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ServletPathMapping.java": [
47
],
"org.eclipse.jetty:jetty-project:jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONPojoConvertorFactory.java": [
46
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/BlockingArrayQueue.java": [
126
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ClassLoadingObjectInputStream.java": [
48,
53
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/CountingCallback.java": [
45
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/HostPort.java": [
37
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/IncludeExcludeSet.java": [
85
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/InetAddressPattern.java": [
115,
198,
241
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartOutputStream.java": [
43,
53
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartWriter.java": [
41
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/MultiReleaseJarFile.java": [
55,
68,
162
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/PathWatcher.java": [
98
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/QuotedStringTokenizer.java": [
52
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/RolloverFileOutputStream.java": [
79,
91,
104,
120,
140,
151
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Uptime.java": [
41
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/component/FileDestroyable.java": [
41
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/resource/PathResource.java": [
279,
331
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/resource/ResourceCollection.java": [
89
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/security/CertificateValidator.java": [
86
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ssl/KeyStoreScanner.java": [
48
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ssl/X509.java": [
67
],
"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java": [
126
],
"org.eclipse.jetty:jetty-project:jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlAppendable.java": [
38,
43,
48,
53,
58
],
"org.eclipse.jetty:jetty-project:jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlConfiguration.java": [
224
]
}
8 changes: 8 additions & 0 deletions its/ruling/src/test/resources/guava/java-S9345.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"com.google.guava:guava:src/com/google/common/base/FinalizableReferenceQueue.java": [
159
],
"com.google.guava:guava:src/com/google/common/io/MultiReader.java": [
37
]
}
23 changes: 23 additions & 0 deletions its/ruling/src/test/resources/sonar-server/java-S9345.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/source/ReportIterator.java": [
38
],
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java": [
114
],
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/web/MasterServletFilter.java": [
48
],
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/UpdateCenterClient.java": [
75
],
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/user/SecurityRealmFactory.java": [
43
],
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/ObjectInputStreamIterator.java": [
35
],
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/cache/DiskCache.java": [
42
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package checks;

class FinalizerAttackCheckSample {

// --- Noncompliant: sealed class permitting an unknown type (unresolvable) ---
// When the permitted type cannot be resolved, the class is conservatively treated as safely sealed.
// However, this sealed class also permits a non-sealed type that IS resolvable.

static sealed class SealedWithUnknown permits UnknownType, KnownNonSealed { // Secondary {{Non-final class}}
public SealedWithUnknown(String s) throws Exception { // Noncompliant
if (s == null) throw new Exception();
}
}

static non-sealed class KnownNonSealed extends SealedWithUnknown { // Secondary {{Non-final class}}
KnownNonSealed(String s) throws Exception { // Noncompliant
super(s);
}
}

// --- Noncompliant: sealed class permitting only unknown types (conservatively unsafe) ---

static sealed class SealedWithOnlyUnknown permits AnotherUnknownType { // Secondary {{Non-final class}}
public SealedWithOnlyUnknown(String s) throws Exception { // Noncompliant
if (s == null) throw new Exception();
}
}

// --- Noncompliant: non-final class with throwing constructor (basic case) ---

static class BasicThrowing { // Secondary {{Non-final class}}
public BasicThrowing() throws Exception { // Noncompliant
throw new Exception();
}
}
}
Loading
Loading