From 703d86992dd8678bd36b58e29dfb594749f1aede Mon Sep 17 00:00:00 2001 From: Dmitry-Me Date: Wed, 8 Nov 2017 23:52:49 +0300 Subject: [PATCH] Fix FN when size_t, uintmax_t are passed as %Lx into scanf --- lib/checkio.cpp | 3 +++ test/testio.cpp | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/checkio.cpp b/lib/checkio.cpp index 2206c4741..f9baa648a 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -781,6 +781,9 @@ void CheckIO::checkFormatString(const Token * const tok, case 'L': if (argInfo.typeToken->str() != "long" || !argInfo.typeToken->isLong()) invalidScanfArgTypeError_int(tok, numFormat, specifier, &argInfo, true); + else if (typesMatch(argInfo.typeToken->originalName(), "size_t") || + argInfo.typeToken->originalName() == "uintmax_t") + invalidScanfArgTypeError_int(tok, numFormat, specifier, &argInfo, true); break; default: if (argInfo.typeToken->str() != "int") diff --git a/test/testio.cpp b/test/testio.cpp index e9caf9bb9..9389a0108 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -1310,15 +1310,15 @@ private: TEST_SCANF_WARN("%Lx", "unsigned long long", "double"); TEST_SCANF_WARN("%Lx", "unsigned long long", "long double"); TEST_SCANF_WARN("%Lx", "unsigned long long", "void *"); - TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "size_t", "unsigned long"); + TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "size_t", "unsigned long", "unsigned long long"); TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "ssize_t", "signed long", "signed long long"); TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "ptrdiff_t", "signed long", "signed long long"); TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "unsigned ptrdiff_t", "unsigned long"); TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "intmax_t", "signed long", "signed long long"); - TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "uintmax_t", "unsigned long"); + TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "uintmax_t", "unsigned long", "unsigned long long"); TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "intptr_t", "signed long", "signed long long"); TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "uintptr_t", "unsigned long"); - TEST_SCANF_WARN_AKA_WIN32("%Lx", "unsigned long long", "std::size_t", "unsigned long"); + TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "std::size_t", "unsigned long", "unsigned long long"); TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "std::ssize_t", "signed long", "signed long long"); TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "std::ptrdiff_t", "signed long", "signed long long"); TEST_SCANF_WARN_AKA("%Lx", "unsigned long long", "std::intmax_t", "signed long", "signed long long");