Clean up examples for -Wdangling-pointer [PR109708]

gcc/ChangeLog
	PR c/109708
	* doc/invoke.texi (Warning Options): Fix broken example and
	clean up/reorganize the others.  Also describe what the short-form
	options mean.
This commit is contained in:
Sandra Loosemore 2024-01-21 02:36:19 +00:00
parent 11a5f26c4e
commit 29f931e39f

View file

@ -9423,51 +9423,63 @@ levels but may yield different results with optimization than without.
@table @gcctabopt @table @gcctabopt
@item -Wdangling-pointer=1 @item -Wdangling-pointer=1
At level 1 the warning diagnoses only unconditional uses of dangling pointers. At level 1, the warning diagnoses only unconditional uses of dangling pointers.
For example
@smallexample
int f (int c1, int c2, x)
@{
char *p = strchr ((char[])@{ c1, c2 @}, c3);
// warning: dangling pointer to a compound literal
return p ? *p : 'x';
@}
@end smallexample
In the following function the store of the address of the local variable
@code{x} in the escaped pointer @code{*p} also triggers the warning.
@smallexample
void g (int **p)
@{
int x = 7;
// warning: storing the address of a local variable in *p
*p = &x;
@}
@end smallexample
@item -Wdangling-pointer=2 @item -Wdangling-pointer=2
At level 2, in addition to unconditional uses the warning also diagnoses At level 2, in addition to unconditional uses the warning also diagnoses
conditional uses of dangling pointers. conditional uses of dangling pointers.
@end table
For example, because the array @var{a} in the following function is out of The short form @option{-Wdangling-pointer} is equivalent to
scope when the pointer @var{s} that was set to point is used, the warning @option{-Wdangling-pointer=2}, while @option{-Wno-dangling-pointer} and
triggers at this level. @option{-Wdangling-pointer=0} have the same effect of disabling the warnings.
@option{-Wdangling-pointer=2} is included in @option{-Wall}.
This example triggers the warning at level 1; the address of the unnamed
temporary is unconditionally referenced outside of its scope.
@smallexample @smallexample
void f (char *s) char f (char c1, char c2, char c3)
@{
char *p;
@{
p = (char[]) @{ c1, c2, c3 @};
@}
// warning: using dangling pointer 'p' to an unnamed temporary
return *p;
@}
@end smallexample
In the following function the store of the address of the local variable
@code{x} in the escaped pointer @code{*p} triggers the warning at
level 1.
@smallexample
void g (int **p)
@{
int x = 7;
// warning: storing the address of local variable 'x' in '*p'
*p = &x;
@}
@end smallexample
In this example, the array @var{a} is out of
scope when the pointer @var{s} is used. Since the code that sets @code{s}
is conditional, the warning triggers at level 2.
@smallexample
extern void frob (const char *);
void h (char *s)
@{ @{
if (!s) if (!s)
@{ @{
char a[12] = "tmpname"; char a[12] = "tmpname";
s = a; s = a;
@} @}
// warning: dangling pointer to a may be used // warning: dangling pointer 's' to 'a' may be used
strcat (s, ".tmp"); frob (s);
...
@} @}
@end smallexample @end smallexample
@end table
@option{-Wdangling-pointer=2} is included in @option{-Wall}.
@opindex Wdate-time @opindex Wdate-time
@opindex Wno-date-time @opindex Wno-date-time