Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 608499 Details for
Bug 850911
g++: operator new[] overflow fix
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Diff to previous patch
incremental.patch (text/plain), 9.62 KB, created by
Florian Weimer
on 2012-08-31 12:31:05 UTC
(
hide
)
Description:
Diff to previous patch
Filename:
MIME Type:
Creator:
Florian Weimer
Created:
2012-08-31 12:31:05 UTC
Size:
9.62 KB
patch
obsolete
>diff -ur -w gcc-4.7.1-20120720.error-instead-of-warning/gcc/cp/call.c gcc-4.7.1-20120720/gcc/cp/call.c >--- gcc-4.7.1-20120720.error-instead-of-warning/gcc/cp/call.c 2012-08-31 14:18:28.991693829 +0200 >+++ gcc-4.7.1-20120720/gcc/cp/call.c 2012-08-31 12:43:18.245314154 +0200 >@@ -3993,7 +3993,7 @@ > /* Update the total size. */ > *size = size_binop (PLUS_EXPR, original_size, *cookie_size); > /* Set to (size_t)-1 if the size check fails. */ >- gcc_assert (size_check != NULL_TREE); >+ if (size_check != NULL_TREE) > *size = fold_build3 (COND_EXPR, sizetype, size_check, > *size, TYPE_MAX_VALUE (sizetype)); > /* Update the argument list to reflect the adjusted size. */ >diff -ur -w gcc-4.7.1-20120720.error-instead-of-warning/gcc/cp/init.c gcc-4.7.1-20120720/gcc/cp/init.c >--- gcc-4.7.1-20120720.error-instead-of-warning/gcc/cp/init.c 2012-08-31 14:18:29.000693818 +0200 >+++ gcc-4.7.1-20120720/gcc/cp/init.c 2012-08-31 13:44:03.616885182 +0200 >@@ -2171,8 +2171,8 @@ > tree outer_nelts = NULL_TREE; > /* For arrays, a bounds checks on the NELTS parameter. */ > tree outer_nelts_check = NULL_TREE; >- bool outer_nelts_from_type = false; > double_int inner_nelts_count = double_int_one; >+ bool inner_nelts_constant = true; > tree alloc_call, alloc_expr; > /* The address returned by the call to "operator new". This node is > a VAR_DECL and is therefore reusable. */ >@@ -2207,14 +2207,10 @@ > } > else if (TREE_CODE (type) == ARRAY_TYPE) > { >- /* Transforms new (T[N]) to new T[N]. The former is a GNU >- extension for variable N. (This also covers new T where T is >- a VLA typedef.) */ > array_p = true; > nelts = array_type_nelts_top (type); > outer_nelts = nelts; > type = TREE_TYPE (type); >- outer_nelts_from_type = true; > } > > /* If our base type is an array, then make sure we know how many elements >@@ -2241,15 +2237,7 @@ > inner_nelts_count = result; > } > else >- { >- if (complain & tf_error) >- { >- error_at (EXPR_LOC_OR_HERE (inner_nelts), >- "array size in operator new must be constant"); >- cxx_constant_value(inner_nelts); >- } >- nelts = error_mark_node; >- } >+ inner_nelts_constant = false; > if (nelts != error_mark_node) > nelts = cp_build_binary_op (input_location, > MULT_EXPR, nelts, >@@ -2257,27 +2245,15 @@ > complain); > } > >- if (variably_modified_type_p (elt_type, NULL_TREE) && (complain & tf_error)) >- { >- error ("variably modified type not allowed in operator new"); >- return error_mark_node; >- } >+ inner_nelts_constant = inner_nelts_constant >+ && !variably_modified_type_p (elt_type, NULL_TREE); >+ if (!inner_nelts_constant) >+ warning (0, "variable-length type in operator new[] prevents " >+ "size overflow checking"); > > if (nelts == error_mark_node) > return error_mark_node; > >- /* Warn if we performed the (T[N]) to T[N] transformation and N is >- variable. */ >- if (outer_nelts_from_type >- && !TREE_CONSTANT (maybe_constant_value (outer_nelts))) >- { >- if (complain & tf_warning_or_error) >- pedwarn(EXPR_LOC_OR_HERE (outer_nelts), OPT_Wvla, >- "ISO C++ does not support variable-length array types"); >- else >- return error_mark_node; >- } >- > if (TREE_CODE (elt_type) == VOID_TYPE) > { > if (complain & tf_error) >@@ -2331,6 +2307,8 @@ > size = size_in_bytes (elt_type); > if (array_p) > { >+ if (inner_nelts_constant) >+ { > /* Maximum available size in bytes. Half of the address space > minus the cookie size. */ > double_int max_size >@@ -2360,7 +2338,8 @@ > error ("size of array is too large"); > return error_mark_node; > } >- max_outer_nelts = double_int_udiv (max_size, inner_size, TRUNC_DIV_EXPR); >+ max_outer_nelts = double_int_udiv (max_size, inner_size, >+ TRUNC_DIV_EXPR); > /* Only keep the top-most seven bits, to simplify encoding the > constant in the instruction stream. */ > { >@@ -2373,13 +2352,15 @@ > HOST_BITS_PER_DOUBLE_INT, false), > shift, HOST_BITS_PER_DOUBLE_INT, false); > } >- max_outer_nelts_tree = double_int_to_tree (sizetype, max_outer_nelts); >+ max_outer_nelts_tree = double_int_to_tree (sizetype, >+ max_outer_nelts); > >- size = size_binop (MULT_EXPR, size, convert (sizetype, nelts)); > outer_nelts_check = fold_build2 (LE_EXPR, boolean_type_node, > outer_nelts, > max_outer_nelts_tree); > } >+ size = size_binop (MULT_EXPR, size, convert (sizetype, nelts)); >+ } > > alloc_fn = NULL_TREE; > >diff -ur -w gcc-4.7.1-20120720.error-instead-of-warning/gcc/cp/parser.c gcc-4.7.1-20120720/gcc/cp/parser.c >--- gcc-4.7.1-20120720.error-instead-of-warning/gcc/cp/parser.c 2012-08-31 14:18:29.007693811 +0200 >+++ gcc-4.7.1-20120720/gcc/cp/parser.c 2012-07-18 09:08:55.000000000 +0200 >@@ -6878,12 +6878,13 @@ > while (true) > { > tree expression; >- cp_token *token; > > /* Look for the opening `['. */ > cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE); >- >- token = cp_lexer_peek_token (parser->lexer); >+ /* The first expression is not required to be constant. */ >+ if (!declarator) >+ { >+ cp_token *token = cp_lexer_peek_token (parser->lexer); > expression = cp_parser_expression (parser, /*cast_p=*/false, NULL); > /* The standard requires that the expression have integral > type. DR 74 adds enumeration types. We believe that the >@@ -6905,7 +6906,13 @@ > expression = error_mark_node; > } > } >- >+ } >+ /* But all the other expressions must be. */ >+ else >+ expression >+ = cp_parser_constant_expression (parser, >+ /*allow_non_constant=*/false, >+ NULL); > /* Look for the closing `]'. */ > cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE); > >diff -ur -w gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/cpp0x/regress/debug-debug7.C gcc-4.7.1-20120720/gcc/testsuite/g++.dg/cpp0x/regress/debug-debug7.C >--- gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/cpp0x/regress/debug-debug7.C 2012-08-31 14:18:29.010693806 +0200 >+++ gcc-4.7.1-20120720/gcc/testsuite/g++.dg/cpp0x/regress/debug-debug7.C 2011-12-20 13:54:31.000000000 +0100 >@@ -7,8 +7,8 @@ > main() { > > int a = 4; >- int b = 5; >- int (*x)[b] = new int[a][b]; // { dg-error "array size.*must be constant|usable in a constant" } >+ int b = 5; // { dg-message "not const" } >+ int (*x)[b] = new int[a][b]; // { dg-error "not usable" } > > x[2][1] = 7; > >diff -ur -w gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/ext/vla5.C gcc-4.7.1-20120720/gcc/testsuite/g++.dg/ext/vla5.C >--- gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/ext/vla5.C 2012-08-31 14:18:29.011693805 +0200 >+++ gcc-4.7.1-20120720/gcc/testsuite/g++.dg/ext/vla5.C 2011-12-20 13:54:18.000000000 +0100 >@@ -6,5 +6,5 @@ > void > test (int a) > { >- new (char[a]); // { dg-warning "variable-length array" } >+ new (char[a]); > } >diff -ur -w gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/ext/vla8.C gcc-4.7.1-20120720/gcc/testsuite/g++.dg/ext/vla8.C >--- gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/ext/vla8.C 2012-08-31 14:18:29.011693805 +0200 >+++ gcc-4.7.1-20120720/gcc/testsuite/g++.dg/ext/vla8.C 2011-12-20 13:54:18.000000000 +0100 >@@ -8,8 +8,8 @@ > > AvlTreeIter() > { >- new (void* [Num()]); // { dg-warning "variable-length array" } >+ new (void* [Num()]); > } > }; > >-AvlTreeIter<int> a; // { dg-message "from here" } >+AvlTreeIter<int> a; >diff -ur -w gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/init/new35.C gcc-4.7.1-20120720/gcc/testsuite/g++.dg/init/new35.C >--- gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/init/new35.C 2012-08-31 14:18:29.012693804 +0200 >+++ gcc-4.7.1-20120720/gcc/testsuite/g++.dg/init/new35.C 2012-08-31 13:47:29.776775313 +0200 >@@ -5,9 +5,9 @@ > main (int argc, char **argv) > { > typedef char A[argc]; >- new A; // { dg-warning "variable-length array types|not a constant" } >- new A[0]; // { dg-error "must be constant|not a constant" } >- new A[5]; // { dg-error "must be constant|not a constant" } >- new (A[0]); // { dg-error "must be constant|not a constant" } >- new (A[5]); // { dg-error "must be constant|not a constant" } >+ new A; >+ new A[0]; // { dg-warning "prevents size overflow checking" } >+ new A[5]; // { dg-warning "prevents size overflow checking" } >+ new (A[0]); // { dg-warning "prevents size overflow checking" } >+ new (A[5]); // { dg-warning "prevents size overflow checking" } > } >diff -ur -w gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/init/new37.C gcc-4.7.1-20120720/gcc/testsuite/g++.dg/init/new37.C >--- gcc-4.7.1-20120720.error-instead-of-warning/gcc/testsuite/g++.dg/init/new37.C 2012-08-31 14:18:29.012693804 +0200 >+++ gcc-4.7.1-20120720/gcc/testsuite/g++.dg/init/new37.C 2012-08-31 14:02:49.163830153 +0200 >@@ -1,10 +1,11 @@ > // { dg-do compile } >+// { dg-options "-Wno-vla -fno-permissive -std=gnu++98" } > > void > nonconst(int n) > { >- new (long[n][n]); // { dg-error "variable length|array size|not a constant" } >- new long[n][n]; // { dg-error "variable length|array size|not a constant" } >+ new (long[n][n]); // { dg-warning "prevents size overflow checking" } >+ new long[n][n]; // { dg-error "cannot appear in a constant-expression" } > } > > template <typename T> >@@ -18,7 +19,7 @@ > void * > callnew_fail_1(int n) > { >- return new long[n][T::n]; // { dg-error "variable length|array size|usable in a constant" } >+ return new long[n][T::n]; // { dg-warning "prevents size overflow checking" } > } > > template <typename T> >@@ -40,7 +41,7 @@ > }; > > struct T2 { >- static const double n = 2; // { dg-error "non-integral type" } >+ static const double n = 2; > }; > > struct T3 { >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 850911
:
606350
|
608498
| 608499 |
618101
|
618142
|
618143