msg_324.c revision 1.6 1 1.6 rillig /* $NetBSD: msg_324.c,v 1.6 2022/06/17 06:59:16 rillig Exp $ */
2 1.1 rillig # 3 "msg_324.c"
3 1.1 rillig
4 1.1 rillig // Test for message: suggest cast from '%s' to '%s' on op %s to avoid overflow [324]
5 1.1 rillig
6 1.2 rillig /*
7 1.2 rillig * This warning applies to binary operators if the result of the operator
8 1.2 rillig * is converted to a type that is bigger than the operands' result type
9 1.2 rillig * after the usual arithmetic promotions.
10 1.2 rillig *
11 1.2 rillig * In such a case, the operator's result would be truncated to the operator's
12 1.2 rillig * result type (invoking undefined behavior for signed integers), and that
13 1.2 rillig * truncated value would then be converted. At that point, a few bits may
14 1.2 rillig * have been lost.
15 1.2 rillig */
16 1.2 rillig
17 1.2 rillig /* lint1-flags: -g -S -w -P */
18 1.2 rillig
19 1.2 rillig void
20 1.2 rillig example(char c, int i, unsigned u)
21 1.2 rillig {
22 1.4 rillig long long ll;
23 1.4 rillig unsigned long long ull;
24 1.2 rillig
25 1.6 rillig /* expect+1: warning: suggest cast from 'int' to 'long long' on op + to avoid overflow [324] */
26 1.6 rillig ll = c + i;
27 1.6 rillig /* expect+1: warning: suggest cast from 'int' to 'long long' on op - to avoid overflow [324] */
28 1.6 rillig ll = i - c;
29 1.6 rillig /* expect+1: warning: suggest cast from 'unsigned int' to 'unsigned long long' on op * to avoid overflow [324] */
30 1.6 rillig ull = c * u;
31 1.6 rillig /* expect+1: warning: suggest cast from 'unsigned int' to 'unsigned long long' on op + to avoid overflow [324] */
32 1.6 rillig ull = u + c;
33 1.6 rillig /* expect+1: warning: suggest cast from 'unsigned int' to 'unsigned long long' on op - to avoid overflow [324] */
34 1.6 rillig ull = i - u;
35 1.6 rillig /* expect+1: warning: suggest cast from 'unsigned int' to 'unsigned long long' on op * to avoid overflow [324] */
36 1.6 rillig ull = u * i;
37 1.6 rillig /* expect+1: warning: suggest cast from 'int' to 'long long' on op << to avoid overflow [324] */
38 1.6 rillig ll = i << c;
39 1.2 rillig
40 1.2 rillig /*
41 1.2 rillig * The operators SHR, DIV and MOD cannot produce an overflow,
42 1.2 rillig * therefore no warning is necessary for them.
43 1.2 rillig */
44 1.4 rillig ll = i >> c;
45 1.4 rillig ull = u / c;
46 1.4 rillig ull = u % c;
47 1.3 rillig
48 1.3 rillig /*
49 1.3 rillig * Assigning the result of an increment or decrement operator to a
50 1.3 rillig * differently-sized type is no unusual that there is no need to warn
51 1.3 rillig * about it. It's also more unlikely that there is an actual loss
52 1.3 rillig * since this only happens for a single value of the old type, unlike
53 1.4 rillig * "ull = u * u", which has many more possibilities for overflowing.
54 1.3 rillig */
55 1.4 rillig ull = u++;
56 1.4 rillig ull = ++u;
57 1.4 rillig ull = u--;
58 1.4 rillig ull = --u;
59 1.2 rillig }
60