[PATCH] Fix UB in sched-int.h iterator (PR rtl-optimization/77425)

Jakub Jelinek jakub@redhat.com
Fri Sep 2 15:04:00 GMT 2016


Hi!

We have
#define DEPS_LIST_FIRST(L) ((L)->first)
and first is the field of the struct, so for the case when list is
NULL we do linkp = &list->first; which actually gives us NULL too, but with
UB.  From my analysis of the scheduler code, we should never use linkp (or
anything else in the iterator) after sd_iterator_cond returned false (don't
iterate anymore), so I think it is just fine to keep it pointing to the
previous entry (where *linkp is NULL), instead of setting linkp effectively
to NULL.  All uses of linkp dereference linkp anyway.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2016-09-02  Jakub Jelinek  <jakub@redhat.com>

	PR rtl-optimization/77425
	* sched-int.h (sd_iterator_cond): Don't update it_ptr->linkp if list
	is NULL.

--- gcc/sched-int.h.jj	2016-03-15 17:10:19.000000000 +0100
+++ gcc/sched-int.h	2016-09-01 11:49:52.057719797 +0200
@@ -1624,10 +1624,11 @@ sd_iterator_cond (sd_iterator_def *it_pt
 	      sd_next_list (it_ptr->insn,
 			    &it_ptr->types, &list, &it_ptr->resolved_p);
 
-	      it_ptr->linkp = &DEPS_LIST_FIRST (list);
-
 	      if (list)
-		continue;
+		{
+		  it_ptr->linkp = &DEPS_LIST_FIRST (list);
+		  continue;
+		}
 	    }
 
 	  *dep_ptr = NULL;

	Jakub



More information about the Gcc-patches mailing list