Module Name: src Committed By: rillig Date: Sat Jun 11 14:17:33 UTC 2022
Modified Files: src/tests/usr.bin/xlint/lint1: d_c99_bool_strict_syshdr.c d_c99_bool_strict_syshdr.exp Log Message: tests/lint: demonstrate wrong syshdr check in strict bool mode To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 \ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c cvs rdiff -u -r1.16 -r1.17 \ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.exp Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c diff -u src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c:1.15 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c:1.16 --- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c:1.15 Fri May 20 21:03:04 2022 +++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c Sat Jun 11 14:17:33 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: d_c99_bool_strict_syshdr.c,v 1.15 2022/05/20 21:03:04 rillig Exp $ */ +/* $NetBSD: d_c99_bool_strict_syshdr.c,v 1.16 2022/06/11 14:17:33 rillig Exp $ */ # 3 "d_c99_bool_strict_syshdr.c" /* @@ -136,11 +136,11 @@ ch_isspace_sys_bool(char c) * * strcmp: 0 means equal, < 0 means less than, > 0 means greater than * * Without a detailed list of individual functions, it's not possible to - * guess what the return value means. Therefore in strict bool mode, the + * guess what the return value means. Therefore, in strict bool mode, the * return value of these functions cannot be implicitly converted to bool, - * not even in a context where the result is compared to 0. Allowing that - * would allow expressions like !strcmp(s1, s2), which is not correct since - * strcmp returns an "ordered comparison result", not a bool. + * not even in a controlling expression. Allowing that would allow + * expressions like !strcmp(s1, s2), which is not correct since strcmp + * returns an "ordered comparison result", not a bool. */ # 1 "math.h" 3 4 @@ -247,3 +247,42 @@ pass_bool_to_function(void) # 248 "d_c99_bool_strict_syshdr.c" ); } + + +extern int *errno_location(void); + +/* + * As of 2022-06-11, the rule for loosening the strict boolean check for + * expressions from system headers is flawed. That rule allows statements + * like 'if (NULL)' or 'if (errno)', even though these have pointer type or + * integer type. + */ +void +if_pointer_or_int(void) +{ + /* if (NULL) */ + if ( +# 266 "d_c99_bool_strict_syshdr.c" 3 4 + ((void *)0) +# 268 "d_c99_bool_strict_syshdr.c" + ) + return; + /* expect-1: warning: statement not reached [193] */ + + /* if (EXIT_SUCCESS) */ + if ( +# 275 "d_c99_bool_strict_syshdr.c" 3 4 + 0 +# 277 "d_c99_bool_strict_syshdr.c" + ) + return; + /* expect-1: warning: statement not reached [193] */ + + /* if (errno) */ + if ( +# 284 "d_c99_bool_strict_syshdr.c" 3 4 + (*errno_location()) +# 286 "d_c99_bool_strict_syshdr.c" + ) + return; +} Index: src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.exp diff -u src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.exp:1.16 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.exp:1.17 --- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.exp:1.16 Thu May 19 17:24:14 2022 +++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.exp Sat Jun 11 14:17:33 2022 @@ -6,3 +6,5 @@ d_c99_bool_strict_syshdr.c(172): error: d_c99_bool_strict_syshdr.c(172): warning: function 'str_equal_bad' expects to return value [214] d_c99_bool_strict_syshdr.c(229): error: argument #1 expects '_Bool', gets passed 'int' [334] d_c99_bool_strict_syshdr.c(242): error: argument #1 expects '_Bool', gets passed 'int' [334] +d_c99_bool_strict_syshdr.c(269): warning: statement not reached [193] +d_c99_bool_strict_syshdr.c(278): warning: statement not reached [193]