This fixes false positives because of wrong configuration in windows.cfg. Add tests in testio.cpp and test/cfg/windows.cpp to avoid regression.
This commit is contained in:
parent
c235930539
commit
2e5d7a8391
|
@ -1914,23 +1914,17 @@
|
||||||
<not-uninit/>
|
<not-uninit/>
|
||||||
</arg>
|
</arg>
|
||||||
</function>
|
</function>
|
||||||
|
<!-- int sprintf_s(char *buffer, size_t sizeOfBuffer, const char *format, ...);-->
|
||||||
|
<!-- template <size_t size> int sprintf_s(char (&buffer)[size], const char *format, ...); // C++ only -->
|
||||||
<!-- int swprintf_s(wchar_t *buffer, size_t sizeOfBuffer, const wchar_t *format, ...); -->
|
<!-- int swprintf_s(wchar_t *buffer, size_t sizeOfBuffer, const wchar_t *format, ...); -->
|
||||||
<function name="swprintf_s">
|
<!-- template <size_t size> int swprintf_s(wchar_t (&buffer)[size], const wchar_t *format, ...); // C++ only -->
|
||||||
|
<function name="sprintf_s,swprintf_s">
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="int"/>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1">
|
<!-- These functions and the format string checking is completely
|
||||||
<minsize type="argvalue" arg="2"/>
|
implemented in Cppcheck. It can not (yet) be configured in the configuration
|
||||||
</arg>
|
file. See #8381 -->
|
||||||
<arg nr="2">
|
|
||||||
<not-uninit/>
|
|
||||||
<valid>0:</valid>
|
|
||||||
</arg>
|
|
||||||
<formatstr/>
|
|
||||||
<arg nr="3">
|
|
||||||
<formatstr/>
|
|
||||||
<not-null/>
|
|
||||||
<not-uninit/>
|
|
||||||
</arg>
|
|
||||||
</function>
|
</function>
|
||||||
<!-- int _sprintf_s_l(char *buffer, size_t sizeOfBuffer, const char *format, locale_t locale, ... );
|
<!-- int _sprintf_s_l(char *buffer, size_t sizeOfBuffer, const char *format, locale_t locale, ... );
|
||||||
int _swprintf_s_l(wchar_t *buffer, size_t sizeOfBuffer, const wchar_t *format, locale_t locale, ...);-->
|
int _swprintf_s_l(wchar_t *buffer, size_t sizeOfBuffer, const wchar_t *format, locale_t locale, ...);-->
|
||||||
|
|
|
@ -94,6 +94,28 @@ void validCode()
|
||||||
pMem = HeapReAlloc(GetProcessHeap(), 0, pMem, 0);
|
pMem = HeapReAlloc(GetProcessHeap(), 0, pMem, 0);
|
||||||
HeapFree(GetProcessHeap(), 0, pMem);
|
HeapFree(GetProcessHeap(), 0, pMem);
|
||||||
|
|
||||||
|
char bufC[50];
|
||||||
|
sprintf_s(bufC, "Hello");
|
||||||
|
printf("%s", bufC);
|
||||||
|
sprintf_s(bufC, "%s", "test");
|
||||||
|
printf("%s", bufC);
|
||||||
|
sprintf_s(bufC, _countof(bufC), "%s", "test");
|
||||||
|
printf("%s", bufC);
|
||||||
|
wchar_t bufWC[50];
|
||||||
|
swprintf_s(bufWC, L"Hello");
|
||||||
|
wprintf(L"%s\n", bufWC);
|
||||||
|
swprintf_s(bufWC, L"%s %d", L"swprintf_s", 3);
|
||||||
|
wprintf(L"%s\n", bufWC);
|
||||||
|
swprintf_s(bufWC, _countof(bufWC), L"%s %d", L"swprintf_s", 6);
|
||||||
|
wprintf(L"%s\n", bufWC);
|
||||||
|
TCHAR bufTC[50];
|
||||||
|
_stprintf(bufTC, TEXT("Hello"));
|
||||||
|
_tprintf(TEXT("%s"), bufTC);
|
||||||
|
_stprintf(bufTC, TEXT("%d"), 1);
|
||||||
|
_tprintf(TEXT("%s"), bufTC);
|
||||||
|
_stprintf(bufTC, _countof(bufTC), TEXT("%d"), 2);
|
||||||
|
_tprintf(TEXT("%s"), bufTC);
|
||||||
|
|
||||||
// Valid Library usage, no leaks, valid arguments
|
// Valid Library usage, no leaks, valid arguments
|
||||||
HINSTANCE hInstLib = LoadLibrary(L"My.dll");
|
HINSTANCE hInstLib = LoadLibrary(L"My.dll");
|
||||||
FreeLibrary(hInstLib);
|
FreeLibrary(hInstLib);
|
||||||
|
@ -415,6 +437,69 @@ void uninitvar()
|
||||||
SetLastError(dwordUninit);
|
SetLastError(dwordUninit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void errorPrintf()
|
||||||
|
{
|
||||||
|
char bufC[50];
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
sprintf_s(bufC, _countof(bufC), "%s %d", "sprintf_s");
|
||||||
|
printf("%s\n", bufC);
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
sprintf_s(bufC, "%s %d", "sprintf_s");
|
||||||
|
printf("%s\n", bufC);
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
sprintf_s(bufC, _countof(bufC), "test", 0);
|
||||||
|
printf("%s\n", bufC);
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
sprintf_s(bufC, "test", "sprintf_s");
|
||||||
|
printf("%s\n", bufC);
|
||||||
|
// cppcheck-suppress invalidPrintfArgType_s
|
||||||
|
sprintf_s(bufC, _countof(bufC), "%s", 1);
|
||||||
|
printf("%s\n", bufC);
|
||||||
|
// cppcheck-suppress invalidPrintfArgType_s
|
||||||
|
sprintf_s(bufC, "%s", 1);
|
||||||
|
printf("%s\n", bufC);
|
||||||
|
|
||||||
|
wchar_t bufWC[50];
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
swprintf_s(bufWC, _countof(bufWC), L"%s %d", L"swprintf_s");
|
||||||
|
wprintf(L"%s\n", bufWC);
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
swprintf_s(bufWC, L"%s %d", L"swprintf_s");
|
||||||
|
wprintf(L"%s\n", bufWC);
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
swprintf_s(bufWC, _countof(bufWC), L"test", 0);
|
||||||
|
wprintf(L"%s\n", bufWC);
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
swprintf_s(bufWC, L"test", L"swprintf_s");
|
||||||
|
wprintf(L"%s\n", bufWC);
|
||||||
|
// cppcheck-suppress invalidPrintfArgType_s
|
||||||
|
swprintf_s(bufWC, _countof(bufWC), L"%s", 1);
|
||||||
|
wprintf(L"%s\n", bufWC);
|
||||||
|
// cppcheck-suppress invalidPrintfArgType_s
|
||||||
|
swprintf_s(bufWC, L"%s", 1);
|
||||||
|
wprintf(L"%s\n", bufWC);
|
||||||
|
|
||||||
|
TCHAR bufTC[50];
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
_stprintf_s(bufTC, _countof(bufTC), TEXT("%s %d"), TEXT("_stprintf_s"));
|
||||||
|
_tprintf(L"%s\n", bufTC);
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
_stprintf_s(bufTC, TEXT("%s %d"), TEXT("_stprintf_s"));
|
||||||
|
_tprintf(TEXT("%s\n"), bufTC);
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
_stprintf_s(bufTC, _countof(bufTC), TEXT("test"), 0);
|
||||||
|
_tprintf(TEXT("%s\n"), bufTC);
|
||||||
|
// cppcheck-suppress wrongPrintfScanfArgNum
|
||||||
|
_stprintf_s(bufTC, TEXT("test"), TEXT("_stprintf_s"));
|
||||||
|
_tprintf(TEXT("%s\n"), bufTC);
|
||||||
|
// cppcheck-suppress invalidPrintfArgType_s
|
||||||
|
_stprintf_s(bufTC, _countof(bufTC), TEXT("%s"), 1);
|
||||||
|
_tprintf(TEXT("%s\n"), bufTC);
|
||||||
|
// cppcheck-suppress invalidPrintfArgType_s
|
||||||
|
_stprintf_s(bufTC, TEXT("%s"), 1);
|
||||||
|
_tprintf(TEXT("%s\n"), bufTC);
|
||||||
|
}
|
||||||
|
|
||||||
void allocDealloc_GetModuleHandleEx()
|
void allocDealloc_GetModuleHandleEx()
|
||||||
{
|
{
|
||||||
// For GetModuleHandleEx it depends on the first argument if FreeLibrary
|
// For GetModuleHandleEx it depends on the first argument if FreeLibrary
|
||||||
|
|
|
@ -4322,6 +4322,16 @@ private:
|
||||||
"[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n"
|
"[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n"
|
||||||
"[test.cpp:5]: (warning) sprintf_s format string requires 2 parameters but 3 are given.\n", errout.str());
|
"[test.cpp:5]: (warning) sprintf_s format string requires 2 parameters but 3 are given.\n", errout.str());
|
||||||
|
|
||||||
|
check("void foo() {\n"
|
||||||
|
" char str[10];\n"
|
||||||
|
" int i;\n"
|
||||||
|
" unsigned int u;\n"
|
||||||
|
" sprintf_s(str, \"%d %u\", u, i, 0);\n"
|
||||||
|
"}\n", false, false, Settings::Win32A);
|
||||||
|
ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n"
|
||||||
|
"[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n"
|
||||||
|
"[test.cpp:5]: (warning) sprintf_s format string requires 2 parameters but 3 are given.\n", errout.str());
|
||||||
|
|
||||||
check("void foo() {\n"
|
check("void foo() {\n"
|
||||||
" wchar_t str[10];\n"
|
" wchar_t str[10];\n"
|
||||||
" int i;\n"
|
" int i;\n"
|
||||||
|
@ -4332,6 +4342,16 @@ private:
|
||||||
"[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n"
|
"[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n"
|
||||||
"[test.cpp:5]: (warning) swprintf_s format string requires 2 parameters but 3 are given.\n", errout.str());
|
"[test.cpp:5]: (warning) swprintf_s format string requires 2 parameters but 3 are given.\n", errout.str());
|
||||||
|
|
||||||
|
check("void foo() {\n"
|
||||||
|
" wchar_t str[10];\n"
|
||||||
|
" int i;\n"
|
||||||
|
" unsigned int u;\n"
|
||||||
|
" swprintf_s(str, L\"%d %u\", u, i, 0);\n"
|
||||||
|
"}\n", false, false, Settings::Win32W);
|
||||||
|
ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n"
|
||||||
|
"[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n"
|
||||||
|
"[test.cpp:5]: (warning) swprintf_s format string requires 2 parameters but 3 are given.\n", errout.str());
|
||||||
|
|
||||||
check("void foo() {\n"
|
check("void foo() {\n"
|
||||||
" TCHAR str[10];\n"
|
" TCHAR str[10];\n"
|
||||||
" int i;\n"
|
" int i;\n"
|
||||||
|
|
Loading…
Reference in New Issue