gdb: add asserts in thread code
authorSimon Marchi <simon.marchi@polymtl.ca>
Mon, 22 Feb 2021 16:42:03 +0000 (11:42 -0500)
committerSimon Marchi <simon.marchi@polymtl.ca>
Mon, 22 Feb 2021 16:42:03 +0000 (11:42 -0500)
Unlike the previous patch, I don't propose that we take this patch into
gdb-10-branch.

This patch adds two asserts, prompted by investigating and fixing the
bug fixed by the previous patch.

The assert in find_thread_ptid would have caught the original issue
before the segfault (I think it's slightly more use friendly).

The assert in add_thread_silent would have made it clear that the
solution proposed in [1] isn't the right one.  The solution ended up
passing nullptr as a target to add_thread.  We don't want that, because
add_thread_silent uses it to look up the inferior to which to add the
thread.  If the target is nullptr, we could find an inferior with the
same pid, but belonging to an unrelated target.  So we always want a
non-nullptr target in add_thread_silent.

gdb/ChangeLog:

* thread.c (add_thread_silent): Add assert.
(find_thread_ptid): Add assert.

[1] https://sourceware.org/pipermail/gdb-patches/2021-February/176202.html

Change-Id: Ie593ee45c5eb02235e8e9fbcda612d48ce883852

gdb/ChangeLog
gdb/thread.c

index c2c86705e0c3b3d9f4987bdb87c7b974bcc705fa..9de0e235dc0cd089115936a5ef5330c69ca644b0 100644 (file)
@@ -1,3 +1,8 @@
+2021-02-22  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * thread.c (add_thread_silent): Add assert.
+       (find_thread_ptid): Add assert.
+
 2021-02-22  Simon Marchi  <simon.marchi@polymtl.ca>
 
        PR gdb/27435
index 821070672171ced92106aee99df897b051a310eb..3e7d6e14bf740a4d9b28972a6c279961e318f8ec 100644 (file)
@@ -246,6 +246,8 @@ new_thread (struct inferior *inf, ptid_t ptid)
 struct thread_info *
 add_thread_silent (process_stratum_target *targ, ptid_t ptid)
 {
+  gdb_assert (targ != nullptr);
+
   inferior *inf = find_inferior_ptid (targ, ptid);
 
   /* We may have an old thread with the same id in the thread list.
@@ -535,6 +537,8 @@ find_thread_ptid (process_stratum_target *targ, ptid_t ptid)
 struct thread_info *
 find_thread_ptid (inferior *inf, ptid_t ptid)
 {
+  gdb_assert (inf != nullptr);
+
   for (thread_info *tp : inf->non_exited_threads ())
     if (tp->ptid == ptid)
       return tp;