data race in java.lang.ClassLoader.loadClass
Jie He
Jie.He at arm.com
Mon Sep 21 01:57:19 UTC 2020
Thanks Man.
I also noticed there are intentional races in Java concurrent API, including ReentrantLock, ConcurrentHashMap etc, when investigating some Java applications.
B.R
Jie He
-----Original Message-----
From: tsan-dev <tsan-dev-retn at openjdk.java.net> On Behalf Of Man Cao
Sent: Saturday, September 19, 2020 10:57 AM
To: Jérémy Coulon <jeremy.coulon.jrmc at gmail.com>
Cc: tsan-dev at openjdk.java.net
Subject: Re: data race in java.lang.ClassLoader.loadClass
Hi Jérémy,
Thanks for the interests.
Yes, there are a lot of intentional and real races in the JDK itself. And internally Google has a list of suppressed races.
We plan to publish the list in the Github repo, but have not got the time to do it yet.
In the meantime, you could add some basic suppresions according to https://github.com/google/sanitizers/wiki/ThreadSanitizerSuppressions
With suppression like:
called_from_lib:/libjvm.so
called_from_lib:/libzip.so
called_from_lib:/libverify.so
called_from_lib:/libjimage.so
race:^java.util.concurrent.ConcurrentHashMap
race:^java.util.concurrent.locks.ReentrantReadWriteLock
race:^java.util.concurrent.locks.ReentrantLock
race:^java.lang.ref.SoftReference.get
-Man
On Fri, Sep 18, 2020 at 6:39 AM Jérémy Coulon <jeremy.coulon.jrmc at gmail.com>
wrote:
> Hello
>
> I would love to use TSan in my project that uses both Java and C++
> code (via JNI).
> openjdk-tsan looks the perfect solution but I wonder if it is advanced
> enough to give me useful results.
>
> I built openjdk-tsan with gcc9. Currently I have a lot of reports from
> the JVM itself.
>
> For example, TSan says I have a data race in
> java.lang.ClassLoader.loadClass():
>
> > ==================
> > WARNING: ThreadSanitizer: data race (pid=358045)
> > Read of size 4 at 0x0005cf6fe900 by thread T24 (mutexes: write
> > M1068479037050653848, write M699465342575271728, write
> M210543308024232960,
> > write M226868856673487656, write M289074826522627400, write
> > M469218811642843152, write M236439005409773704, write M331748, write
> > M848084129784262448):
> > #0 java.nio.Buffer.position()I Buffer.java:291
> > #1 java.util.zip.Inflater.inflate([BII)I Inflater.java:386
> > #2 java.util.zip.InflaterInputStream.read([BII)I
> > InflaterInputStream.java:152
> > #3 jdk.internal.loader.Resource.getBytes()[B Resource.java:126
> > #4
> >
> jdk.internal.loader.BuiltinClassLoader.defineClass(Ljava/lang/String;L
> jdk/internal/loader/Resource;)Ljava/lang/Class;
> > BuiltinClassLoader.java:822
> > #5
> >
> jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(Ljav
> a/lang/String;)Ljava/lang/Class;
> > BuiltinClassLoader.java:723
> > #6
> >
> jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(Ljava/lang/Stri
> ng;Z)Ljava/lang/Class;
> > BuiltinClassLoader.java:646
> > #7
> >
> jdk.internal.loader.BuiltinClassLoader.loadClass(Ljava/lang/String;Z)L
> java/lang/Class;
> > BuiltinClassLoader.java:604
> > #8
> >
> jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Ljava/lang/S
> tring;Z)Ljava/lang/Class;
> > ClassLoaders.java:178
> > #9
> > java.lang.ClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;
> > ClassLoader.java:523
> > #10 (Generated Stub) <null>
> >
>
>
> Previous write of size 4 at 0x0005cf6fe900 by thread T25 (mutexes:
> write
> > M1144758755745824288, write M1145040230722535312, write
> > M1144758755722805080, write M1145040230699515824, write
> > M1144758755745928632, write M1145040230722639376, write
> M24769823420602496,
> > write M19025):
> > #0 java.nio.Buffer.position(I)Ljava/nio/Buffer; Buffer.java:310
> > #1 java.nio.ByteBuffer.position(I)Ljava/nio/ByteBuffer;
> > ByteBuffer.java:1309
> > #2 java.util.zip.Inflater.inflate([BII)I Inflater.java:427
> > #3 java.util.zip.InflaterInputStream.read([BII)I
> > InflaterInputStream.java:152
> > #4 jdk.internal.loader.Resource.getBytes()[B Resource.java:126
> > #5
> >
> jdk.internal.loader.BuiltinClassLoader.defineClass(Ljava/lang/String;L
> jdk/internal/loader/Resource;)Ljava/lang/Class;
> > BuiltinClassLoader.java:822
> > #6
> >
> jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(Ljav
> a/lang/String;)Ljava/lang/Class;
> > BuiltinClassLoader.java:723
> > #7
> >
> jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(Ljava/lang/Stri
> ng;Z)Ljava/lang/Class;
> > BuiltinClassLoader.java:646
> > #8
> >
> jdk.internal.loader.BuiltinClassLoader.loadClass(Ljava/lang/String;Z)L
> java/lang/Class;
> > BuiltinClassLoader.java:604
> > #9
> >
> jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Ljava/lang/S
> tring;Z)Ljava/lang/Class;
> > ClassLoaders.java:178
> > #10
> > java.lang.ClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;
> > ClassLoader.java:523
> > #11 (Generated Stub) <null>
> >
>
>
> Mutex M1068479037050653848 is already destroyed.
> > Mutex M699465342575271728 is already destroyed.
> > Mutex M210543308024232960 is already destroyed.
> > Mutex M226868856673487656 is already destroyed.
> > Mutex M289074826522627400 is already destroyed.
> > Mutex M469218811642843152 is already destroyed.
> > Mutex M236439005409773704 is already destroyed.
> >
>
>
> Mutex M331748 (0x0005df799308) created at:
>
> #0 __tsan_java_mutex_lock <null> (libtsan.so.0+0x851b7)
>
> #1 SharedRuntime::tsan_oop_lock(Thread*, oop)
> >
> /data/Jenkins-Slave/workspace/3rd-party_openjdk_develop/.conan/data/op
> enjdk/15.0.0-internal+5b22e18/user/testing/build/5fb562640607222bbb71a
> 57209d2cb3e8de8666a/openjdk/src/hotspot/share/runtime/sharedRuntime.cp
> p:1068
> > (libjvm.so+0x154fbe3)
>
> #2
> >
> jdk.internal.loader.BuiltinClassLoader.loadClass(Ljava/lang/String;Z)L
> java/lang/Class;
> > BuiltinClassLoader.java:604
>
> #3
> >
> jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Ljava/lang/S
> tring;Z)Ljava/lang/Class;
> > ClassLoaders.java:178
>
> #4
> > java.lang.ClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;
> > ClassLoader.java:523
>
> #5 (Generated Stub) <null>
>
>
>
> Mutex M848084129784262448 is already destroyed.
> > Mutex M1144758755745824288 is already destroyed.
> > Mutex M1145040230722535312 is already destroyed.
> > Mutex M1144758755722805080 is already destroyed.
> > Mutex M1145040230699515824 is already destroyed.
> > Mutex M1144758755745928632 is already destroyed.
> > Mutex M1145040230722639376 is already destroyed.
> > Mutex M24769823420602496 is already destroyed.
> >
> > Mutex M19025 (0x0005cf705290) created at:
> > #0 __tsan_java_mutex_lock <null> (libtsan.so.0+0x851b7)
> > #1 SharedRuntime::tsan_oop_lock(Thread*, oop)
> >
> /data/Jenkins-Slave/workspace/3rd-party_openjdk_develop/.conan/data/op
> enjdk/15.0.0-internal+5b22e18/exalead/testing/build/5fb562640607222bbb
> 71a57209d2cb3e8de8666a/openjdk/src/hotspot/share/runtime/sharedRuntime
> .cpp:1068
> > (libjvm.so+0x154fbe3)
> > #2 java.util.zip.InflaterInputStream.read([BII)I
> > InflaterInputStream.java:152
> > #3 jdk.internal.loader.Resource.getBytes()[B Resource.java:126
> > #4
> >
> jdk.internal.loader.BuiltinClassLoader.defineClass(Ljava/lang/String;L
> jdk/internal/loader/Resource;)Ljava/lang/Class;
> > BuiltinClassLoader.java:822
> > #5
> >
> jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(Ljav
> a/lang/String;)Ljava/lang/Class;
> > BuiltinClassLoader.java:723
> > #6
> >
> jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(Ljava/lang/Stri
> ng;Z)Ljava/lang/Class;
> > BuiltinClassLoader.java:646
> > #7
> >
> jdk.internal.loader.BuiltinClassLoader.loadClass(Ljava/lang/String;Z)L
> java/lang/Class;
> > BuiltinClassLoader.java:604
> > #8
> >
> jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Ljava/lang/S
> tring;Z)Ljava/lang/Class;
> > ClassLoaders.java:178
> > #9
> > java.lang.ClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;
> > ClassLoader.java:523
> > #10 (Generated Stub) <null>
> >
>
>
> SUMMARY: ThreadSanitizer: data race Buffer.java:291 in
> > java.nio.Buffer.position()I
>
>
> I suspect that some libraries packaged in the JDK are not instrumented (eg.
> libzip.so).
>
> I also have reports from stuff in java.util.concurrent. For example
> AbstractOwnableSynchronizer or AbstractQueuedSynchronizer.
>
> Any help on whether this is expected behavior would be nice.
>
> Jérémy
>
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
More information about the tsan-dev
mailing list