From 67c9791bdf4d18d311790e3c3b761a21da33566f Mon Sep 17 00:00:00 2001 From: Sarah Chen Date: Thu, 15 Jan 2026 14:58:37 -0500 Subject: [PATCH 1/4] Forbid methods that mutate final fields --- .../src/test/java/com/datadog/debugger/el/TestHelper.java | 2 ++ .../com/datadog/debugger/agent/CapturedSnapshotTest.java | 2 ++ .../akkahttp/appsec/Bug4304Instrumentation.java | 2 ++ .../test/groovy/GrizzlyByteBodyInstrumentationTest.groovy | 2 ++ .../test/groovy/GrizzlyCharBodyInstrumentationTest.groovy | 2 ++ .../java-net-1.8/src/test/groovy/SslSocketTest.groovy | 2 ++ .../trace/instrumentation/weaver/WeaverInstrumentation.java | 2 ++ .../smoketest/appsec/springboot/SpringbootApplication.java | 2 ++ gradle/forbiddenApiFilters/main.txt | 5 +++++ .../java/datadog/trace/api/iast/InstrumentationBridge.java | 2 ++ .../src/main/java/datadog/trace/util/MethodHandles.java | 2 ++ .../src/main/java/datadog/trace/util/UnsafeUtils.java | 2 ++ 12 files changed, 27 insertions(+) diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/TestHelper.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/TestHelper.java index bd3c8fcdbf6..b0ee8b7dfed 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/TestHelper.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/TestHelper.java @@ -1,9 +1,11 @@ package com.datadog.debugger.el; import datadog.trace.api.Config; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.reflect.Field; public class TestHelper { + @SuppressForbidden public static void setFieldInConfig(Config config, String fieldName, Object value) { try { Field field = config.getClass().getDeclaredField(fieldName); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java index e291ba8d8aa..855d119896a 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java @@ -63,6 +63,7 @@ import datadog.trace.bootstrap.debugger.util.Redaction; import datadog.trace.core.CoreTracer; import datadog.trace.core.DDSpan; +import de.thetaphi.forbiddenapis.SuppressForbidden; import groovy.lang.GroovyClassLoader; import java.io.File; import java.io.FileNotFoundException; @@ -2845,6 +2846,7 @@ private TestSnapshotListener setupInstrumentTheWorldTransformer( return listener; } + @SuppressForbidden private void setCorrelationSingleton(Object instance) { Class singletonClass = CorrelationAccess.class.getDeclaredClasses()[0]; try { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java index b185117f882..7f49b3a4c14 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java @@ -16,6 +16,7 @@ import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.reflect.Field; import java.util.regex.Pattern; import net.bytebuddy.asm.Advice; @@ -92,6 +93,7 @@ public void methodAdvice(MethodTransformer transformer) { static class GraphStageLogicAdvice { @Advice.OnMethodExit(suppress = Throwable.class) + @SuppressForbidden static void after(@Advice.This GraphStageLogic thiz) throws NoSuchFieldException, IllegalAccessException { AgentSpan span = activeSpan(); diff --git a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyByteBodyInstrumentationTest.groovy b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyByteBodyInstrumentationTest.groovy index c9abe1cd3fa..3dd034a29be 100644 --- a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyByteBodyInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyByteBodyInstrumentationTest.groovy @@ -6,6 +6,7 @@ import datadog.trace.api.http.StoredBodySupplier import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.TagContext import datadog.trace.instrumentation.grizzlyhttp232.GrizzlyByteBodyInstrumentation +import de.thetaphi.forbiddenapis.SuppressForbidden import org.glassfish.grizzly.Buffer import org.glassfish.grizzly.attributes.AttributeHolder import org.glassfish.grizzly.http.HttpHeader @@ -32,6 +33,7 @@ class GrizzlyByteBodyInstrumentationTest extends InstrumentationSpecification { def supplier boolean bodyDone + @SuppressForbidden def prepare(String encoding = null) { _ * mockHttpHeader.attributes >> attributeHolder if (encoding) { diff --git a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyCharBodyInstrumentationTest.groovy b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyCharBodyInstrumentationTest.groovy index 8ab0d014c35..20794dc9eb4 100644 --- a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyCharBodyInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyCharBodyInstrumentationTest.groovy @@ -6,6 +6,7 @@ import datadog.trace.api.http.StoredBodySupplier import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.TagContext import datadog.trace.instrumentation.grizzlyhttp232.GrizzlyCharBodyInstrumentation +import de.thetaphi.forbiddenapis.SuppressForbidden import org.glassfish.grizzly.attributes.AttributeHolder import org.glassfish.grizzly.http.HttpHeader import org.glassfish.grizzly.http.io.InputBuffer @@ -29,6 +30,7 @@ class GrizzlyCharBodyInstrumentationTest extends InstrumentationSpecification { def supplier boolean bodyDone + @SuppressForbidden def setup() { _ * mockHttpHeader.attributes >> attributeHolder 1 * attributeHolder.setAttribute('datadog.intercepted_request_body', Boolean.TRUE) diff --git a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy index 7a652ad5927..b8f7918e4de 100644 --- a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy +++ b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy @@ -3,6 +3,7 @@ import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer import datadog.trace.agent.test.InstrumentationSpecification import datadog.trace.bootstrap.instrumentation.usm.UsmExtractor import datadog.trace.bootstrap.instrumentation.usm.UsmMessageFactory +import de.thetaphi.forbiddenapis.SuppressForbidden import java.lang.reflect.Field import javax.net.ssl.HttpsURLConnection import spock.lang.AutoCleanup @@ -31,6 +32,7 @@ class SslSocketTest extends InstrumentationSpecification { injectSysConfig("dd.usm.enabled", "true") } + @SuppressForbidden def "simple HTTPS request"() { setup: HttpsURLConnection.setDefaultSSLSocketFactory(server.sslContext.getSocketFactory()) diff --git a/dd-java-agent/instrumentation/weaver-0.9/src/main/java/datadog/trace/instrumentation/weaver/WeaverInstrumentation.java b/dd-java-agent/instrumentation/weaver-0.9/src/main/java/datadog/trace/instrumentation/weaver/WeaverInstrumentation.java index f28a45f03c5..1debafcd7bf 100644 --- a/dd-java-agent/instrumentation/weaver-0.9/src/main/java/datadog/trace/instrumentation/weaver/WeaverInstrumentation.java +++ b/dd-java-agent/instrumentation/weaver-0.9/src/main/java/datadog/trace/instrumentation/weaver/WeaverInstrumentation.java @@ -5,6 +5,7 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.reflect.Field; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -43,6 +44,7 @@ public void methodAdvice(MethodTransformer transformer) { public static class SbtTaskCreationAdvice { @Advice.OnMethodExit(suppress = Throwable.class) + @SuppressForbidden public static void onTaskCreation( @Advice.This Object sbtTask, @Advice.FieldValue("taskDef") TaskDef taskDef) { try { diff --git a/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/SpringbootApplication.java b/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/SpringbootApplication.java index 7c115bd857a..4e871112fe3 100644 --- a/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/SpringbootApplication.java +++ b/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/SpringbootApplication.java @@ -1,5 +1,6 @@ package datadog.smoketest.appsec.springboot; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.management.ManagementFactory; import java.lang.reflect.Field; import org.springframework.boot.SpringApplication; @@ -19,6 +20,7 @@ public static void main(final String[] args) { System.out.println("Started in " + ManagementFactory.getRuntimeMXBean().getUptime() + "ms"); } + @SuppressForbidden private static void activateAppSec() throws Exception { Class agentClass = ClassLoader.getSystemClassLoader().loadClass("datadog.trace.bootstrap.Agent"); diff --git a/gradle/forbiddenApiFilters/main.txt b/gradle/forbiddenApiFilters/main.txt index db69659cb7a..b476791f9f5 100644 --- a/gradle/forbiddenApiFilters/main.txt +++ b/gradle/forbiddenApiFilters/main.txt @@ -37,3 +37,8 @@ java.lang.System#getenv(java.lang.String) #Use jdk LongAdder @defaultMessage use LongAdder instead of the legacy jctools FixedSizeStripedLongCounter org.jctools.counters.FixedSizeStripedLongCounter + +# avoid methods that mutate final fields: https://openjdk.org/jeps/500 +@defaultMessage Avoid using Field::set and MethodHandles.Lookup::unreflectSetter. Java is moving toward integrity by default which restricts final field mutation. More details here: https://openjdk.org/jeps/500. +java.lang.reflect.Field#set(java.lang.Object,java.lang.Object) +java.lang.invoke.MethodHandles$Lookup#unreflectSetter(java.lang.reflect.Field) diff --git a/internal-api/src/main/java/datadog/trace/api/iast/InstrumentationBridge.java b/internal-api/src/main/java/datadog/trace/api/iast/InstrumentationBridge.java index 7c5c9d1ae3f..eb23eebbda5 100644 --- a/internal-api/src/main/java/datadog/trace/api/iast/InstrumentationBridge.java +++ b/internal-api/src/main/java/datadog/trace/api/iast/InstrumentationBridge.java @@ -29,6 +29,7 @@ import datadog.trace.api.iast.sink.XContentTypeModule; import datadog.trace.api.iast.sink.XPathInjectionModule; import datadog.trace.api.iast.sink.XssModule; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -124,6 +125,7 @@ private static M get(final Field field) { } } + @SuppressForbidden private static void set(final Field field, final IastModule module) { try { field.set(null, module); diff --git a/internal-api/src/main/java/datadog/trace/util/MethodHandles.java b/internal-api/src/main/java/datadog/trace/util/MethodHandles.java index bb0f756bf6f..cd2e6e792dd 100644 --- a/internal-api/src/main/java/datadog/trace/util/MethodHandles.java +++ b/internal-api/src/main/java/datadog/trace/util/MethodHandles.java @@ -1,6 +1,7 @@ package datadog.trace.util; import datadog.trace.api.telemetry.LogCollector; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -65,6 +66,7 @@ public MethodHandle privateFieldSetter(String className, String fieldName) { return clazz != null ? privateFieldSetter(clazz, fieldName) : null; } + @SuppressForbidden public MethodHandle privateFieldSetter(Class clazz, String fieldName) { return AccessController.doPrivileged( (PrivilegedAction) diff --git a/internal-api/src/main/java/datadog/trace/util/UnsafeUtils.java b/internal-api/src/main/java/datadog/trace/util/UnsafeUtils.java index cc0830b68c8..91320caa625 100644 --- a/internal-api/src/main/java/datadog/trace/util/UnsafeUtils.java +++ b/internal-api/src/main/java/datadog/trace/util/UnsafeUtils.java @@ -1,5 +1,6 @@ package datadog.trace.util; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import org.slf4j.Logger; @@ -57,6 +58,7 @@ public static T tryShallowClone(T original) { } } + @SuppressForbidden private static void cloneFields(Class clazz, Object original, Object clone) throws Exception { for (Field field : clazz.getDeclaredFields()) { if ((field.getModifiers() & Modifier.STATIC) != 0) { From 5bbfe49a738d6efc04171c31141e7e8b8d97ce0c Mon Sep 17 00:00:00 2001 From: Sarah Chen Date: Thu, 15 Jan 2026 15:29:22 -0500 Subject: [PATCH 2/4] Format other comments --- gradle/forbiddenApiFilters/main.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/forbiddenApiFilters/main.txt b/gradle/forbiddenApiFilters/main.txt index b476791f9f5..46e3ee58140 100644 --- a/gradle/forbiddenApiFilters/main.txt +++ b/gradle/forbiddenApiFilters/main.txt @@ -1,7 +1,7 @@ # loads and instantiates a class which may be inefficient depending on context java.lang.Class#forName(java.lang.String) -# String methods which uses regexes for matching +# String methods which use regexes for matching java.lang.String#split(java.lang.String) java.lang.String#split(java.lang.String,int) java.lang.String#replaceAll(java.lang.String,java.lang.String) @@ -34,7 +34,7 @@ java.lang.System#err java.lang.System#getenv() java.lang.System#getenv(java.lang.String) -#Use jdk LongAdder +# use jdk LongAdder instead of jctools FixedSizeStripedLongCounter @defaultMessage use LongAdder instead of the legacy jctools FixedSizeStripedLongCounter org.jctools.counters.FixedSizeStripedLongCounter From df2c7f4f526344526d0389f6d73dfd70706a600c Mon Sep 17 00:00:00 2001 From: Sarah Chen Date: Thu, 15 Jan 2026 15:36:39 -0500 Subject: [PATCH 3/4] Remove unnecessary suppression --- .../src/test/java/com/datadog/debugger/el/TestHelper.java | 2 -- .../java/com/datadog/debugger/agent/CapturedSnapshotTest.java | 2 -- .../src/test/groovy/GrizzlyByteBodyInstrumentationTest.groovy | 2 -- .../src/test/groovy/GrizzlyCharBodyInstrumentationTest.groovy | 2 -- .../java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy | 2 -- .../smoketest/appsec/springboot/SpringbootApplication.java | 2 -- 6 files changed, 12 deletions(-) diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/TestHelper.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/TestHelper.java index b0ee8b7dfed..bd3c8fcdbf6 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/TestHelper.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/TestHelper.java @@ -1,11 +1,9 @@ package com.datadog.debugger.el; import datadog.trace.api.Config; -import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.reflect.Field; public class TestHelper { - @SuppressForbidden public static void setFieldInConfig(Config config, String fieldName, Object value) { try { Field field = config.getClass().getDeclaredField(fieldName); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java index 855d119896a..e291ba8d8aa 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java @@ -63,7 +63,6 @@ import datadog.trace.bootstrap.debugger.util.Redaction; import datadog.trace.core.CoreTracer; import datadog.trace.core.DDSpan; -import de.thetaphi.forbiddenapis.SuppressForbidden; import groovy.lang.GroovyClassLoader; import java.io.File; import java.io.FileNotFoundException; @@ -2846,7 +2845,6 @@ private TestSnapshotListener setupInstrumentTheWorldTransformer( return listener; } - @SuppressForbidden private void setCorrelationSingleton(Object instance) { Class singletonClass = CorrelationAccess.class.getDeclaredClasses()[0]; try { diff --git a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyByteBodyInstrumentationTest.groovy b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyByteBodyInstrumentationTest.groovy index 3dd034a29be..c9abe1cd3fa 100644 --- a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyByteBodyInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyByteBodyInstrumentationTest.groovy @@ -6,7 +6,6 @@ import datadog.trace.api.http.StoredBodySupplier import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.TagContext import datadog.trace.instrumentation.grizzlyhttp232.GrizzlyByteBodyInstrumentation -import de.thetaphi.forbiddenapis.SuppressForbidden import org.glassfish.grizzly.Buffer import org.glassfish.grizzly.attributes.AttributeHolder import org.glassfish.grizzly.http.HttpHeader @@ -33,7 +32,6 @@ class GrizzlyByteBodyInstrumentationTest extends InstrumentationSpecification { def supplier boolean bodyDone - @SuppressForbidden def prepare(String encoding = null) { _ * mockHttpHeader.attributes >> attributeHolder if (encoding) { diff --git a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyCharBodyInstrumentationTest.groovy b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyCharBodyInstrumentationTest.groovy index 20794dc9eb4..8ab0d014c35 100644 --- a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyCharBodyInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/test/groovy/GrizzlyCharBodyInstrumentationTest.groovy @@ -6,7 +6,6 @@ import datadog.trace.api.http.StoredBodySupplier import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.TagContext import datadog.trace.instrumentation.grizzlyhttp232.GrizzlyCharBodyInstrumentation -import de.thetaphi.forbiddenapis.SuppressForbidden import org.glassfish.grizzly.attributes.AttributeHolder import org.glassfish.grizzly.http.HttpHeader import org.glassfish.grizzly.http.io.InputBuffer @@ -30,7 +29,6 @@ class GrizzlyCharBodyInstrumentationTest extends InstrumentationSpecification { def supplier boolean bodyDone - @SuppressForbidden def setup() { _ * mockHttpHeader.attributes >> attributeHolder 1 * attributeHolder.setAttribute('datadog.intercepted_request_body', Boolean.TRUE) diff --git a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy index b8f7918e4de..7a652ad5927 100644 --- a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy +++ b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy @@ -3,7 +3,6 @@ import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer import datadog.trace.agent.test.InstrumentationSpecification import datadog.trace.bootstrap.instrumentation.usm.UsmExtractor import datadog.trace.bootstrap.instrumentation.usm.UsmMessageFactory -import de.thetaphi.forbiddenapis.SuppressForbidden import java.lang.reflect.Field import javax.net.ssl.HttpsURLConnection import spock.lang.AutoCleanup @@ -32,7 +31,6 @@ class SslSocketTest extends InstrumentationSpecification { injectSysConfig("dd.usm.enabled", "true") } - @SuppressForbidden def "simple HTTPS request"() { setup: HttpsURLConnection.setDefaultSSLSocketFactory(server.sslContext.getSocketFactory()) diff --git a/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/SpringbootApplication.java b/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/SpringbootApplication.java index 4e871112fe3..7c115bd857a 100644 --- a/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/SpringbootApplication.java +++ b/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/SpringbootApplication.java @@ -1,6 +1,5 @@ package datadog.smoketest.appsec.springboot; -import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.management.ManagementFactory; import java.lang.reflect.Field; import org.springframework.boot.SpringApplication; @@ -20,7 +19,6 @@ public static void main(final String[] args) { System.out.println("Started in " + ManagementFactory.getRuntimeMXBean().getUptime() + "ms"); } - @SuppressForbidden private static void activateAppSec() throws Exception { Class agentClass = ClassLoader.getSystemClassLoader().loadClass("datadog.trace.bootstrap.Agent"); From 9d987f7668ceea7822879493ea93fa3b3a31c2bd Mon Sep 17 00:00:00 2001 From: Sarah Chen Date: Thu, 15 Jan 2026 15:48:57 -0500 Subject: [PATCH 4/4] Clean up comment --- gradle/forbiddenApiFilters/main.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/forbiddenApiFilters/main.txt b/gradle/forbiddenApiFilters/main.txt index 46e3ee58140..4b8a52c69f8 100644 --- a/gradle/forbiddenApiFilters/main.txt +++ b/gradle/forbiddenApiFilters/main.txt @@ -38,7 +38,7 @@ java.lang.System#getenv(java.lang.String) @defaultMessage use LongAdder instead of the legacy jctools FixedSizeStripedLongCounter org.jctools.counters.FixedSizeStripedLongCounter -# avoid methods that mutate final fields: https://openjdk.org/jeps/500 +# avoid methods that mutate final fields @defaultMessage Avoid using Field::set and MethodHandles.Lookup::unreflectSetter. Java is moving toward integrity by default which restricts final field mutation. More details here: https://openjdk.org/jeps/500. java.lang.reflect.Field#set(java.lang.Object,java.lang.Object) java.lang.invoke.MethodHandles$Lookup#unreflectSetter(java.lang.reflect.Field)