summaryrefslogtreecommitdiff
path: root/gnu/gcc
diff options
context:
space:
mode:
authorMartynas Venckus <martynas@cvs.openbsd.org>2014-01-14 22:26:31 +0000
committerMartynas Venckus <martynas@cvs.openbsd.org>2014-01-14 22:26:31 +0000
commit91c44e3ea297825ce56fa2c9ecfd74257e131c43 (patch)
treec8a8b81cb0e5cc97f008e9f1048cca54aae21c1b /gnu/gcc
parent23b2746ea3f90ca857d4fd5387efa24da174355c (diff)
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@.
Diffstat (limited to 'gnu/gcc')
-rw-r--r--gnu/gcc/gcc/c-bounded.c23
1 files changed, 21 insertions, 2 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;
}
}
}