Repository navigation
C++: suggest specifiers for simple integer format mismatches - #23108
SkyCipherr wants to merge 2 commits into
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
The production-query change lacks the repository’s broader DCA evaluation to check for unexpected diagnostic regressions beyond the focused tests and MinGW database.
1 open issue
What changed in this PR
Adds format-specifier suggestions to the C++ cpp/wrong-type-format-argument query, partially addressing #15028 without changing mismatch detection.
Changes:
- Suggests matching specifiers for plain decimal integer conversions using promoted argument types.
- Adds Linux and Microsoft target-model tests covering suggestions and excluded cases.
- Updates existing expected diagnostics and adds a release note.
| File | Description |
|---|---|
cpp/ql/test/query-tests/Likely Bugs/Format/WrongTypeFormatArguments/Microsoft/WrongTypeFormatArguments.expected |
Updates Microsoft diagnostic expectations. |
cpp/ql/test/query-tests/Likely Bugs/Format/WrongTypeFormatArguments/Microsoft_no_wchar/WrongTypeFormatArguments.expected |
Updates no-wchar diagnostic expectations. |
cpp/ql/test/query-tests/Likely Bugs/Format/WrongTypeFormatArguments/Linux_unsigned_chars/WrongTypeFormatArguments.expected |
Updates unsigned-char diagnostic expectations. |
cpp/ql/test/query-tests/Likely Bugs/Format/WrongTypeFormatArguments/Linux_signed_chars/WrongTypeFormatArguments.expected |
Updates signed-char diagnostic expectations. |
cpp/ql/test/query-tests/Likely Bugs/Format/WrongTypeFormatArguments/Buildless/WrongTypeFormatArguments.expected |
Updates buildless diagnostic expectations. |
cpp/ql/test/query-tests/Likely Bugs/Format/IntegerFormatSuggestions/Microsoft/WrongTypeFormatArguments.qlref |
Connects Microsoft tests to the query. |
cpp/ql/test/query-tests/Likely Bugs/Format/IntegerFormatSuggestions/Microsoft/WrongTypeFormatArguments.expected |
Records Microsoft suggestion expectations. |
cpp/ql/test/query-tests/Likely Bugs/Format/IntegerFormatSuggestions/Microsoft/options |
Configures the Microsoft target model. |
cpp/ql/test/query-tests/Likely Bugs/Format/IntegerFormatSuggestions/Microsoft/integer-hints.c |
Adds Microsoft suggestion and exclusion cases. |
cpp/ql/test/query-tests/Likely Bugs/Format/IntegerFormatSuggestions/Linux/WrongTypeFormatArguments.qlref |
Connects Linux tests to the query. |
cpp/ql/test/query-tests/Likely Bugs/Format/IntegerFormatSuggestions/Linux/WrongTypeFormatArguments.expected |
Records Linux suggestion expectations. |
cpp/ql/test/query-tests/Likely Bugs/Format/IntegerFormatSuggestions/Linux/options |
Configures the Linux test extractor. |
cpp/ql/test/query-tests/Likely Bugs/Format/IntegerFormatSuggestions/Linux/integer-hints.c |
Adds Linux suggestion and exclusion cases. |
cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.ql |
Appends suggestions for supported integer mismatches. |
cpp/ql/src/change-notes/2026-11-12-integer-format-suggestions.md |
Documents the diagnostic enhancement. |
Review effort: Balanced (auto)
| select arg, | ||
| "This format specifier for type '" + expected.getName() + "' does not match the argument type '" + | ||
| actual.getUnspecifiedType().getName() + "'." | ||
| actual.getUnspecifiedType().getName() + "'." + integerFormatSuggestion(ffc, n, arg, actual) |
|
This feels very hacky. I think a more principled approach would likely be to update |
|
Thanks @jketema. Following your suggestion, I've reworked this in 0dc2c48.
The API is deliberately limited to the existing scope: plain decimal Validation with CodeQL CLI 2.27.4:
These are local validation results. I have not run the full repository suite or refreshed upstream DCA for this commit; it still needs upstream CI/DCA. |

Summary
Related to #15028.
Add a format-specifier suggestion to existing
cpp/wrong-type-format-argumentalerts for simple decimal integer conversions. For example, a%dconversion with anunsigned longargument on LP64 now suggests%lu.The suggestion uses the argument type after default argument promotions and distinguishes
int,long, andlong long, including unsigned variants. It retainsifor signediconversions and usesufor unsigned arguments. The detection predicates and existing message text are unchanged; suggestions are appended only to conversion-value arguments.This intentionally covers only plain
%d,%i,%u, and theirl/llforms. Flags, width, precision, positional arguments, non-decimal conversions, and other types retain their existing messages. It does not attempt to close the full issue or change the existing treatment of equal-width integer types.Validation
Validated with CodeQL CLI 2.27.4 against main at
fbf9fca5ce7c3b64c2f5d719ea0444577850cb4a:long longcases because the issue'sunsigned longversusintexample is equal-width and is not reported by the existing query on that target. The original example is covered by the Linux target-model test.%lureplacement, pass GCC-Wformat=2 -Werror=formatcompilation checks. Mismatched calls were not executed.git diff --checkpass.The full repository suite and large-project evaluation were not run. Upstream CI has not yet run for this change.