Home | History | Annotate | Line # | Download | only in lint1
msg_132.c revision 1.10
      1  1.10  rillig /*	$NetBSD: msg_132.c,v 1.10 2022/05/26 07:03:03 rillig Exp $	*/
      2   1.1  rillig # 3 "msg_132.c"
      3   1.1  rillig 
      4   1.1  rillig // Test for message: conversion from '%s' to '%s' may lose accuracy [132]
      5   1.1  rillig 
      6   1.3  rillig /*
      7   1.3  rillig  * NetBSD's default lint flags only include a single -a, which only flags
      8   1.3  rillig  * narrowing conversions from long.  To get warnings for all narrowing
      9   1.9  rillig  * conversions, -a needs to be given more than once.
     10   1.3  rillig  *
     11   1.3  rillig  * https://gnats.netbsd.org/14531
     12   1.3  rillig  */
     13   1.3  rillig 
     14   1.3  rillig /* lint1-extra-flags: -aa */
     15   1.3  rillig 
     16   1.9  rillig unsigned char u8;
     17   1.9  rillig unsigned short u16;
     18   1.9  rillig unsigned int u32;
     19   1.9  rillig unsigned long long u64;
     20   1.9  rillig 
     21   1.9  rillig signed char s8;
     22   1.9  rillig signed short s16;
     23   1.9  rillig signed int s32;
     24   1.9  rillig signed long long s64;
     25   1.3  rillig 
     26   1.3  rillig void
     27   1.9  rillig unsigned_to_unsigned(void)
     28   1.3  rillig {
     29   1.9  rillig 	u8 = u16;		/* expect: 132 */
     30   1.9  rillig 	u8 = u32;		/* expect: 132 */
     31   1.9  rillig 	u8 = u64;		/* expect: 132 */
     32   1.9  rillig 
     33   1.9  rillig 	u16 = u8;
     34   1.9  rillig 	u16 = u32;		/* expect: 132 */
     35   1.9  rillig 	u16 = u64;		/* expect: 132 */
     36   1.9  rillig 
     37   1.9  rillig 	u32 = u8;
     38   1.9  rillig 	u32 = u16;
     39   1.9  rillig 	u32 = u64;		/* expect: 132 */
     40   1.9  rillig 
     41   1.9  rillig 	u64 = u8;
     42   1.9  rillig 	u64 = u16;
     43   1.9  rillig 	u64 = u32;
     44   1.3  rillig }
     45   1.3  rillig 
     46   1.3  rillig void
     47   1.9  rillig unsigned_to_signed(void)
     48   1.3  rillig {
     49   1.9  rillig 	s8 = u16;		/* expect: 132 */
     50   1.9  rillig 	s8 = u32;		/* expect: 132 */
     51   1.9  rillig 	s8 = u64;		/* expect: 132 */
     52   1.9  rillig 
     53   1.9  rillig 	s16 = u8;
     54   1.9  rillig 	s16 = u32;		/* expect: 132 */
     55   1.9  rillig 	s16 = u64;		/* expect: 132 */
     56   1.9  rillig 
     57   1.9  rillig 	s32 = u8;
     58   1.9  rillig 	s32 = u16;
     59   1.9  rillig 	s32 = u64;		/* expect: 132 */
     60   1.9  rillig 
     61   1.9  rillig 	s64 = u8;
     62   1.9  rillig 	s64 = u16;
     63   1.9  rillig 	s64 = u32;
     64   1.9  rillig }
     65   1.9  rillig 
     66   1.9  rillig void
     67   1.9  rillig signed_to_unsigned(void)
     68   1.9  rillig {
     69   1.9  rillig 	u8 = s16;		/* expect: 132 */
     70   1.9  rillig 	u8 = s32;		/* expect: 132 */
     71   1.9  rillig 	u8 = s64;		/* expect: 132 */
     72   1.9  rillig 
     73   1.9  rillig 	u16 = s8;
     74   1.9  rillig 	u16 = s32;		/* expect: 132 */
     75   1.9  rillig 	u16 = s64;		/* expect: 132 */
     76   1.9  rillig 
     77   1.9  rillig 	u32 = s8;
     78   1.9  rillig 	u32 = s16;
     79   1.9  rillig 	u32 = s64;		/* expect: 132 */
     80   1.9  rillig 
     81   1.9  rillig 	u64 = s8;
     82   1.9  rillig 	u64 = s16;
     83   1.9  rillig 	u64 = s32;
     84   1.9  rillig }
     85   1.9  rillig 
     86   1.9  rillig void
     87   1.9  rillig signed_to_signed(void)
     88   1.9  rillig {
     89   1.9  rillig 	s8 = s16;		/* expect: 132 */
     90   1.9  rillig 	s8 = s32;		/* expect: 132 */
     91   1.9  rillig 	s8 = s64;		/* expect: 132 */
     92   1.9  rillig 
     93   1.9  rillig 	s16 = s8;
     94   1.9  rillig 	s16 = s32;		/* expect: 132 */
     95   1.9  rillig 	s16 = s64;		/* expect: 132 */
     96   1.9  rillig 
     97   1.9  rillig 	s32 = s8;
     98   1.9  rillig 	s32 = s16;
     99   1.9  rillig 	s32 = s64;		/* expect: 132 */
    100   1.9  rillig 
    101   1.9  rillig 	s64 = s8;
    102   1.9  rillig 	s64 = s16;
    103   1.9  rillig 	s64 = s32;
    104   1.3  rillig }
    105   1.4  rillig 
    106   1.5  rillig /*
    107   1.9  rillig  * Before tree.c 1.268 from 2021-04-06, lint wrongly warned that conversion
    108   1.9  rillig  * to _Bool might lose accuracy.  C99 6.3.1.2 defines a special conversion
    109   1.9  rillig  * rule from scalar to _Bool though by comparing the value to 0.
    110   1.5  rillig  */
    111   1.4  rillig _Bool
    112   1.4  rillig to_bool(long a, long b)
    113   1.4  rillig {
    114   1.4  rillig 	/* seen in fp_lib.h, function wideRightShiftWithSticky */
    115   1.5  rillig 	return a | b;
    116   1.4  rillig }
    117   1.6  rillig 
    118   1.6  rillig /* ARGSUSED */
    119   1.6  rillig const char *
    120   1.6  rillig cover_build_plus_minus(const char *arr, double idx)
    121   1.6  rillig {
    122   1.6  rillig 	/* expect+3: error: operands of '+' have incompatible types (pointer != double) [107] */
    123   1.6  rillig 	/* expect+2: warning: function 'cover_build_plus_minus' expects to return value [214] */
    124   1.6  rillig 	if (idx > 0.0)
    125   1.6  rillig 		return arr + idx;
    126   1.6  rillig 	return arr + (unsigned int)idx;
    127   1.6  rillig }
    128   1.7  rillig 
    129   1.7  rillig int
    130   1.7  rillig non_constant_expression(void)
    131   1.7  rillig {
    132   1.7  rillig 	/*
    133   1.7  rillig 	 * Even though this variable definition looks like a constant, it
    134   1.7  rillig 	 * does not fall within C's definition of an integer constant
    135   1.7  rillig 	 * expression.  Due to that, lint does not perform constant folding
    136   1.7  rillig 	 * on the expression built from this variable and thus doesn't know
    137   1.7  rillig 	 * that the conversion will always succeed.
    138   1.7  rillig 	 */
    139   1.7  rillig 	const int not_a_constant = 8;
    140   1.8  rillig 	/* expect+1: warning: conversion from 'unsigned long long' to 'int' may lose accuracy [132] */
    141   1.8  rillig 	return not_a_constant * 8ULL;
    142   1.7  rillig }
    143  1.10  rillig 
    144  1.10  rillig typedef unsigned char u8_t;
    145  1.10  rillig typedef unsigned short u16_t;
    146  1.10  rillig typedef unsigned int u32_t;
    147  1.10  rillig typedef unsigned long long u64_t;
    148  1.10  rillig 
    149  1.10  rillig /*
    150  1.10  rillig  * PR 36668 notices that lint wrongly complains about the possible loss.
    151  1.10  rillig  * The expression 'uint8_t << 8' is guaranteed to fit into an 'unsigned short'.
    152  1.10  rillig  * 'unsigned short | unsigned char' is guaranteed to fit into 'unsigned short'
    153  1.10  rillig  */
    154  1.10  rillig static inline u16_t
    155  1.10  rillig be16dec(const void *buf)
    156  1.10  rillig {
    157  1.10  rillig 	const u8_t *p = buf;
    158  1.10  rillig 
    159  1.10  rillig 	/* expect+1: warning: conversion from 'int' to 'unsigned short' may lose accuracy [132] */
    160  1.10  rillig 	return ((u16_t)p[0]) << 8 | p[1];
    161  1.10  rillig }
    162  1.10  rillig 
    163  1.10  rillig /*
    164  1.10  rillig  * Since tree.c 1.434 from 2022-04-19, lint infers the possible values of
    165  1.10  rillig  * expressions of the form 'integer & constant', see can_represent.
    166  1.10  rillig  */
    167  1.10  rillig static inline void
    168  1.10  rillig be32enc(void *buf, u32_t u)
    169  1.10  rillig {
    170  1.10  rillig 	u8_t *p = buf;
    171  1.10  rillig 
    172  1.10  rillig 	p[0] = u >> 24 & 0xff;
    173  1.10  rillig 	p[1] = u >> 16 & 0xff;
    174  1.10  rillig 	p[2] = u >> 8 & 0xff;
    175  1.10  rillig 	p[3] = u & 0xff;
    176  1.10  rillig }
    177