Avoid expecting nonzero size for access none void* arguments [PR101751].
Resolves: PR middle-end/101751 - attribute access none with void pointer expects nonzero size gcc/ChangeLog: PR middle-end/101751 * doc/extend.texi (attribute access): Adjust. * gimple-ssa-warn-access.cc (pass_waccess::maybe_check_access_sizes): Treat access mode none on a void* argument as expecting as few as zero bytes. gcc/testsuite/ChangeLog: PR middle-end/101751 * gcc.dg/Wstringop-overflow-86.c: New test.
This commit is contained in:
parent
a2c12cb708
commit
9eeca99ccc
3 changed files with 70 additions and 2 deletions
|
@ -2524,7 +2524,6 @@ The following attributes are supported on most targets.
|
|||
@table @code
|
||||
@c Keep this table alphabetized by attribute name. Treat _ as space.
|
||||
|
||||
@item access
|
||||
@itemx access (@var{access-mode}, @var{ref-index})
|
||||
@itemx access (@var{access-mode}, @var{ref-index}, @var{size-index})
|
||||
|
||||
|
@ -2598,7 +2597,9 @@ __attribute__ ((access (write_only, 1, 2), access (read_write, 3))) int fgets (c
|
|||
The access mode @code{none} specifies that the pointer to which it applies
|
||||
is not used to access the referenced object at all. Unless the pointer is
|
||||
null the pointed-to object must exist and have at least the size as denoted
|
||||
by the @var{size-index} argument. The object need not be initialized.
|
||||
by the @var{size-index} argument. When the optional @var{size-index}
|
||||
argument is omitted for an argument of @code{void*} type the actual pointer
|
||||
agument is ignored. The referenced object need not be initialized.
|
||||
The mode is intended to be used as a means to help validate the expected
|
||||
object size, for example in functions that call @code{__builtin_object_size}.
|
||||
@xref{Object Size Checking}.
|
||||
|
|
|
@ -2998,6 +2998,10 @@ pass_waccess::maybe_check_access_sizes (rdwr_map *rwm, tree fndecl, tree fntype,
|
|||
if (access.second.minsize
|
||||
&& access.second.minsize != HOST_WIDE_INT_M1U)
|
||||
access_nelts = build_int_cstu (sizetype, access.second.minsize);
|
||||
else if (VOID_TYPE_P (argtype) && access.second.mode == access_none)
|
||||
/* Treat access mode none on a void* argument as expecting
|
||||
as little as zero bytes. */
|
||||
access_nelts = size_zero_node;
|
||||
else
|
||||
access_nelts = size_one_node;
|
||||
}
|
||||
|
|
63
gcc/testsuite/gcc.dg/Wstringop-overflow-86.c
Normal file
63
gcc/testsuite/gcc.dg/Wstringop-overflow-86.c
Normal file
|
@ -0,0 +1,63 @@
|
|||
/* PR middle-end/101751 - attribute access none with void pointer expects
|
||||
nonzero size
|
||||
{ dg-do compile }
|
||||
{ dg-options "-Wall" } */
|
||||
|
||||
__attribute__ ((access (none, 1))) void
|
||||
fvp_m1 (const void*);
|
||||
|
||||
void nowarn_m1 (void)
|
||||
{
|
||||
/* Verify these don't trigger a warning for calls to a function
|
||||
declared with attribute access none. */
|
||||
fvp_m1 ((void*)-1); // { dg-bogus "-Wstringop-" }
|
||||
fvp_m1 ((void*)1); // { dg-bogus "-Wstringop-" }
|
||||
}
|
||||
|
||||
|
||||
__attribute__ ((access (none, 1))) void
|
||||
fvp_none (void*);
|
||||
|
||||
void nowarn_c_cp1 (void)
|
||||
{
|
||||
char c;
|
||||
fvp_none (&c);
|
||||
fvp_none (&c + 1); // { dg-bogus "-Wstringop-" }
|
||||
}
|
||||
|
||||
void nowarn_f_fp1 (void)
|
||||
{
|
||||
fvp_none ((char*)&nowarn_f_fp1);
|
||||
fvp_none ((char*)&nowarn_f_fp1 + 1);
|
||||
}
|
||||
|
||||
void nowarn_sp1_sp_4 (void)
|
||||
{
|
||||
fvp_none ("" + 1); // { dg-bogus "-Wstringop-" }
|
||||
fvp_none ("123" + 4); // { dg-bogus "-Wstringop-" }
|
||||
}
|
||||
|
||||
|
||||
__attribute__ ((access (none, 1))) void
|
||||
wfvp_none (void*); // { dg-message "in a call to function 'wfvp_none' declared with attribute 'access \\\(none, 1\\\)'" }
|
||||
|
||||
void warn_cm1_p1 (void)
|
||||
{
|
||||
char c;
|
||||
/* With optimization both of the following are diagnosed by -Warray-bounds.
|
||||
The second also without optimization by -Wstringop-overread. They
|
||||
should both be diagnosed by the same warning even without optimization. */
|
||||
wfvp_none (&c - 1); // { dg-warning "" "pr??????" { xfail *-*-* } }
|
||||
wfvp_none (&c + 2); // { dg-warning "" }
|
||||
}
|
||||
|
||||
void warn_fp2 (void)
|
||||
{
|
||||
void *p = (char*)&warn_fp2 + sizeof warn_fp2;
|
||||
fvp_none (p); // { dg-warning "" "pr??????" { xfail *-*-* } }
|
||||
}
|
||||
|
||||
void warn_sp2 (void)
|
||||
{
|
||||
wfvp_none ("" + 2); // { dg-warning "" }
|
||||
}
|
Loading…
Add table
Reference in a new issue