Skip to content

Commit cd5fa01

Browse files
authored
Fix incorrect warning with %zi in format string (danmar#3437)
1 parent ccb31d8 commit cd5fa01

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

lib/checkio.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,7 +1782,7 @@ void CheckIO::invalidScanfArgTypeError_int(const Token* tok, nonneg int numForma
17821782
else
17831783
errmsg << "intmax_t";
17841784
} else if (specifier[0] == 'z') {
1785-
if (specifier[1] == 'd')
1785+
if (specifier[1] == 'd' || specifier[1] == 'i')
17861786
errmsg << "ssize_t";
17871787
else
17881788
errmsg << "size_t";
@@ -1875,7 +1875,7 @@ static void printfFormatType(std::ostream& os, const std::string& specifier, boo
18751875
else
18761876
os << "intmax_t";
18771877
} else if (specifier[0] == 'z') {
1878-
if (specifier[1] == 'd')
1878+
if (specifier[1] == 'd' || specifier[1] == 'i')
18791879
os << "ssize_t";
18801880
else
18811881
os << "size_t";

test/testio.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,6 +1533,8 @@ class TestIO : public TestFixture {
15331533
TEST_SCANF_NOWARN("%zd", "ssize_t", "ssize_t");
15341534
TEST_SCANF_WARN_AKA("%zd", "ssize_t", "ptrdiff_t", "signed long", "signed long long");
15351535

1536+
TEST_SCANF_WARN_AKA("%zi", "ssize_t", "size_t", "unsigned long", "unsigned long long");
1537+
15361538
TEST_SCANF_WARN("%tu", "unsigned ptrdiff_t", "bool");
15371539
TEST_SCANF_WARN("%tu", "unsigned ptrdiff_t", "char");
15381540
TEST_SCANF_WARN("%tu", "unsigned ptrdiff_t", "signed char");
@@ -3705,6 +3707,9 @@ class TestIO : public TestFixture {
37053707
TEST_PRINTF_WARN_AKA("%jx", "uintmax_t", "std::intptr_t", "signed long", "signed long long");
37063708
TEST_PRINTF_WARN_AKA("%jx", "uintmax_t", "std::uintptr_t", "unsigned long", "unsigned long long");
37073709

3710+
TEST_PRINTF_WARN_AKA("%zd", "ssize_t", "size_t", "unsigned long", "unsigned long long");
3711+
TEST_PRINTF_WARN_AKA("%zi", "ssize_t", "size_t", "unsigned long", "unsigned long long");
3712+
37083713
TEST_PRINTF_WARN("%zu", "size_t", "bool");
37093714
TEST_PRINTF_WARN("%zu", "size_t", "char");
37103715
TEST_PRINTF_WARN("%zu", "size_t", "signed char");

0 commit comments

Comments
 (0)