clang -cc1 -cc1 -triple amd64-unknown-openbsd7.4 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name args.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/usr.bin/indent/obj -resource-dir /usr/local/llvm16/lib/clang/16 -internal-isystem /usr/local/llvm16/lib/clang/16/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.bin/indent/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fcf-protection=branch -fno-jump-tables -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/scan/2024-01-11-140451-98009-1 -x c /usr/src/usr.bin/indent/args.c
| 1 |  | 
| 2 |  | 
| 3 |  | 
| 4 |  | 
| 5 |  | 
| 6 |  | 
| 7 |  | 
| 8 |  | 
| 9 |  | 
| 10 |  | 
| 11 |  | 
| 12 |  | 
| 13 |  | 
| 14 |  | 
| 15 |  | 
| 16 |  | 
| 17 |  | 
| 18 |  | 
| 19 |  | 
| 20 |  | 
| 21 |  | 
| 22 |  | 
| 23 |  | 
| 24 |  | 
| 25 |  | 
| 26 |  | 
| 27 |  | 
| 28 |  | 
| 29 |  | 
| 30 |  | 
| 31 |  | 
| 32 |  | 
| 33 |  | 
| 34 |  | 
| 35 |  | 
| 36 |  | 
| 37 |  | 
| 38 |  | 
| 39 |  | 
| 40 | #include <stdio.h> | 
| 41 | #include <ctype.h> | 
| 42 | #include <stdlib.h> | 
| 43 | #include <string.h> | 
| 44 | #include <errno.h> | 
| 45 | #include "indent_globs.h" | 
| 46 | #include <err.h> | 
| 47 |  | 
| 48 |  | 
| 49 | #define	PRO_SPECIAL	1	/* special case */ | 
| 50 | #define	PRO_BOOL	2	/* boolean */ | 
| 51 | #define	PRO_INT		3	/* integer */ | 
| 52 | #define	PRO_FONT	4	/* troff font */ | 
| 53 |  | 
| 54 |  | 
| 55 | #define	ON		1	/* turn it on */ | 
| 56 | #define	OFF		0	/* turn it off */ | 
| 57 |  | 
| 58 |  | 
| 59 | #define	IGN		1	/* ignore it */ | 
| 60 | #define	CLI		2	/* case label indent (float) */ | 
| 61 | #define	STDIN		3	/* use stdin */ | 
| 62 | #define	KEY		4	/* type (keyword) */ | 
| 63 |  | 
| 64 | char *option_source = "?"; | 
| 65 |  | 
| 66 |  | 
| 67 |  | 
| 68 |  | 
| 69 |  | 
| 70 |  | 
| 71 |  | 
| 72 | struct pro { | 
| 73 | char       *p_name; | 
| 74 | int         p_type; | 
| 75 | int         p_default; | 
| 76 | int         p_special; | 
| 77 | int        *p_obj; | 
| 78 | }           pro[] = { | 
| 79 |  | 
| 80 | { "T", PRO_SPECIAL, 0, KEY, 0 }, | 
| 81 | {"bacc", PRO_BOOL, false, ON, | 
| 82 | &blanklines_around_conditional_compilation }, | 
| 83 | {"badp", PRO_BOOL, false, ON, | 
| 84 | &blanklines_after_declarations_at_proctop }, | 
| 85 | {"bad", PRO_BOOL, false, ON, &blanklines_after_declarations }, | 
| 86 | {"bap", PRO_BOOL, false, ON, &blanklines_after_procs }, | 
| 87 | {"bbb", PRO_BOOL, false, ON, &blanklines_before_blockcomments }, | 
| 88 | {"bc", PRO_BOOL, true, OFF, &ps.leave_comma }, | 
| 89 | {"bl", PRO_BOOL, true, OFF, &btype_2 }, | 
| 90 | {"br", PRO_BOOL, true, ON, &btype_2 }, | 
| 91 | {"bs", PRO_BOOL, false, ON, &Bill_Shannon }, | 
| 92 | {"cdb", PRO_BOOL, true, ON, &comment_delimiter_on_blankline }, | 
| 93 | {"cd", PRO_INT, 0, 0, &ps.decl_com_ind }, | 
| 94 | {"ce", PRO_BOOL, true, ON, &cuddle_else }, | 
| 95 | {"ci", PRO_INT, 0, 0, &continuation_indent }, | 
| 96 | {"cli", PRO_SPECIAL, 0, CLI, 0 }, | 
| 97 | {"c", PRO_INT, 33, 0, &ps.com_ind }, | 
| 98 | {"di", PRO_INT, 16, 0, &ps.decl_indent }, | 
| 99 | {"dj", PRO_BOOL, false, ON, &ps.ljust_decl }, | 
| 100 | {"d", PRO_INT, 0, 0, &ps.unindent_displace }, | 
| 101 | {"eei", PRO_BOOL, false, ON, &extra_expression_indent }, | 
| 102 | {"ei", PRO_BOOL, true, ON, &ps.else_if }, | 
| 103 | {"fbc", PRO_FONT, 0, 0, (int *) &blkcomf }, | 
| 104 | {"fbx", PRO_FONT, 0, 0, (int *) &boxcomf }, | 
| 105 | {"fb", PRO_FONT, 0, 0, (int *) &bodyf }, | 
| 106 | {"fc1", PRO_BOOL, true, ON, &format_col1_comments }, | 
| 107 | {"fc", PRO_FONT, 0, 0, (int *) &scomf }, | 
| 108 | {"fk", PRO_FONT, 0, 0, (int *) &keywordf }, | 
| 109 | {"fs", PRO_FONT, 0, 0, (int *) &stringf }, | 
| 110 | {"ip", PRO_BOOL, true, ON, &ps.indent_parameters }, | 
| 111 | {"i", PRO_INT, 8, 0, &ps.ind_size }, | 
| 112 | {"lc", PRO_INT, 0, 0, &block_comment_max_col }, | 
| 113 | {"lp", PRO_BOOL, true, ON, &lineup_to_parens }, | 
| 114 | {"l", PRO_INT, 78, 0, &max_col }, | 
| 115 | {"nbacc", PRO_BOOL, false, OFF, | 
| 116 | &blanklines_around_conditional_compilation }, | 
| 117 | {"nbadp", PRO_BOOL, false, OFF, | 
| 118 | &blanklines_after_declarations_at_proctop }, | 
| 119 | {"nbad", PRO_BOOL, false, OFF, &blanklines_after_declarations }, | 
| 120 | {"nbap", PRO_BOOL, false, OFF, &blanklines_after_procs }, | 
| 121 | {"nbbb", PRO_BOOL, false, OFF, &blanklines_before_blockcomments }, | 
| 122 | {"nbc", PRO_BOOL, true, ON, &ps.leave_comma }, | 
| 123 | {"nbs", PRO_BOOL, false, OFF, &Bill_Shannon }, | 
| 124 | {"ncdb", PRO_BOOL, true, OFF, &comment_delimiter_on_blankline }, | 
| 125 | {"nce", PRO_BOOL, true, OFF, &cuddle_else }, | 
| 126 | {"ndj", PRO_BOOL, false, OFF, &ps.ljust_decl }, | 
| 127 | {"neei", PRO_BOOL, false, OFF, &extra_expression_indent }, | 
| 128 | {"nei", PRO_BOOL, true, OFF, &ps.else_if }, | 
| 129 | {"nfc1", PRO_BOOL, true, OFF, &format_col1_comments }, | 
| 130 | {"nip", PRO_BOOL, true, OFF, &ps.indent_parameters }, | 
| 131 | {"nlp", PRO_BOOL, true, OFF, &lineup_to_parens }, | 
| 132 | {"npcs", PRO_BOOL, false, OFF, &proc_calls_space }, | 
| 133 | {"npro", PRO_SPECIAL, 0, IGN, 0 }, | 
| 134 | {"npsl", PRO_BOOL, true, OFF, &procnames_start_line }, | 
| 135 | {"nps", PRO_BOOL, false, OFF, &pointer_as_binop }, | 
| 136 | {"nsc", PRO_BOOL, true, OFF, &star_comment_cont }, | 
| 137 | {"nsob", PRO_BOOL, false, OFF, &swallow_optional_blanklines }, | 
| 138 | {"nut", PRO_BOOL, true, OFF, &use_tabs}, | 
| 139 | {"nv", PRO_BOOL, false, OFF, &verbose }, | 
| 140 | {"pcs", PRO_BOOL, false, ON, &proc_calls_space }, | 
| 141 | {"psl", PRO_BOOL, true, ON, &procnames_start_line }, | 
| 142 | {"ps", PRO_BOOL, false, ON, &pointer_as_binop }, | 
| 143 | {"sc", PRO_BOOL, true, ON, &star_comment_cont }, | 
| 144 | {"sob", PRO_BOOL, false, ON, &swallow_optional_blanklines }, | 
| 145 | {"st", PRO_SPECIAL, 0, STDIN, 0 }, | 
| 146 | {"troff", PRO_BOOL, false, ON, &troff }, | 
| 147 | {"ut", PRO_BOOL, true, ON, &use_tabs}, | 
| 148 | {"v", PRO_BOOL, false, ON, &verbose }, | 
| 149 |  | 
| 150 | { 0, 0, 0, 0, 0 } | 
| 151 | }; | 
| 152 |  | 
| 153 | void scan_profile(FILE *); | 
| 154 | void set_option(char *); | 
| 155 |  | 
| 156 |  | 
| 157 |  | 
| 158 |  | 
| 159 |  | 
| 160 | void | 
| 161 | set_profile(void) | 
| 162 | { | 
| 163 | FILE *f; | 
| 164 | char        fname[BUFSIZ]; | 
| 165 | char	*home; | 
| 166 | static char prof[] = ".indent.pro"; | 
| 167 |  | 
| 168 | home = getenv("HOME"); | 
|  | | 1 | Assuming the environment variable exists |  | 
 | 
| 169 | if (home != NULL && *home != '\0') { | 
|  | | 2 |  | Assuming the condition is true |  | 
 | 
|  |  | 
| 170 | if (snprintf(fname, sizeof fname, "%s/%s", home, prof) >= sizeof fname) { | 
|  | | 4 |  | Assuming the condition is false |  | 
 | 
|  |  | 
| 171 | warnc(ENAMETOOLONG, "%s/%s", home, prof); | 
| 172 | return; | 
| 173 | } | 
| 174 | if ((f = fopen(option_source = fname, "r")) != NULL) { | 
|  | | 6 |  | Assuming the condition is true |  | 
 | 
|  |  | 
| 175 | scan_profile(f); | 
|  |  | 
| 176 | (void) fclose(f); | 
| 177 | } | 
| 178 | } | 
| 179 | if ((f = fopen(option_source = prof, "r")) != NULL) { | 
| 180 | scan_profile(f); | 
| 181 | (void) fclose(f); | 
| 182 | } | 
| 183 | option_source = "Command line"; | 
| 184 | } | 
| 185 |  | 
| 186 | void | 
| 187 | scan_profile(FILE *f) | 
| 188 | { | 
| 189 | int i; | 
| 190 | char *p; | 
| 191 | char        buf[BUFSIZ]; | 
| 192 |  | 
| 193 | while (1) { | 
|  | | 9 |  | Loop condition is true.  Entering loop body |  | 
 | 
|  | | 21 |  | Loop condition is true.  Entering loop body |  | 
 | 
| 194 | for (p = buf; | 
|  | | 14 |  | Loop condition is true.  Entering loop body |  | 
 | 
| 195 | (i = getc(f)) != EOF && (*p = i) > ' ' && p + 1 - buf < BUFSIZ; | 
|  | | 10 |  | Assuming '__isthreaded' is not equal to 0 |  | 
 | 
|  |  | 
|  | | 12 |  | Assuming the condition is true |  | 
 | 
|  | | 13 |  | Assuming the condition is true |  | 
 | 
|  | | 15 |  | Assuming '__isthreaded' is not equal to 0 |  | 
 | 
|  |  | 
|  | | 17 |  | Assuming the condition is false |  | 
 | 
|  | | 22 |  | Assuming '__isthreaded' is not equal to 0 |  | 
 | 
|  |  | 
|  | | 24 |  | Assuming the condition is false |  | 
 | 
| 196 | ++p) | 
| 197 | ; | 
| 198 | if (p != buf) { | 
|  |  | 
|  |  | 
| 199 | *p = 0; | 
| 200 | if (verbose) | 
|  | | 19 |  | Assuming 'verbose' is 0 |  | 
 | 
|  |  | 
| 201 | printf("profile: %s\n", buf); | 
| 202 | set_option(buf); | 
| 203 | } | 
| 204 | else if (i == EOF) | 
|  |  | 
| 205 | return; | 
|  | | 27 |  | Address of stack memory associated with local variable 'buf' is still referred to by the global variable 'param_start' upon returning to the caller.  This will be a dangling reference | 
 | 
| 206 | } | 
| 207 | } | 
| 208 |  | 
| 209 | char       *param_start; | 
| 210 |  | 
| 211 | int | 
| 212 | eqin(char *s1, char *s2) | 
| 213 | { | 
| 214 | while (*s1) { | 
| 215 | if (*s1++ != *s2++) | 
| 216 | return (false); | 
| 217 | } | 
| 218 | param_start = s2; | 
| 219 | return (true); | 
| 220 | } | 
| 221 |  | 
| 222 |  | 
| 223 |  | 
| 224 |  | 
| 225 | void | 
| 226 | set_defaults(void) | 
| 227 | { | 
| 228 | struct pro *p; | 
| 229 |  | 
| 230 |  | 
| 231 |  | 
| 232 |  | 
| 233 |  | 
| 234 | ps.case_indent = 0.0; | 
| 235 | for (p = pro; p->p_name; p++) | 
| 236 | if (p->p_type != PRO_SPECIAL && p->p_type != PRO_FONT) | 
| 237 | *p->p_obj = p->p_default; | 
| 238 | } | 
| 239 |  | 
| 240 | void | 
| 241 | set_option(char *arg) | 
| 242 | { | 
| 243 | struct pro *p; | 
| 244 |  | 
| 245 | arg++; | 
| 246 | for (p = pro; p->p_name; p++) | 
| 247 | if (*p->p_name == *arg && eqin(p->p_name, arg)) | 
| 248 | goto found; | 
| 249 | errx(1, "%s: unknown parameter \"%s\"", option_source, arg - 1); | 
| 250 | found: | 
| 251 | switch (p->p_type) { | 
| 252 |  | 
| 253 | case PRO_SPECIAL: | 
| 254 | switch (p->p_special) { | 
| 255 |  | 
| 256 | case IGN: | 
| 257 | break; | 
| 258 |  | 
| 259 | case CLI: | 
| 260 | if (*param_start == 0) | 
| 261 | goto need_param; | 
| 262 | ps.case_indent = atof(param_start); | 
| 263 | break; | 
| 264 |  | 
| 265 | case STDIN: | 
| 266 | if (input == 0) | 
| 267 | input = stdin; | 
| 268 | if (output == 0) | 
| 269 | output = stdout; | 
| 270 | break; | 
| 271 |  | 
| 272 | case KEY: | 
| 273 | if (*param_start == 0) | 
| 274 | goto need_param; | 
| 275 | { | 
| 276 | char *str; | 
| 277 | if ((str = strdup(param_start)) == NULL) | 
| 278 | err(1, NULL); | 
| 279 | addkey(str, 4); | 
| 280 | } | 
| 281 | break; | 
| 282 |  | 
| 283 | default: | 
| 284 | errx(1, "set_option: internal error: p_special %d", p->p_special); | 
| 285 | } | 
| 286 | break; | 
| 287 |  | 
| 288 | case PRO_BOOL: | 
| 289 | if (p->p_special == OFF) | 
| 290 | *p->p_obj = false; | 
| 291 | else | 
| 292 | *p->p_obj = true; | 
| 293 | break; | 
| 294 |  | 
| 295 | case PRO_INT: | 
| 296 | if (!isdigit((unsigned char)*param_start)) { | 
| 297 | need_param: | 
| 298 | errx(1, "%s: ``%s'' requires a parameter", option_source, arg - 1); | 
| 299 | } | 
| 300 | *p->p_obj = atoi(param_start); | 
| 301 | if (*p->p_name == 'i' && *p->p_obj <= 0) | 
| 302 | errx(1, "%s: ``%s must be greater of zero''", | 
| 303 | option_source, arg - 1); | 
| 304 | break; | 
| 305 |  | 
| 306 | case PRO_FONT: | 
| 307 | parsefont((struct fstate *) p->p_obj, param_start); | 
| 308 | break; | 
| 309 |  | 
| 310 | default: | 
| 311 | errx(1, "set_option: internal error: p_type %d", p->p_type); | 
| 312 | } | 
| 313 | } |