Flawfinder version 2.0.10, (C) 2001-2019 David A. Wheeler. Number of rules (primarily dangerous function names) in C/C++ ruleset: 223 Examining data/untex-1.2/untex.c FINAL RESULTS: data/untex-1.2/untex.c:113:13: [2] (misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). if ((inf = fopen(argv[i],"r"))==NULL) perror(argv[i]); data/untex-1.2/untex.c:315:12: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. static char rv[2]; data/untex-1.2/untex.c:334:5: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char cmd[MAXCMDLEN], env[MAXCMDLEN], envtst[MAXCMDLEN]; data/untex-1.2/untex.c:337:5: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char fname[MAXFILENAMELEN]; data/untex-1.2/untex.c:383:39: [2] (buffer) strcat: Does not check for buffer overflows when concatenating to destination [MS-banned] (CWE-120). Consider using strcat_s, strncat, strlcat, or snprintf (warning: strncat is easily misused). Risk is low because the source is a constant string. if (strncmp(fname+fnc-5, ".tex", 4)) strcat(fname,".tex"); data/untex-1.2/untex.c:384:17: [2] (misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). if ((incfile = fopen(fname,"r"))==NULL) perror(fname); data/untex-1.2/untex.c:60:25: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). #define GET(c) if (((c)=getc(inf)) == EOF ) return data/untex-1.2/untex.c:150:16: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ( (c=getc(inf)) != EOF ) { data/untex-1.2/untex.c:197:18: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ( (c=getc(inf)) != EOF && data/untex-1.2/untex.c:216:15: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ((c=getc(inf)) != EOF && data/untex-1.2/untex.c:230:23: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). case '%':while ((c=getc(inf)) != EOF && c != '\n'); data/untex-1.2/untex.c:252:13: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ((c=getc(inf)) != EOF && data/untex-1.2/untex.c:279:13: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ((*c=getc(inf)) != EOF && *c != '\n'); data/untex-1.2/untex.c:280:7: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). *c = getc(inf); data/untex-1.2/untex.c:295:10: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). cc = getc(inf); data/untex-1.2/untex.c:303:7: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). cc = getc(inf); data/untex-1.2/untex.c:340:9: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). c = getc(inf); data/untex-1.2/untex.c:345:6: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). c = getc(inf); data/untex-1.2/untex.c:351:12: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ((c=getc(inf)) != EOF && c != ']'); data/untex-1.2/untex.c:352:11: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). if ((c = getc(inf)) == EOF) return(c); data/untex-1.2/untex.c:361:14: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ((c = getc(inf)) != EOF && skipcomment(inf, &c) && data/untex-1.2/untex.c:378:10: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). c = getc(inf); data/untex-1.2/untex.c:397:10: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). c = getc(inf); data/untex-1.2/untex.c:460:13: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ((c=getc(inf)) != EOF && data/untex-1.2/untex.c:463:7: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). if (getc(inf) == 'e' && data/untex-1.2/untex.c:464:7: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). getc(inf) == 'n' && data/untex-1.2/untex.c:465:7: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). getc(inf) == 'd' && data/untex-1.2/untex.c:466:7: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). getc(inf) == '{') { data/untex-1.2/untex.c:468:17: [1] (buffer) getc: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ((c=getc(inf)) != EOF && ANALYSIS SUMMARY: Hits = 29 Lines analyzed = 482 in approximately 0.04 seconds (11251 lines/second) Physical Source Lines of Code (SLOC) = 374 Hits@level = [0] 19 [1] 23 [2] 6 [3] 0 [4] 0 [5] 0 Hits@level+ = [0+] 48 [1+] 29 [2+] 6 [3+] 0 [4+] 0 [5+] 0 Hits/KSLOC@level+ = [0+] 128.342 [1+] 77.5401 [2+] 16.0428 [3+] 0 [4+] 0 [5+] 0 Dot directories skipped = 1 (--followdotdir overrides) Minimum risk level = 1 Not every hit is necessarily a security vulnerability. There may be other security vulnerabilities; review your code! See 'Secure Programming HOWTO' (https://dwheeler.com/secure-programs) for more information.