windows library: Add function configurations with tests (#1079)
Add function configurations with tests for: GetLocalTime, GetSystemTime, GetLastError, SetLastError, AllocateAndInitializeSid, FreeSid, HeapAlloc, HeapReAlloc, HeapFree, HeapSize, HeapValidate and GetProcessHeap. test/cfg/runtests.sh: Enable --inconclusive for the windows tests to avoid some issues in the future.
This commit is contained in:
parent
d9952dc6cf
commit
c235930539
159
cfg/windows.cfg
159
cfg/windows.cfg
|
@ -1176,6 +1176,10 @@
|
||||||
<!-- Do not add _alloca here. It is automatically freed! -->
|
<!-- Do not add _alloca here. It is automatically freed! -->
|
||||||
<dealloc>_freea</dealloc>
|
<dealloc>_freea</dealloc>
|
||||||
</memory>
|
</memory>
|
||||||
|
<memory>
|
||||||
|
<alloc init="true" arg="11">AllocateAndInitializeSid</alloc>
|
||||||
|
<dealloc>FreeSid</dealloc>
|
||||||
|
</memory>
|
||||||
<function name="RtlCompareMemory">
|
<function name="RtlCompareMemory">
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -4188,6 +4192,161 @@ HFONT CreateFont(
|
||||||
</arg>
|
</arg>
|
||||||
<warn severity="style" reason="Obsolete" alternatives="_strupr,_strupr_s"/>
|
<warn severity="style" reason="Obsolete" alternatives="_strupr,_strupr_s"/>
|
||||||
</function>
|
</function>
|
||||||
|
<!--void WINAPI GetLocalTime(_Out_ LPSYSTEMTIME lpSystemTime);-->
|
||||||
|
<!--void WINAPI GetSystemTime(_Out_ LPSYSTEMTIME lpSystemTime);-->
|
||||||
|
<function name="GetLocalTime,GetSystemTime">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<leak-ignore/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-null/>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
|
<!--DWORD WINAPI GetLastError(void);-->
|
||||||
|
<function name="GetLastError">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="DWORD"/>
|
||||||
|
<use-retval/>
|
||||||
|
</function>
|
||||||
|
<!--void WINAPI SetLastError(_In_ DWORD dwErrCode);-->
|
||||||
|
<function name="SetLastError">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<leak-ignore/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
|
<!--BOOL WINAPI AllocateAndInitializeSid(
|
||||||
|
_In_ PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
|
||||||
|
_In_ BYTE nSubAuthorityCount,
|
||||||
|
_In_ DWORD dwSubAuthority0,
|
||||||
|
_In_ DWORD dwSubAuthority1,
|
||||||
|
_In_ DWORD dwSubAuthority2,
|
||||||
|
_In_ DWORD dwSubAuthority3,
|
||||||
|
_In_ DWORD dwSubAuthority4,
|
||||||
|
_In_ DWORD dwSubAuthority5,
|
||||||
|
_In_ DWORD dwSubAuthority6,
|
||||||
|
_In_ DWORD dwSubAuthority7,
|
||||||
|
_Out_ PSID *pSid);-->
|
||||||
|
<function name="AllocateAndInitializeSid">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="BOOL"/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-null/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="11">
|
||||||
|
<not-null/>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
|
<!--PVOID WINAPI FreeSid(_In_ PSID pSid);-->
|
||||||
|
<function name="FreeSid">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="PVOID"/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
|
<!--LPVOID WINAPI HeapAlloc(
|
||||||
|
_In_ HANDLE hHeap,
|
||||||
|
_In_ DWORD dwFlags,
|
||||||
|
_In_ SIZE_T dwBytes);-->
|
||||||
|
<function name="HeapAlloc">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="LPVOID"/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="2">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="3">
|
||||||
|
<not-uninit/>
|
||||||
|
<valid>0:</valid>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
|
<!--LPVOID WINAPI HeapReAlloc(
|
||||||
|
_In_ HANDLE hHeap,
|
||||||
|
_In_ DWORD dwFlags,
|
||||||
|
_In_ LPVOID lpMem,
|
||||||
|
_In_ SIZE_T dwBytes);-->
|
||||||
|
<function name="HeapReAlloc">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="LPVOID"/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="2">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="3">
|
||||||
|
<not-null/>
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="4">
|
||||||
|
<not-uninit/>
|
||||||
|
<valid>0:</valid>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
|
<!--BOOL WINAPI HeapFree(
|
||||||
|
_In_ HANDLE hHeap,
|
||||||
|
_In_ DWORD dwFlags,
|
||||||
|
_In_ LPVOID lpMem);-->
|
||||||
|
<function name="HeapFree">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="BOOL"/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="2">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="3">
|
||||||
|
<not-null/>
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
|
<!--SIZE_T WINAPI HeapSize(
|
||||||
|
_In_ HANDLE hHeap,
|
||||||
|
_In_ DWORD dwFlags,
|
||||||
|
_In_ LPCVOID lpMem);-->
|
||||||
|
<function name="HeapSize">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="SIZE_T"/>
|
||||||
|
<use-retval/>
|
||||||
|
<leak-ignore/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="2">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="3">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
|
<!--BOOL WINAPI HeapValidate(
|
||||||
|
_In_ HANDLE hHeap,
|
||||||
|
_In_ DWORD dwFlags,
|
||||||
|
_In_opt_ LPCVOID lpMem);-->
|
||||||
|
<function name="HeapValidate">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="BOOL"/>
|
||||||
|
<leak-ignore/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="2">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="3">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
|
<!--HANDLE WINAPI GetProcessHeap(void);-->
|
||||||
|
<function name="GetProcessHeap">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="HANDLE"/>
|
||||||
|
<use-retval/>
|
||||||
|
</function>
|
||||||
<podtype name="LARGE_INTEGER" sign="s" size="8"/>
|
<podtype name="LARGE_INTEGER" sign="s" size="8"/>
|
||||||
<podtype name="POINTER_SIGNED" sign="s"/>
|
<podtype name="POINTER_SIGNED" sign="s"/>
|
||||||
<podtype name="POINTER_UNSIGNED" sign="u"/>
|
<podtype name="POINTER_UNSIGNED" sign="u"/>
|
||||||
|
|
|
@ -40,6 +40,6 @@ ${CPPCHECK} ${CPPCHECK_OPT} ${DIR}std.cpp
|
||||||
# windows.cpp
|
# windows.cpp
|
||||||
# Syntax check via g++ does not work because it can not find a valid windows.h
|
# Syntax check via g++ does not work because it can not find a valid windows.h
|
||||||
#${CXX} ${CXX_OPT} ${DIR}windows.cpp
|
#${CXX} ${CXX_OPT} ${DIR}windows.cpp
|
||||||
${CPPCHECK} ${CPPCHECK_OPT} --platform=win32A ${DIR}windows.cpp
|
${CPPCHECK} ${CPPCHECK_OPT} --inconclusive --platform=win32A ${DIR}windows.cpp
|
||||||
${CPPCHECK} ${CPPCHECK_OPT} --platform=win32W ${DIR}windows.cpp
|
${CPPCHECK} ${CPPCHECK_OPT} --inconclusive --platform=win32W ${DIR}windows.cpp
|
||||||
${CPPCHECK} ${CPPCHECK_OPT} --platform=win64 ${DIR}windows.cpp
|
${CPPCHECK} ${CPPCHECK_OPT} --inconclusive --platform=win64 ${DIR}windows.cpp
|
||||||
|
|
|
@ -79,6 +79,21 @@ void validCode()
|
||||||
void *pMem2 = _alloca(10);
|
void *pMem2 = _alloca(10);
|
||||||
memset(pMem2, 0, 10);
|
memset(pMem2, 0, 10);
|
||||||
|
|
||||||
|
SYSTEMTIME st;
|
||||||
|
GetSystemTime(&st);
|
||||||
|
|
||||||
|
DWORD lastError = GetLastError();
|
||||||
|
SetLastError(lastError);
|
||||||
|
|
||||||
|
PSID pEveryoneSID = NULL;
|
||||||
|
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
|
||||||
|
AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID)
|
||||||
|
FreeSid(pEveryoneSID);
|
||||||
|
|
||||||
|
LPVOID pMem = HeapAlloc(GetProcessHeap(), 0, 10);
|
||||||
|
pMem = HeapReAlloc(GetProcessHeap(), 0, pMem, 0);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pMem);
|
||||||
|
|
||||||
// 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);
|
||||||
|
@ -152,6 +167,11 @@ void nullPointer()
|
||||||
// cppcheck-suppress struprCalled
|
// cppcheck-suppress struprCalled
|
||||||
// cppcheck-suppress nullPointer
|
// cppcheck-suppress nullPointer
|
||||||
strupr(str);
|
strupr(str);
|
||||||
|
|
||||||
|
// cppcheck-suppress nullPointer
|
||||||
|
GetSystemTime(NULL);
|
||||||
|
// cppcheck-suppress nullPointer
|
||||||
|
GetLocalTime(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void memleak_malloca()
|
void memleak_malloca()
|
||||||
|
@ -161,6 +181,24 @@ void memleak_malloca()
|
||||||
// cppcheck-suppress memleak
|
// cppcheck-suppress memleak
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void memleak_AllocateAndInitializeSid()
|
||||||
|
{
|
||||||
|
PSID pEveryoneSID = NULL;
|
||||||
|
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
|
||||||
|
AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID)
|
||||||
|
// TODO: enable when #6994 is implemented cppcheck-suppress memleak
|
||||||
|
}
|
||||||
|
|
||||||
|
void memleak_HeapAlloc()
|
||||||
|
{
|
||||||
|
LPVOID pMem;
|
||||||
|
pMem = HeapAlloc(GetProcessHeap(), 0, 10);
|
||||||
|
HeapValidate(GetProcessHeap(), 0, pMem);
|
||||||
|
// cppcheck-suppress unreadVariable
|
||||||
|
SIZE_T memSize = HeapSize(GetProcessHeap(), 0, pMem);
|
||||||
|
// cppcheck-suppress memleak
|
||||||
|
}
|
||||||
|
|
||||||
void resourceLeak_CreateSemaphoreA()
|
void resourceLeak_CreateSemaphoreA()
|
||||||
{
|
{
|
||||||
HANDLE hSemaphore;
|
HANDLE hSemaphore;
|
||||||
|
@ -280,6 +318,16 @@ void ignoredReturnValue()
|
||||||
_malloca(10);
|
_malloca(10);
|
||||||
// cppcheck-suppress ignoredReturnValue
|
// cppcheck-suppress ignoredReturnValue
|
||||||
_alloca(5);
|
_alloca(5);
|
||||||
|
|
||||||
|
// cppcheck-suppress ignoredReturnValue
|
||||||
|
GetLastError();
|
||||||
|
|
||||||
|
// cppcheck-suppress ignoredReturnValue
|
||||||
|
GetProcessHeap()
|
||||||
|
// cppcheck-suppress leakReturnValNotUsed
|
||||||
|
HeapAlloc(GetProcessHeap(), 0, 10);
|
||||||
|
// cppcheck-suppress leakReturnValNotUsed
|
||||||
|
HeapReAlloc(GetProcessHeap(), 0, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void invalidFunctionArg()
|
void invalidFunctionArg()
|
||||||
|
@ -361,6 +409,10 @@ void uninitvar()
|
||||||
// cppcheck-suppress struprCalled
|
// cppcheck-suppress struprCalled
|
||||||
// cppcheck-suppress uninitvar
|
// cppcheck-suppress uninitvar
|
||||||
strupr(buf_uninit);
|
strupr(buf_uninit);
|
||||||
|
|
||||||
|
DWORD dwordUninit;
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
SetLastError(dwordUninit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void allocDealloc_GetModuleHandleEx()
|
void allocDealloc_GetModuleHandleEx()
|
||||||
|
|
Loading…
Reference in New Issue