summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormartynas <martynas@openbsd.org>2014-01-14 22:26:30 +0000
committermartynas <martynas@openbsd.org>2014-01-14 22:26:30 +0000
commit5c63f38eb11b1898ee768f793bbc074e64b8fecf (patch)
tree151d027b5ded0c86ef954fc6387c5fed85c4b70b
parentmost common pbkdf failure is no password, so check that first. (diff)
downloadwireguard-openbsd-5c63f38eb11b1898ee768f793bbc074e64b8fecf.tar.xz
wireguard-openbsd-5c63f38eb11b1898ee768f793bbc074e64b8fecf.zip
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@.
-rw-r--r--gnu/gcc/gcc/c-bounded.c23
-rw-r--r--gnu/usr.bin/gcc/gcc/c-bounded.c25
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;
}
}
}