Skip to content
Open
Original file line number Diff line number Diff line change
Expand Up @@ -2845,6 +2845,7 @@ private TestSnapshotListener setupInstrumentTheWorldTransformer(
return listener;
}

// TODO: JEP 500 - avoid mutating final fields
private void setCorrelationSingleton(Object instance) {
Class<?> singletonClass = CorrelationAccess.class.getDeclaredClasses()[0];
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,17 @@
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;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;

/** See https://github.com/akka/akka-http/issues/4304 */
/**
* See <a href="https://github.com/akka/akka-http/issues/4304">Duplicated 100 responses if there is
* an exception thrown by the unmarshaller</a>
*/
@AutoService(InstrumenterModule.class)
public class Bug4304Instrumentation extends InstrumenterModule.AppSec
implements Instrumenter.ForTypeHierarchy,
Expand Down Expand Up @@ -91,6 +95,8 @@ public void methodAdvice(MethodTransformer transformer) {
}

static class GraphStageLogicAdvice {
// TODO: JEP 500 - avoid mutating final fields
@SuppressForbidden
@Advice.OnMethodExit(suppress = Throwable.class)
static void after(@Advice.This GraphStageLogic thiz)
throws NoSuchFieldException, IllegalAccessException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -42,6 +43,8 @@ public void methodAdvice(MethodTransformer transformer) {
}

public static class SbtTaskCreationAdvice {
// TODO: JEP 500 - avoid mutating final fields
@SuppressForbidden
@Advice.OnMethodExit(suppress = Throwable.class)
public static void onTaskCreation(
@Advice.This Object sbtTask, @Advice.FieldValue("taskDef") TaskDef taskDef) {
Expand Down
17 changes: 15 additions & 2 deletions gradle/forbiddenApiFilters/main.txt
Original file line number Diff line number Diff line change
@@ -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)
Expand Down Expand Up @@ -34,6 +34,19 @@ java.lang.System#err
java.lang.System#getenv()
java.lang.System#getenv(java.lang.String)

#Use jdk LongAdder
# use jdk LongAdder
@defaultMessage use LongAdder instead of the legacy jctools FixedSizeStripedLongCounter
org.jctools.counters.FixedSizeStripedLongCounter

# avoid methods that mutate final fields, as this will soon be disallowed. For more details: https://openjdk.org/jeps/500.
@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.
java.lang.reflect.Field#set(java.lang.Object,java.lang.Object)
java.lang.reflect.Field#setBoolean(java.lang.Object,boolean)
java.lang.reflect.Field#setByte(java.lang.Object,byte)
java.lang.reflect.Field#setChar(java.lang.Object,char)
java.lang.reflect.Field#setShort(java.lang.Object,short)
java.lang.reflect.Field#setInt(java.lang.Object,int)
java.lang.reflect.Field#setLong(java.lang.Object,long)
java.lang.reflect.Field#setFloat(java.lang.Object,float)
java.lang.reflect.Field#setDouble(java.lang.Object,double)
java.lang.invoke.MethodHandles.Lookup#unreflectSetter(java.lang.reflect.Field)
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -124,6 +125,10 @@ private static <M extends IastModule> M get(final Field field) {
}
}

// Field::set() is forbidden because it may be used to mutate final fields, disallowed by
// https://openjdk.org/jeps/500.
// However, in this case the method is called on a non-final field, so it is safe.
@SuppressForbidden
private static void set(final Field field, final IastModule module) {
try {
field.set(null, module);
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -57,6 +58,8 @@ public static <T> T tryShallowClone(T original) {
}
}

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