Skip to content

Commit 02cc483

Browse files
Prepare for JEP 500 (#9557)
* feat: Add future prohibited methods * feat: Allow current usages --------- Co-authored-by: Sarah Chen <[email protected]>
1 parent 7b4f50c commit 02cc483

File tree

6 files changed

+37
-3
lines changed

6 files changed

+37
-3
lines changed

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2845,6 +2845,7 @@ private TestSnapshotListener setupInstrumentTheWorldTransformer(
28452845
return listener;
28462846
}
28472847

2848+
// TODO: JEP 500 - avoid mutating final fields
28482849
private void setCorrelationSingleton(Object instance) {
28492850
Class<?> singletonClass = CorrelationAccess.class.getDeclaredClasses()[0];
28502851
try {

dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@
1616
import datadog.trace.api.gateway.RequestContext;
1717
import datadog.trace.api.gateway.RequestContextSlot;
1818
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
19+
import de.thetaphi.forbiddenapis.SuppressForbidden;
1920
import java.lang.reflect.Field;
2021
import java.util.regex.Pattern;
2122
import net.bytebuddy.asm.Advice;
2223
import net.bytebuddy.description.type.TypeDescription;
2324
import net.bytebuddy.matcher.ElementMatcher;
2425

25-
/** See https://github.com/akka/akka-http/issues/4304 */
26+
/**
27+
* See <a href="https://github.com/akka/akka-http/issues/4304">Duplicated 100 responses if there is
28+
* an exception thrown by the unmarshaller</a>
29+
*/
2630
@AutoService(InstrumenterModule.class)
2731
public class Bug4304Instrumentation extends InstrumenterModule.AppSec
2832
implements Instrumenter.ForTypeHierarchy,
@@ -91,6 +95,11 @@ public void methodAdvice(MethodTransformer transformer) {
9195
}
9296

9397
static class GraphStageLogicAdvice {
98+
// Field::set() is forbidden because it may be used to mutate final fields, disallowed by
99+
// https://openjdk.org/jeps/500.
100+
// However, in this case the method is called on a non-final field, so it is safe. See
101+
// https://github.com/akka/akka-http/blob/8fb19fce3548c3bfa1e8ebcb1115be29f342df69/akka-http-core/src/main/scala/akka/http/impl/engine/server/HttpServerBluePrint.scala#L588
102+
@SuppressForbidden
94103
@Advice.OnMethodExit(suppress = Throwable.class)
95104
static void after(@Advice.This GraphStageLogic thiz)
96105
throws NoSuchFieldException, IllegalAccessException {

dd-java-agent/instrumentation/weaver-0.9/src/main/java/datadog/trace/instrumentation/weaver/WeaverInstrumentation.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.auto.service.AutoService;
66
import datadog.trace.agent.tooling.Instrumenter;
77
import datadog.trace.agent.tooling.InstrumenterModule;
8+
import de.thetaphi.forbiddenapis.SuppressForbidden;
89
import java.lang.reflect.Field;
910
import java.util.concurrent.ConcurrentLinkedQueue;
1011
import java.util.concurrent.LinkedBlockingQueue;
@@ -42,6 +43,8 @@ public void methodAdvice(MethodTransformer transformer) {
4243
}
4344

4445
public static class SbtTaskCreationAdvice {
46+
// TODO: JEP 500 - avoid mutating final fields
47+
@SuppressForbidden
4548
@Advice.OnMethodExit(suppress = Throwable.class)
4649
public static void onTaskCreation(
4750
@Advice.This Object sbtTask, @Advice.FieldValue("taskDef") TaskDef taskDef) {

gradle/forbiddenApiFilters/main.txt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# loads and instantiates a class which may be inefficient depending on context
22
java.lang.Class#forName(java.lang.String)
33

4-
# String methods which uses regexes for matching
4+
# String methods which use regexes for matching
55
java.lang.String#split(java.lang.String)
66
java.lang.String#split(java.lang.String,int)
77
java.lang.String#replaceAll(java.lang.String,java.lang.String)
@@ -34,6 +34,19 @@ java.lang.System#err
3434
java.lang.System#getenv()
3535
java.lang.System#getenv(java.lang.String)
3636

37-
#Use jdk LongAdder
37+
# use jdk LongAdder
3838
@defaultMessage use LongAdder instead of the legacy jctools FixedSizeStripedLongCounter
3939
org.jctools.counters.FixedSizeStripedLongCounter
40+
41+
# avoid methods that mutate final fields, as this will soon be disallowed. For more details: https://openjdk.org/jeps/500.
42+
@defaultMessage Avoid mutating final fields (e.g. with methods such as Field::set and MethodHandles.Lookup::unreflectSetter). If the field is not final, override with @SuppressForbidden.
43+
java.lang.reflect.Field#set(java.lang.Object,java.lang.Object)
44+
java.lang.reflect.Field#setBoolean(java.lang.Object,boolean)
45+
java.lang.reflect.Field#setByte(java.lang.Object,byte)
46+
java.lang.reflect.Field#setChar(java.lang.Object,char)
47+
java.lang.reflect.Field#setShort(java.lang.Object,short)
48+
java.lang.reflect.Field#setInt(java.lang.Object,int)
49+
java.lang.reflect.Field#setLong(java.lang.Object,long)
50+
java.lang.reflect.Field#setFloat(java.lang.Object,float)
51+
java.lang.reflect.Field#setDouble(java.lang.Object,double)
52+
java.lang.invoke.MethodHandles.Lookup#unreflectSetter(java.lang.reflect.Field)

internal-api/src/main/java/datadog/trace/api/iast/InstrumentationBridge.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import datadog.trace.api.iast.sink.XContentTypeModule;
3030
import datadog.trace.api.iast.sink.XPathInjectionModule;
3131
import datadog.trace.api.iast.sink.XssModule;
32+
import de.thetaphi.forbiddenapis.SuppressForbidden;
3233
import java.lang.reflect.Field;
3334
import java.lang.reflect.Modifier;
3435
import java.util.ArrayList;
@@ -124,6 +125,10 @@ private static <M extends IastModule> M get(final Field field) {
124125
}
125126
}
126127

128+
// Field::set() is forbidden because it may be used to mutate final fields, disallowed by
129+
// https://openjdk.org/jeps/500.
130+
// However, in this case the method is called on a non-final field, so it is safe.
131+
@SuppressForbidden
127132
private static void set(final Field field, final IastModule module) {
128133
try {
129134
field.set(null, module);

internal-api/src/main/java/datadog/trace/util/UnsafeUtils.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.util;
22

3+
import de.thetaphi.forbiddenapis.SuppressForbidden;
34
import java.lang.reflect.Field;
45
import java.lang.reflect.Modifier;
56
import org.slf4j.Logger;
@@ -57,6 +58,8 @@ public static <T> T tryShallowClone(T original) {
5758
}
5859
}
5960

61+
// TODO: JEP 500 - avoid mutating final fields
62+
@SuppressForbidden
6063
private static void cloneFields(Class<?> clazz, Object original, Object clone) throws Exception {
6164
for (Field field : clazz.getDeclaredFields()) {
6265
if ((field.getModifiers() & Modifier.STATIC) != 0) {

0 commit comments

Comments
 (0)