diff options
author | Mark Wielaard <mjw@redhat.com> | 2015-09-10 15:29:44 +0000 |
---|---|---|
committer | Mark Wielaard <mark@gcc.gnu.org> | 2015-09-10 15:29:44 +0000 |
commit | dbb68221b64c0174eeb22d878a8e078775ee73bf (patch) | |
tree | f34f064a585942929fce66827ae853b1f48d5357 /gcc/cp/typeck.c | |
parent | 0815fd250302b45a3aadd9b32d8559c7b47d86e4 (diff) | |
download | gcc-dbb68221b64c0174eeb22d878a8e078775ee73bf.zip gcc-dbb68221b64c0174eeb22d878a8e078775ee73bf.tar.gz gcc-dbb68221b64c0174eeb22d878a8e078775ee73bf.tar.bz2 |
Warn when comparing nonnull arguments to NULL in a function.
If an argument is marked as nonnull then passing in a NULL argument
will produce bad results even if the code checks against NULL. GCC
might optimize such checks away so warn the user when the function
contains such comparisons.
nn.c: In function ‘foo’:
nn.c:6:27: warning: nonnull argument ‘bar’ compared to NULL [-Wnonnull]
void foo(void *bar) { if (!bar) abort(); }
^
gcc/ChangeLog
* doc/invoke.texi (Wnonnull): Also warns when comparing against NULL.
gcc/c/ChangeLog
* c-typeck.c (build_binary_op): Check and warn when nonnull arg
parm against NULL.
gcc/cp/ChangeLog
* typeck.c (cp_build_binary_op): Check and warn when nonnull arg
parm against NULL.
gcc/testsuite/ChangeLog
* c-c++-common/nonnull-1.c: New test.
From-SVN: r227649
Diffstat (limited to 'gcc/cp/typeck.c')
-rw-r--r-- | gcc/cp/typeck.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 388558c..482e42c 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4438,6 +4438,11 @@ cp_build_binary_op (location_t location, || (code0 == POINTER_TYPE && TYPE_PTR_P (type1) && integer_zerop (op1))) { + if (warn_nonnull + && TREE_CODE (op0) == PARM_DECL && nonnull_arg_p (op0)) + warning_at (location, OPT_Wnonnull, + "nonnull argument %qD compared to NULL", op0); + if (TYPE_PTR_P (type1)) result_type = composite_pointer_type (type0, type1, op0, op1, CPO_COMPARISON, complain); @@ -4477,6 +4482,11 @@ cp_build_binary_op (location_t location, || (code1 == POINTER_TYPE && TYPE_PTR_P (type0) && integer_zerop (op0))) { + if (warn_nonnull + && TREE_CODE (op1) == PARM_DECL && nonnull_arg_p (op1)) + warning_at (location, OPT_Wnonnull, + "nonnull argument %qD compared to NULL", op1); + if (TYPE_PTR_P (type0)) result_type = composite_pointer_type (type0, type1, op0, op1, CPO_COMPARISON, complain); |