Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions cfg/std.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3989,7 +3989,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
</function>
<!-- void * memcpy(void *ct, const void *cs, size_t n);-->
<function name="memcpy,std::memcpy">
<returnValue type="void *"/>
<returnValue type="void *">arg1</returnValue>
<noreturn>false</noreturn>
<leak-ignore/>
<not-overlapping-data ptr1-arg="1" ptr2-arg="2" size-arg="3"/>
Expand All @@ -4010,7 +4010,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
</function>
<!-- wchar_t* wmemcpy( wchar_t* dest, const wchar_t* src, std::size_t count ); -->
<function name="wmemcpy,std::wmemcpy">
<returnValue type="wchar_t *"/>
<returnValue type="wchar_t *">arg1</returnValue>
<noreturn>false</noreturn>
<leak-ignore/>
<not-overlapping-data ptr1-arg="1" ptr2-arg="2" count-arg="3"/>
Expand Down Expand Up @@ -4056,7 +4056,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
<!-- void * memmove(void *ct, const void *cs, size_t n); -->
<function name="memmove,std::memmove">
<noreturn>false</noreturn>
<returnValue type="void *"/>
<returnValue type="void *">arg1</returnValue>
<leak-ignore/>
<arg nr="1" direction="out">
<not-null/>
Expand All @@ -4077,7 +4077,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
<!-- wchar_t * wmemmove(wchar_t *ct, const wchar_t *cs, size_t n); -->
<function name="wmemmove,std::wmemmove">
<noreturn>false</noreturn>
<returnValue type="wchar_t *"/>
<returnValue type="wchar_t *">arg1</returnValue>
<leak-ignore/>
<arg nr="1" direction="out">
<not-null/>
Expand Down Expand Up @@ -4118,7 +4118,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
</function>
<!-- void *memset(void *s, int c, size_t n); -->
<function name="memset,std::memset">
<returnValue type="void *"/>
<returnValue type="void *">arg1</returnValue>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1" direction="out" indirect="1">
Expand All @@ -4136,7 +4136,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
</function>
<!-- wchar_t *wmemset(wchar_t *s, wchar_t c, size_t n); -->
<function name="wmemset,std::wmemset">
<returnValue type="wchar_t *"/>
<returnValue type="wchar_t *">arg1</returnValue>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1" direction="out">
Expand Down Expand Up @@ -4812,7 +4812,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
</function>
<!-- char * strcat(char *deststr, const char *srcstr); -->
<function name="strcat,std::strcat">
<returnValue type="char *"/>
<returnValue type="char *">arg1</returnValue>
<noreturn>false</noreturn>
<leak-ignore/>
<not-overlapping-data ptr1-arg="1" ptr2-arg="2" strlen-arg="2"/>
Expand All @@ -4828,9 +4828,9 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
<strz/>
</arg>
</function>
<!-- wchar_t wcscat(wchar_t *deststr, const wchar_t *srcstr); -->
<!-- wchar_t* wcscat(wchar_t *deststr, const wchar_t *srcstr); -->
<function name="wcscat,std::wcscat">
<returnValue type="wchar_t"/>
<returnValue type="wchar_t *">arg1</returnValue>
<noreturn>false</noreturn>
<leak-ignore/>
<not-overlapping-data ptr1-arg="1" ptr2-arg="2" strlen-arg="2"/>
Expand Down Expand Up @@ -4942,7 +4942,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
</function>
<!-- wchar_t *wcscpy(wchar_t *deststr, const wchar_t *srcstr); -->
<function name="wcscpy,std::wcscpy">
<returnValue type="wchar_t *"/>
<returnValue type="wchar_t *">arg1</returnValue>
<noreturn>false</noreturn>
<leak-ignore/>
<not-overlapping-data ptr1-arg="1" ptr2-arg="2" strlen-arg="2"/>
Expand Down Expand Up @@ -5057,7 +5057,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
</function>
<!-- char * strncat(char *ct, const char *s, size_t n); -->
<function name="strncat,std::strncat">
<returnValue type="char *"/>
<returnValue type="char *">arg1</returnValue>
<noreturn>false</noreturn>
<leak-ignore/>
<not-overlapping-data ptr1-arg="1" ptr2-arg="2" size-arg="3"/>
Expand Down Expand Up @@ -5123,10 +5123,10 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
<not-uninit/>
</arg>
</function>
<!-- wchar_t *wcsncat(wchar_t *ct, const wchar_t *cs, size_t n); -->
<!-- wchar_t* *wcsncat(wchar_t *ct, const wchar_t *cs, size_t n); -->
<function name="wcsncat,std::wcsncat">
<noreturn>false</noreturn>
<returnValue type="wchar_t *"/>
<returnValue type="wchar_t *">arg1</returnValue>
<leak-ignore/>
<not-overlapping-data ptr1-arg="1" ptr2-arg="2" count-arg="3"/>
<arg nr="1" direction="inout">
Expand Down Expand Up @@ -5373,7 +5373,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
</function>
<!-- wchar_t * wcsncpy(wchar_t *s, const wchar_t *cs, size_t n); -->
<function name="wcsncpy,std::wcsncpy">
<returnValue type="wchar_t *"/>
<returnValue type="wchar_t *">arg1</returnValue>
<noreturn>false</noreturn>
<leak-ignore/>
<not-overlapping-data ptr1-arg="1" ptr2-arg="2" count-arg="3"/>
Expand Down
18 changes: 15 additions & 3 deletions test/cfg/std.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -869,7 +869,7 @@ char * overlappingWriteFunction_strncat(const char *src, char *dest, const std::
// cppcheck-suppress overlappingWriteFunction
(void)strncat(dest, dest+1, 2);
char buffer[] = "strncat";
// cppcheck-suppress overlappingWriteFunction
// cppcheck-suppress [overlappingWriteFunction,returnDanglingLifetime]
return strncat(buffer, buffer + 1, 3);
}

Expand All @@ -882,7 +882,7 @@ wchar_t * overlappingWriteFunction_wcsncat(const wchar_t *src, wchar_t *dest, co
// cppcheck-suppress overlappingWriteFunction
(void)wcsncat(dest, dest+1, 2);
wchar_t buffer[] = L"strncat";
// cppcheck-suppress overlappingWriteFunction
// cppcheck-suppress [overlappingWriteFunction,returnDanglingLifetime]
return wcsncat(buffer, buffer + 1, 3);
}

Expand Down Expand Up @@ -917,8 +917,8 @@ char * overlappingWriteFunction_strncpy(char *buf, const std::size_t count)

void * overlappingWriteFunction_memmove(void)
{
// No warning shall be shown:
char str[] = "memmove handles overlapping data well";
// cppcheck-suppress returnDanglingLifetime
return memmove(str,str+3,4);
}

Expand Down Expand Up @@ -4982,6 +4982,18 @@ std::span<const int> returnDanglingLifetime_std_span1() {
}
#endif

void* returnDanglingLifetime_memcpy() { // #14833
char a[4];
// cppcheck-suppress returnDanglingLifetime
return memcpy(a, "abc", 4);
}

wchar_t* returnDanglingLifetime_wcscat() {
wchar_t a[10]{L"abc"};
// cppcheck-suppress returnDanglingLifetime
return wcscat(a, L"def");
}

void beginEnd()
{
std::vector<int> v;
Expand Down
Loading