Module Name: src Committed By: rillig Date: Tue Jan 5 22:38:51 UTC 2021
Modified Files: src/tests/usr.bin/xlint/lint1: msg_324.c msg_324.exp Log Message: lint: add test for "suggest cast" [324] This warning is the only one that calls print_tnode, which in turn uses the redundant operator names in str_op_t. There is another list of operator names in ops.c, but those names include more clutter, for example "p + p" instead of a simple "+". Using those operator names would therefore rather be confusing. These two lists should be merged, to remove unnecessary redundancy. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/xlint/lint1/msg_324.c \ src/tests/usr.bin/xlint/lint1/msg_324.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/msg_324.c diff -u src/tests/usr.bin/xlint/lint1/msg_324.c:1.1 src/tests/usr.bin/xlint/lint1/msg_324.c:1.2 --- src/tests/usr.bin/xlint/lint1/msg_324.c:1.1 Sat Jan 2 10:22:44 2021 +++ src/tests/usr.bin/xlint/lint1/msg_324.c Tue Jan 5 22:38:51 2021 @@ -1,7 +1,40 @@ -/* $NetBSD: msg_324.c,v 1.1 2021/01/02 10:22:44 rillig Exp $ */ +/* $NetBSD: msg_324.c,v 1.2 2021/01/05 22:38:51 rillig Exp $ */ # 3 "msg_324.c" // Test for message: suggest cast from '%s' to '%s' on op %s to avoid overflow [324] -TODO: "Add example code that triggers the above message." -TODO: "Add example code that almost triggers the above message." +/* + * This warning applies to binary operators if the result of the operator + * is converted to a type that is bigger than the operands' result type + * after the usual arithmetic promotions. + * + * In such a case, the operator's result would be truncated to the operator's + * result type (invoking undefined behavior for signed integers), and that + * truncated value would then be converted. At that point, a few bits may + * have been lost. + */ + +/* lint1-flags: -g -S -w -P */ + +void +example(char c, int i, unsigned u) +{ + long l; + unsigned long ul; + + l = c + i; + l = i - c; + ul = c * u; + ul = u + c; + ul = i - u; + ul = u * i; + l = i << c; + + /* + * The operators SHR, DIV and MOD cannot produce an overflow, + * therefore no warning is necessary for them. + */ + l = i >> c; + ul = u / c; + ul = u % c; +} Index: src/tests/usr.bin/xlint/lint1/msg_324.exp diff -u src/tests/usr.bin/xlint/lint1/msg_324.exp:1.1 src/tests/usr.bin/xlint/lint1/msg_324.exp:1.2 --- src/tests/usr.bin/xlint/lint1/msg_324.exp:1.1 Sat Jan 2 10:22:44 2021 +++ src/tests/usr.bin/xlint/lint1/msg_324.exp Tue Jan 5 22:38:51 2021 @@ -1 +1,7 @@ -msg_324.c(6): syntax error ':' [249] +msg_324.c(25): warning: suggest cast from 'int' to 'long' on op + to avoid overflow [324] +msg_324.c(26): warning: suggest cast from 'int' to 'long' on op - to avoid overflow [324] +msg_324.c(27): warning: suggest cast from 'unsigned int' to 'unsigned long' on op * to avoid overflow [324] +msg_324.c(28): warning: suggest cast from 'unsigned int' to 'unsigned long' on op + to avoid overflow [324] +msg_324.c(29): warning: suggest cast from 'unsigned int' to 'unsigned long' on op - to avoid overflow [324] +msg_324.c(30): warning: suggest cast from 'unsigned int' to 'unsigned long' on op * to avoid overflow [324] +msg_324.c(31): warning: suggest cast from 'int' to 'long' on op << to avoid overflow [324]