adig: fix clang and sonarcloud false positives for things that can't actually happen

pull/891/head
Brad House 5 months ago
parent 4a3779721a
commit e037002e14
  1. 49
      src/tools/adig.c

@ -1125,12 +1125,13 @@ static const struct {
{ 0, NULL, 0, 0, NULL, NULL } { 0, NULL, 0, 0, NULL, NULL }
}; };
static ares_bool_t read_cmdline(int argc, const char * const *argv) static ares_bool_t read_cmdline(int argc, const char * const *argv,
int start_idx)
{ {
int arg; int arg;
size_t opt; size_t opt;
for (arg = 1; arg < argc; arg++) { for (arg = start_idx; arg < argc; arg++) {
ares_bool_t option_handled = ARES_FALSE; ares_bool_t option_handled = ARES_FALSE;
for (opt = 0; !option_handled && for (opt = 0; !option_handled &&
@ -1197,11 +1198,26 @@ static ares_bool_t read_cmdline(int argc, const char * const *argv)
switch (dig_options[opt].type) { switch (dig_options[opt].type) {
case OPT_TYPE_BOOL: case OPT_TYPE_BOOL:
*((ares_bool_t *)dig_options[opt].opt) = is_true; {
ares_bool_t *b = dig_options[opt].opt;
if (b == NULL) {
snprintf(global_config.error, sizeof(global_config.error),
"invalid use for %c%s", dig_options[opt].prefix,
dig_options[opt].name);
return ARES_FALSE;
}
*b = is_true;
}
break; break;
case OPT_TYPE_STRING: case OPT_TYPE_STRING:
{ {
char **str = (char **)dig_options[opt].opt; char **str = dig_options[opt].opt;
if (str == NULL) {
snprintf(global_config.error, sizeof(global_config.error),
"invalid use for %c%s", dig_options[opt].prefix,
dig_options[opt].name);
return ARES_FALSE;
}
if (value == NULL) { if (value == NULL) {
snprintf(global_config.error, sizeof(global_config.error), snprintf(global_config.error, sizeof(global_config.error),
"missing value for %c%s", dig_options[opt].prefix, "missing value for %c%s", dig_options[opt].prefix,
@ -1216,7 +1232,13 @@ static ares_bool_t read_cmdline(int argc, const char * const *argv)
} }
case OPT_TYPE_SIZE_T: case OPT_TYPE_SIZE_T:
{ {
size_t *s = (size_t *)dig_options[opt].opt; size_t *s = dig_options[opt].opt;
if (s == NULL) {
snprintf(global_config.error, sizeof(global_config.error),
"invalid use for %c%s", dig_options[opt].prefix,
dig_options[opt].name);
return ARES_FALSE;
}
if (value == NULL) { if (value == NULL) {
snprintf(global_config.error, sizeof(global_config.error), snprintf(global_config.error, sizeof(global_config.error),
"missing value for %c%s", dig_options[opt].prefix, "missing value for %c%s", dig_options[opt].prefix,
@ -1234,7 +1256,13 @@ static ares_bool_t read_cmdline(int argc, const char * const *argv)
} }
case OPT_TYPE_U16: case OPT_TYPE_U16:
{ {
unsigned short *s = (unsigned short *)dig_options[opt].opt; unsigned short *s = dig_options[opt].opt;
if (s == NULL) {
snprintf(global_config.error, sizeof(global_config.error),
"invalid use for %c%s", dig_options[opt].prefix,
dig_options[opt].name);
return ARES_FALSE;
}
if (value == NULL) { if (value == NULL) {
snprintf(global_config.error, sizeof(global_config.error), snprintf(global_config.error, sizeof(global_config.error),
"missing value for %c%s", dig_options[opt].prefix, "missing value for %c%s", dig_options[opt].prefix,
@ -1251,6 +1279,11 @@ static ares_bool_t read_cmdline(int argc, const char * const *argv)
break; break;
} }
case OPT_TYPE_FUNC: case OPT_TYPE_FUNC:
if (dig_options[opt].cb == NULL) {
snprintf(global_config.error, sizeof(global_config.error),
"missing callback");
return ARES_FALSE;
}
if (!dig_options[opt].cb(dig_options[opt].prefix, if (!dig_options[opt].cb(dig_options[opt].prefix,
dig_options[opt].name, is_true, value)) { dig_options[opt].name, is_true, value)) {
return ARES_FALSE; return ARES_FALSE;
@ -1340,7 +1373,7 @@ static ares_bool_t read_rcfile(void)
ARES_BUF_SPLIT_TRIM, 0, &rcargv, &rcargc); ARES_BUF_SPLIT_TRIM, 0, &rcargv, &rcargc);
if (rcstatus == ARES_SUCCESS) { if (rcstatus == ARES_SUCCESS) {
read_cmdline((int)rcargc, (const char * const *)rcargv); read_cmdline((int)rcargc, (const char * const *)rcargv, 0);
} else { } else {
snprintf(global_config.error, sizeof(global_config.error), snprintf(global_config.error, sizeof(global_config.error),
@ -1456,7 +1489,7 @@ int main(int argc, char **argv)
config_defaults(); config_defaults();
if (!read_cmdline(argc, (const char * const *)argv)) { if (!read_cmdline(argc, (const char * const *)argv, 1)) {
printf("\n** ERROR: %s\n\n", global_config.error); printf("\n** ERROR: %s\n\n", global_config.error);
print_help(); print_help();
rv = 1; rv = 1;

Loading…
Cancel
Save