expr_range.c revision 1.1
1/* $NetBSD: expr_range.c,v 1.1 2021/05/14 21:14:55 rillig Exp $ */ 2# 3 "expr_range.c" 3 4/* 5 * Test whether lint can detect switch branches that are impossible to reach. 6 * As of 2021-05-14, it cannot. To do this, it would need to keep track of 7 * the possible values of each variable or expression. To do this reliably, 8 * it would also need accurate control flow analysis, which as of 2021-05-14 9 * works only for functions without 'goto'. 10 * 11 * GCC 10 does not complain the unreachable branch. It knows that the branch 12 * is unreachable though since it doesn't generate any code for it. GCC once 13 * had the option -Wunreachable-code, but that option was made a no-op in 14 * 2011. 15 * 16 * Clang 10 does not complain about this either, and just like GCC it doesn't 17 * generate any code for this branch. The code for tracking an expression's 18 * possible values may be related to RangeConstraintManager, just guessing. 19 * 20 * There should be at least one static analysis tool that warns about this. 21 */ 22 23/* lint1-extra-flags: -chap */ 24 25void 26example(unsigned x) 27{ 28 switch (x & 6) { 29 case 1: 30 /* This branch is unreachable. */ 31 printf("one\n"); 32 break; 33 case 2: 34 printf("two\n"); 35 break; 36 } 37} 38