Skip to content

Commit 703d869

Browse files
committed
Fix FN when size_t, uintmax_t are passed as %Lx into scanf
1 parent c563917 commit 703d869

File tree

2 files changed

+6
-3
lines changed

2 files changed

+6
-3
lines changed

lib/checkio.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,9 @@ void CheckIO::checkFormatString(const Token * const tok,
781781
case 'L':
782782
if (argInfo.typeToken->str() != "long" || !argInfo.typeToken->isLong())
783783
invalidScanfArgTypeError_int(tok, numFormat, specifier, &argInfo, true);
784+
else if (typesMatch(argInfo.typeToken->originalName(), "size_t") ||
785+
argInfo.typeToken->originalName() == "uintmax_t")
786+
invalidScanfArgTypeError_int(tok, numFormat, specifier, &argInfo, true);
784787
break;
785788
default:
786789
if (argInfo.typeToken->str() != "int")

test/testio.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,15 +1310,15 @@ class TestIO : public TestFixture {
13101310
TEST_SCANF_WARN("%Lx", "unsigned long long", "double");
13111311
TEST_SCANF_WARN("%Lx", "unsigned long long", "long double");
13121312
TEST_SCANF_WARN("%Lx", "unsigned long long", "void *");
1313-
TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "size_t", "unsigned long");
1313+
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "size_t", "unsigned long", "unsigned long long");
13141314
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "ssize_t", "signed long", "signed long long");
13151315
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "ptrdiff_t", "signed long", "signed long long");
13161316
TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "unsigned ptrdiff_t", "unsigned long");
13171317
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "intmax_t", "signed long", "signed long long");
1318-
TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "uintmax_t", "unsigned long");
1318+
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "uintmax_t", "unsigned long", "unsigned long long");
13191319
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "intptr_t", "signed long", "signed long long");
13201320
TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "uintptr_t", "unsigned long");
1321-
TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "std::size_t", "unsigned long");
1321+
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "std::size_t", "unsigned long", "unsigned long long");
13221322
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "std::ssize_t", "signed long", "signed long long");
13231323
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "std::ptrdiff_t", "signed long", "signed long long");
13241324
TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "std::intmax_t", "signed long", "signed long long");

0 commit comments

Comments
 (0)