From 5c63f38eb11b1898ee768f793bbc074e64b8fecf Mon Sep 17 00:00:00 2001 From: martynas Date: Tue, 14 Jan 2014 22:26:30 +0000 Subject: [PATCH] Add wcstring attribute support for Wbounded. To be used for wchar.h which operates on element counts rather than buffer sizes. I'll start annotating headers in a few weeks, after the hackathon. OK millert@. --- gnu/gcc/gcc/c-bounded.c | 23 +++++++++++++++++++++-- gnu/usr.bin/gcc/gcc/c-bounded.c | 25 ++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/gnu/gcc/gcc/c-bounded.c b/gnu/gcc/gcc/c-bounded.c index 63f6fe0a025..5a3916b60ed 100644 --- a/gnu/gcc/gcc/c-bounded.c +++ b/gnu/gcc/gcc/c-bounded.c @@ -34,7 +34,7 @@ /* Bounded attribute types */ enum bounded_type { buffer_bound_type, string_bound_type, minbytes_bound_type, size_bound_type, - bounded_type_error }; + bounded_type_error, wcstring_bound_type }; typedef struct bound_check_info { @@ -101,7 +101,8 @@ handle_bounded_attribute (node, name, args, flags, no_add_attrs) if (info.bounded_type == size_bound_type || info.bounded_type == string_bound_type - || info.bounded_type == buffer_bound_type) + || info.bounded_type == buffer_bound_type + || info.bounded_type == wcstring_bound_type) { arg_iterate = argument; for (arg_num = 1; ; ++arg_num) @@ -213,6 +214,12 @@ decode_bounded_attr (args, info, validated_p) return false; } break; + case wcstring_bound_type: + if (bounded_size_expr) + warning ( + OPT_Wbounded, "`wcstring' bound type only takes 2 parameters"); + bounded_size_expr = size_int (0); + break; } /* Strip any conversions from the buffer parameters and verify they @@ -291,6 +298,8 @@ decode_bounded_type (s) return minbytes_bound_type; else if (!strcmp (s, "size") || !strcmp (s, "__size__")) return size_bound_type; + else if (!strcmp (s, "wcstring") || !strcmp (s, "__wcstring__")) + return wcstring_bound_type; else return bounded_type_error; } @@ -485,6 +494,16 @@ check_bounded_info (status, info, params) status_warning(status, "array size (%d) smaller than required length (%d * %d)", array_size, length, elem_size); break; + case wcstring_bound_type: + /* warn about illegal bounds value */ + if (length < 0) + status_warning ( + status, "non-positive bounds length (%d) detected", length); + /* check if the static buffer is smaller than bound length */ + if (array_size / type_size < length) + status_warning(status, "array size (%d) smaller than bound length" + " (%d) * sizeof(type)", array_size, length); + break; } } } diff --git a/gnu/usr.bin/gcc/gcc/c-bounded.c b/gnu/usr.bin/gcc/gcc/c-bounded.c index fcfaeba889e..f13d74e549a 100644 --- a/gnu/usr.bin/gcc/gcc/c-bounded.c +++ b/gnu/usr.bin/gcc/gcc/c-bounded.c @@ -31,7 +31,7 @@ /* Bounded attribute types */ enum bounded_type { buffer_bound_type, string_bound_type, minbytes_bound_type, size_bound_type, - bounded_type_error }; + bounded_type_error, wcstring_bound_type }; typedef struct bound_check_info { @@ -98,7 +98,8 @@ handle_bounded_attribute (node, name, args, flags, no_add_attrs) if (info.bounded_type == size_bound_type || info.bounded_type == string_bound_type - || info.bounded_type == buffer_bound_type) + || info.bounded_type == buffer_bound_type + || info.bounded_type == wcstring_bound_type) { arg_iterate = argument; for (arg_num = 1; ; ++arg_num) @@ -209,6 +210,11 @@ decode_bounded_attr (args, info, validated_p) return false; } break; + case wcstring_bound_type: + if (bounded_size_expr) + warning ("`wcstring' bound type only takes 2 parameters"); + bounded_size_expr = size_int (0); + break; } /* Strip any conversions from the buffer parameters and verify they @@ -287,6 +293,8 @@ decode_bounded_type (s) return minbytes_bound_type; else if (!strcmp (s, "size") || !strcmp (s, "__size__")) return size_bound_type; + else if (!strcmp (s, "wcstring") || !strcmp (s, "__wcstring__")) + return wcstring_bound_type; else return bounded_type_error; } @@ -406,7 +414,8 @@ check_bounded_info (status, info, params) STRIP_NOPS (buf_expr); /* Check for a possible sizeof(pointer) error in string functions */ - if (info->bounded_type == string_bound_type + if ((info->bounded_type == string_bound_type + || info->bounded_type == wcstring_bound_type) && SIZEOF_PTR_DERIVED (length_expr)) status_warning(status, "sizeof(pointer) possibly incorrect in argument %d", info->bounded_num); @@ -488,6 +497,16 @@ check_bounded_info (status, info, params) status_warning(status, "array size (%d) smaller than required length (%d * %d)", array_size, length, elem_size); break; + case wcstring_bound_type: + /* warn about illegal bounds value */ + if (length < 0) + status_warning ( + status, "non-positive bounds length (%d) detected", length); + /* check if the static buffer is smaller than bound length */ + if (array_size / type_size < length) + status_warning(status, "array size (%d) smaller than bound length" + " (%d) * sizeof(type)", array_size, length); + break; } } } -- 2.20.1