https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116376
Bug ID: 116376
Summary: `genpreds` segmentation fault caused by dereferencing
null pointer in `gcc/hash_table.h`
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: radek.barton at microsoft dot com
Target Milestone: ---
While building native `aarch64-w64-mingw32` toolchain using
https://github.com/Windows-on-ARM-Experiments/MINGW-packages/blob/woarm64/mingw-w64-gcc/PKGBUILD#L230
MSYS2 recipe, I've encountered `genpreds.exe` segmentation fault crash
happening at
https://github.com/gcc-mirror/gcc/blob/edb2712936368e803fd67aa520323054b2a5c5e7/gcc/hash-table.h#L879
becase the `p` variable being dereferenced is NULL.
I've narrowed down the repro-case to:
```bash
echo "(define_register_constraint \"a\" \"b\" \"c\" \"d\")" > test.md
./genpreds.exe -h test.md
```
and then stepped down the `genpreds.exe`'s code using debugger. The issue seems
to be caused by the fact that `oentries` can be initialized to `NULL` at
https://github.com/gcc-mirror/gcc/blob/edb2712936368e803fd67aa520323054b2a5c5e7/gcc/hash-table.h#L837
as the `m_entries` can be `NULL` in general (due to lazy initialization). Then
`p` can be initialized to `NULL` at
https://github.com/gcc-mirror/gcc/blob/edb2712936368e803fd67aa520323054b2a5c5e7/gcc/hash-table.h#L874
leading to dereferencing `NULL` pointer thre lines further.
The following patch seems to be an ugly workaround:
```patch
diff --git a/gcc/hash-table.h b/gcc/hash-table.h
index 3a52a8b785c..9c809eca5e4 100644
--- a/gcc/hash-table.h
+++ b/gcc/hash-table.h
@@ -874,6 +874,9 @@ hash_table<Descriptor, Lazy, Allocator>::expand ()
value_type *p = oentries;
do
{
+ if (!p)
+ break;
+
value_type &x = *p;
if (is_empty (x))
@@ -896,6 +899,9 @@ hash_table<Descriptor, Lazy, Allocator>::expand ()
gcc_checking_assert (!n_elements && !n_deleted);
+ if (!oentries)
+ return;
+
if (!m_ggc)
Allocator <value_type> ::data_free (oentries);
else
```
This issue seems to be very similar to
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100131 but the affected code is
dated to more than year earlier date.