build: lint "strtol" #40442

Problem:
No lint for strtol().

Solution:
Add lint, and update existing usages.

Callers that previously got a (garbage) large positive value:
- `indent.c`: use getdigits() (intmax, no int truncation) with def=1 so
  overflow/too-large values stay positive and fall through to the
  existing "too big" check (E475).
- `file_search.c`: use getdigits() with def=255 so overflow/too-large
  values keep the "max expand" (else) branch.

The other conversions (api/command.c, eval/window.c, highlight_group.c,
tui/tui.c) only diverge on pathological overflow inputs where strtol's
result was already garbage and the observable outcome is unchanged.
This commit is contained in:
Justin M. Keyes
2026-06-28 19:01:24 -04:00
committed by GitHub
parent bb6576c92a
commit 87b42e1209
9 changed files with 37 additions and 12 deletions

View File

@@ -463,8 +463,8 @@ String nvim_cmd(uint64_t channel_id, Dict(cmd) *cmd, Dict(cmd_opts) *opts, Arena
count_value = first_arg.data.integer;
} else if (first_arg.type == kObjectTypeString) {
// Try to parse string as a number Example: vim.api.nvim_cmd({cmd = 'copen', args = {'10'}}, {})
char *endptr;
long val = strtol(first_arg.data.string.data, &endptr, 10);
char *endptr = first_arg.data.string.data;
long val = getdigits_long(&endptr, false, 0);
// Check if entire string was consumed (valid number) and string is not empty
if (*endptr == '\0' && first_arg.data.string.size > 0) {
is_numeric = true;