https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114757
Bug ID: 114757
Summary: [ASAN] ASAN miscalculates size of region when building
the JDK
Product: gcc
Version: 13.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: other
Assignee: unassigned at gcc dot gnu.org
Reporter: szaldana at redhat dot com
Target Milestone: ---
Hi all,
I've come across an ASAN bug while building mainline JDK.
System: Linux x86
Gcc version: 13.2.1
Please find the stack trace below:
```
/home/szaldana/jdk/src/hotspot/share/gc/z/zMarkStack.cpp: In constructor
‘ZMarkStripeSet::ZMarkStripeSet(uintptr_t)’:
/home/szaldana/jdk/src/hotspot/share/gc/z/zMarkStack.cpp:43:17: error: writing
80 bytes into a region of size 8 [-Werror=stringop-overflow=]
43 | _stripes[i] = ZMarkStripe(base);
| ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
In file included from
/home/szaldana/jdk/src/hotspot/share/gc/z/zMarkStack.inline.hpp:27,
from
/home/szaldana/jdk/src/hotspot/share/gc/z/zMarkStack.cpp:25:
/home/szaldana/jdk/src/hotspot/share/gc/z/zMarkStack.hpp:57:15: note:
destination object ‘ZStackList<ZStack<ZMarkStackEntry, 254> >::_base’ of size 8
57 | uintptr_t _base;
| ^~~~~
/home/szaldana/jdk/src/hotspot/share/gc/z/zMarkStack.cpp:43:17: error: writing
80 bytes into a region of size 8 [-Werror=stringop-overflow=]
43 | _stripes[i] = ZMarkStripe(base);
| ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
/home/szaldana/jdk/src/hotspot/share/gc/z/zMarkStack.hpp:57:15: note:
destination object ‘ZStackList<ZStack<ZMarkStackEntry, 254> >::_base’ of size 8
57 | uintptr_t _base;
| ^~~~~
```
The "region of size 8" seems like a bug in ASAN. It is presumably what ASAN
thinks is the size of ```_stripes[i]``` in
[zMarkStack.cpp](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/gc/z/zMarkStack.cpp#L43),
but that's wrong.
[ZMarkStripe](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/gc/z/zMarkStack.hpp#L82)
is made up of two
[ZStackList](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/gc/z/zMarkStack.hpp#L55)
entries. Note how each one of those is 16 bytes.
Additionally, note how ```ZStackList``` is 64 byte aligned to make each one
have its own cache line. So the memory layout is something like this:
```
0 ---
ZStackList
16 ----
padding
64 ----
ZStackList
80 ---
padding
128 ---
```
Thus, ```sizeof(ZMarkStripe)``` should be 128.
On the other hand, the "writing 80 bytes" seems correct, as that is the size of
```ZMarkStripe``` excluding trailing padding. The assignment doesn't need to
copy that trailing padding.
If you'd like to reproduce the bug, it suffices to [build the
jdk](https://openjdk.org/groups/build/doc/building.html) passing the
```--enable-asan``` flag to the ```bash configure``` arguments.
Find the bug reported in the JDK
[here](https://bugs.openjdk.org/browse/JDK-8330047).
I'm also attaching the log file with the commands that trigger the stack trace
above.
Looking forward to your comments!
Sonia