diff options
author | Nathan Sidwell <nathan@acm.org> | 2017-06-16 14:49:35 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2017-06-16 14:49:35 +0000 |
commit | ba27a39d379b3ac69bd81944b65a99a0f02f240d (patch) | |
tree | 28d058a0c8c6a9c3169cc5cb9a5599048718b435 | |
parent | 0d1dc5862f978beb28c76b91b137ccc23f747498 (diff) | |
download | gcc-ba27a39d379b3ac69bd81944b65a99a0f02f240d.zip gcc-ba27a39d379b3ac69bd81944b65a99a0f02f240d.tar.gz gcc-ba27a39d379b3ac69bd81944b65a99a0f02f240d.tar.bz2 |
class.c (resort_type_method_vec): Avoid potential unsigned overflow.
* class.c (resort_type_method_vec): Avoid potential unsigned
overflow.
From-SVN: r249265
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/class.c | 34 |
2 files changed, 20 insertions, 17 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ff832f8..2d7ee17 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2017-06-16 Nathan Sidwell <nathan@acm.org> + * class.c (resort_type_method_vec): Avoid potential unsigned + overflow. + Don't defer noexcept_deferred_spec. * cp-tree.h (unevaluated_noexcept_spec): Don't declare. * decl.c (cxx_init_decl_processing): Initialize diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 054dd3e..1243f33 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -2328,25 +2328,25 @@ resort_type_method_vec (void* obj, gt_pointer_operator new_value, void* cookie) { - vec<tree, va_gc> *method_vec = (vec<tree, va_gc> *) obj; - int len = vec_safe_length (method_vec); - size_t slot; - tree fn; + if (vec<tree, va_gc> *method_vec = (vec<tree, va_gc> *) obj) + { + int len = method_vec->length (); + int slot; - /* The type conversion ops have to live at the front of the vec, so we - can't sort them. */ - for (slot = CLASSTYPE_FIRST_CONVERSION_SLOT; - vec_safe_iterate (method_vec, slot, &fn); - ++slot) - if (!DECL_CONV_FN_P (OVL_FIRST (fn))) - break; + /* The type conversion ops have to live at the front of the vec, so we + can't sort them. */ + for (slot = CLASSTYPE_FIRST_CONVERSION_SLOT; + slot < len; slot++) + if (!DECL_CONV_FN_P (OVL_FIRST ((*method_vec)[slot]))) + break; - if (len - slot > 1) - { - resort_data.new_value = new_value; - resort_data.cookie = cookie; - qsort (method_vec->address () + slot, len - slot, sizeof (tree), - resort_method_name_cmp); + if (len > slot + 1) + { + resort_data.new_value = new_value; + resort_data.cookie = cookie; + qsort (method_vec->address () + slot, len - slot, sizeof (tree), + resort_method_name_cmp); + } } } |