[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