1 /* $NetBSD: main1.c,v 1.25 2014/04/18 21:53:44 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1994, 1995 Jochen Pohl 5 * All Rights Reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Jochen Pohl for 18 * The NetBSD Project. 19 * 4. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #if HAVE_NBTOOL_CONFIG_H 35 #include "nbtool_config.h" 36 #endif 37 38 #include <sys/cdefs.h> 39 #if defined(__RCSID) && !defined(lint) 40 __RCSID("$NetBSD: main1.c,v 1.25 2014/04/18 21:53:44 christos Exp $"); 41 #endif 42 43 #include <sys/types.h> 44 #include <stdio.h> 45 #include <string.h> 46 #include <stdlib.h> 47 #include <unistd.h> 48 #include <errno.h> 49 #include <limits.h> 50 #include <signal.h> 51 52 #include "lint1.h" 53 54 /* set yydebug to 1*/ 55 int yflag; 56 57 /* 58 * Print warnings if an assignment of an integertype to another integertype 59 * causes an implicit narrowing conversion. If aflag is 1, these warnings 60 * are printed only if the source type is at least as wide as long. If aflag 61 * is greater than 1, they are always printed. 62 */ 63 int aflag; 64 65 /* Print a warning if a break statement cannot be reached. */ 66 int bflag; 67 68 /* Print warnings for pointer casts. */ 69 int cflag; 70 71 /* Print various debug information. */ 72 int dflag; 73 74 /* Perform stricter checking of enum types and operations on enum types. */ 75 int eflag; 76 77 /* Print complete pathnames, not only the basename. */ 78 int Fflag; 79 80 /* Enable some extensions of gcc */ 81 int gflag; 82 83 /* Treat warnings as errors */ 84 int wflag; 85 86 /* 87 * Apply a number of heuristic tests to attempt to intuit bugs, improve 88 * style, and reduce waste. 89 */ 90 int hflag; 91 92 /* Attempt to check portability to other dialects of C. */ 93 int pflag; 94 95 /* 96 * In case of redeclarations/redefinitions print the location of the 97 * previous declaration/definition. 98 */ 99 int rflag; 100 101 /* Strict ANSI C mode. */ 102 int sflag; 103 104 /* Traditional C mode. */ 105 int tflag; 106 107 /* Enable C9X extensions */ 108 int Sflag; 109 110 /* Picky flag */ 111 int Pflag; 112 113 /* 114 * Complain about functions and external variables used and not defined, 115 * or defined and not used. 116 */ 117 int uflag = 1; 118 119 /* Complain about unused function arguments. */ 120 int vflag = 1; 121 122 /* Complain about structures which are never defined. */ 123 int zflag = 1; 124 125 err_set msgset; 126 127 sig_atomic_t fpe; 128 129 static void usage(void); 130 131 static const char builtins[] = 132 "int __builtin_isinf(long double);\n" 133 "int __builtin_isnan(long double);\n" 134 "int __builtin_copysign(long double, long double);\n" 135 ; 136 static size_t builtinlen = sizeof(builtins) - 1; 137 138 static FILE * 139 bltin(void) 140 { 141 #if HAVE_NBTOOL_CONFIG_H 142 char template[] = "/tmp/lint.XXXXXX"; 143 int fd; 144 FILE *fp; 145 if ((fd = mkstemp(template)) == -1) 146 return NULL; 147 (void)unlink(template); 148 if ((fp = fdopen(fd, "r+")) == NULL) { 149 close(fd); 150 return NULL; 151 } 152 if (fwrite(builtins, 1, builtinlen, fp) != builtinlen) { 153 fclose(fp); 154 return NULL; 155 } 156 rewind(fp); 157 return fp; 158 #else 159 return fmemopen(__UNCONST(builtins), builtinlen, "r"); 160 #endif 161 } 162 163 /*ARGSUSED*/ 164 static void 165 sigfpe(int s) 166 { 167 fpe = 1; 168 } 169 170 int 171 main(int argc, char *argv[]) 172 { 173 int c; 174 char *ptr; 175 176 setprogname(argv[0]); 177 178 ERR_ZERO(&msgset); 179 while ((c = getopt(argc, argv, "abcdeghmprstuvwyzFPSX:")) != -1) { 180 switch (c) { 181 case 'a': aflag++; break; 182 case 'b': bflag = 1; break; 183 case 'c': cflag = 1; break; 184 case 'd': dflag = 1; break; 185 case 'e': eflag = 1; break; 186 case 'F': Fflag = 1; break; 187 case 'g': gflag = 1; break; 188 case 'h': hflag = 1; break; 189 case 'p': pflag = 1; break; 190 case 'P': Pflag = 1; break; 191 case 'r': rflag = 1; break; 192 case 's': sflag = 1; break; 193 case 'S': Sflag = 1; break; 194 case 't': tflag = 1; break; 195 case 'u': uflag = 0; break; 196 case 'w': wflag = 1; break; 197 case 'v': vflag = 0; break; 198 case 'y': yflag = 1; break; 199 case 'z': zflag = 0; break; 200 201 case 'm': 202 msglist(); 203 return(0); 204 205 case 'X': 206 for (ptr = strtok(optarg, ","); ptr; 207 ptr = strtok(NULL, ",")) { 208 char *eptr; 209 long msg; 210 211 errno = 0; 212 msg = strtol(ptr, &eptr, 0); 213 if ((msg == TARG_LONG_MIN || msg == TARG_LONG_MAX) && 214 errno == ERANGE) 215 err(1, "invalid error message id '%s'", 216 ptr); 217 if (*eptr || ptr == eptr || msg < 0 || 218 msg >= ERR_SETSIZE) 219 errx(1, "invalid error message id '%s'", 220 ptr); 221 ERR_SET(msg, &msgset); 222 } 223 break; 224 case '?': 225 default: 226 usage(); 227 break; 228 } 229 } 230 argc -= optind; 231 argv += optind; 232 233 if (argc != 2) 234 usage(); 235 236 237 /* initialize output */ 238 outopen(argv[1]); 239 240 if (yflag) 241 yydebug = 1; 242 243 (void)signal(SIGFPE, sigfpe); 244 initmem(); 245 initdecl(); 246 initscan(); 247 initmtab(); 248 249 if ((yyin = bltin()) == NULL) 250 err(1, "cannot open builtins"); 251 yyparse(); 252 fclose(yyin); 253 254 /* open the input file */ 255 if ((yyin = fopen(argv[0], "r")) == NULL) 256 err(1, "cannot open '%s'", argv[0]); 257 yyparse(); 258 fclose(yyin); 259 260 /* Following warnings cannot be suppressed by LINTED */ 261 lwarn = LWARN_ALL; 262 #ifdef DEBUG 263 printf("%s, %d: lwarn = %d\n", curr_pos.p_file, curr_pos.p_line, lwarn); 264 #endif 265 266 chkglsyms(); 267 268 outclose(); 269 270 return (nerr != 0); 271 } 272 273 static void 274 usage(void) 275 { 276 (void)fprintf(stderr, 277 "Usage: %s [-abcdeghmprstuvwyzFS] [-X <id>[,<id>]... src dest\n", 278 getprogname()); 279 exit(1); 280 } 281 282 void 283 norecover(void) 284 { 285 /* cannot recover from previous errors */ 286 error(224); 287 exit(1); 288 } 289