std.cfg: Add strncpy_s and strncat_s (#1136)
This commit is contained in:
parent
db045c2bf6
commit
d3284d5d54
46
cfg/std.cfg
46
cfg/std.cfg
|
@ -4581,6 +4581,29 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
|
||||||
<valid>0:</valid>
|
<valid>0:</valid>
|
||||||
</arg>
|
</arg>
|
||||||
</function>
|
</function>
|
||||||
|
<!-- errno_t strncpy_s(char *restrict dest, rsize_t destsz, const char *restrict src, rsize_t count); // since C11 -->
|
||||||
|
<function name="strncpy_s">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="errno_t"/>
|
||||||
|
<leak-ignore/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-null/>
|
||||||
|
<not-uninit/>
|
||||||
|
<minsize type="argvalue" arg="2"/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="2">
|
||||||
|
<not-uninit/>
|
||||||
|
<valid>0:</valid>
|
||||||
|
</arg>
|
||||||
|
<arg nr="3">
|
||||||
|
<not-null/>
|
||||||
|
<not-uninit/>
|
||||||
|
<minsize type="argvalue" arg="4"/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="4">
|
||||||
|
<not-uninit/>
|
||||||
|
</arg>
|
||||||
|
</function>
|
||||||
<!-- const char *strpbrk(const char *str1, const char *str2); -->
|
<!-- const char *strpbrk(const char *str1, const char *str2); -->
|
||||||
<!-- char *strpbrk( char *str1, const char *str2); -->
|
<!-- char *strpbrk( char *str1, const char *str2); -->
|
||||||
<function name="strpbrk,std::strpbrk">
|
<function name="strpbrk,std::strpbrk">
|
||||||
|
@ -4618,6 +4641,29 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun
|
||||||
<valid>0:</valid>
|
<valid>0:</valid>
|
||||||
</arg>
|
</arg>
|
||||||
</function>
|
</function>
|
||||||
|
<!-- errno_t strncat_s(char *restrict dest, rsize_t destsz, const char *restrict src, rsize_t count); // since C11 -->
|
||||||
|
<function name="strncat_s">
|
||||||
|
<noreturn>false</noreturn>
|
||||||
|
<returnValue type="errno_t"/>
|
||||||
|
<leak-ignore/>
|
||||||
|
<arg nr="1">
|
||||||
|
<not-null/>
|
||||||
|
<not-uninit/>
|
||||||
|
<minsize type="argvalue" arg="2"/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="2">
|
||||||
|
<not-uninit/>
|
||||||
|
<valid>0:</valid>
|
||||||
|
</arg>
|
||||||
|
<arg nr="3">
|
||||||
|
<not-null/>
|
||||||
|
<not-uninit/>
|
||||||
|
<minsize type="argvalue" arg="4"/>
|
||||||
|
</arg>
|
||||||
|
<arg nr="4">
|
||||||
|
<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">
|
<function name="wcsncat,std::wcsncat">
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
|
|
|
@ -53,6 +53,19 @@ void bufferAccessOutOfBounds(void)
|
||||||
strncpy(a,"a",6);
|
strncpy(a,"a",6);
|
||||||
// cppcheck-suppress redundantCopy
|
// cppcheck-suppress redundantCopy
|
||||||
strncpy(a,"abcdefgh",4);
|
strncpy(a,"abcdefgh",4);
|
||||||
|
// valid call
|
||||||
|
strncpy_s(a,5,"abcd",5);
|
||||||
|
// string will be truncated, error is returned, but no buffer overflow
|
||||||
|
strncpy_s(a,5,"abcde",6);
|
||||||
|
// cppcheck-suppress bufferAccessOutOfBounds
|
||||||
|
strncpy_s(a,5,"a",6);
|
||||||
|
strncpy_s(a,5,"abcdefgh",4);
|
||||||
|
// valid call
|
||||||
|
strncat_s(a,5,"1",2);
|
||||||
|
// cppcheck-suppress bufferAccessOutOfBounds
|
||||||
|
strncat_s(a,10,"1",2);
|
||||||
|
// cppcheck-suppress bufferAccessOutOfBounds
|
||||||
|
strncat_s(a,5,"1",5);
|
||||||
fread(a,1,5,stdin);
|
fread(a,1,5,stdin);
|
||||||
// cppcheck-suppress bufferAccessOutOfBounds
|
// cppcheck-suppress bufferAccessOutOfBounds
|
||||||
fread(a,1,6,stdin);
|
fread(a,1,6,stdin);
|
||||||
|
@ -169,10 +182,18 @@ void nullpointer(int value)
|
||||||
// cppcheck-suppress nullPointer
|
// cppcheck-suppress nullPointer
|
||||||
strncpy(0,0,1);
|
strncpy(0,0,1);
|
||||||
// cppcheck-suppress nullPointer
|
// cppcheck-suppress nullPointer
|
||||||
|
strncpy_s(0,1,1,1);
|
||||||
|
// cppcheck-suppress nullPointer
|
||||||
|
strncpy_s(1,1,0,1);
|
||||||
|
// cppcheck-suppress nullPointer
|
||||||
wcsncpy(0,0,1);
|
wcsncpy(0,0,1);
|
||||||
// cppcheck-suppress nullPointer
|
// cppcheck-suppress nullPointer
|
||||||
strncat(0,0,1);
|
strncat(0,0,1);
|
||||||
// cppcheck-suppress nullPointer
|
// cppcheck-suppress nullPointer
|
||||||
|
strncat_s(0,1,1,1);
|
||||||
|
// cppcheck-suppress nullPointer
|
||||||
|
strncat_s(1,1,0,1);
|
||||||
|
// cppcheck-suppress nullPointer
|
||||||
wcsncat(0,0,1);
|
wcsncat(0,0,1);
|
||||||
// cppcheck-suppress ignoredReturnValue
|
// cppcheck-suppress ignoredReturnValue
|
||||||
// cppcheck-suppress nullPointer
|
// cppcheck-suppress nullPointer
|
||||||
|
@ -3022,6 +3043,28 @@ void uninivar_strncpy(void)
|
||||||
(void)strncpy(s,ct,n);
|
(void)strncpy(s,ct,n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uninivar_strncpy_s(char *Ct, size_t N1, char *S, size_t N2)
|
||||||
|
{
|
||||||
|
char *ct;
|
||||||
|
char *s;
|
||||||
|
size_t n1;
|
||||||
|
size_t n2;
|
||||||
|
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncpy_s(ct,n1,s,n2);
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncpy_s(ct,N1,S,N2);
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncpy_s(Ct,n1,S,N2);
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncpy_s(Ct,N1,s,N2);
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncpy_s(Ct,N1,S,n2);
|
||||||
|
|
||||||
|
// no warning is expected for
|
||||||
|
(void)strncpy_s(Ct,N1,S,N2);
|
||||||
|
}
|
||||||
|
|
||||||
void uninivar_strpbrk(void)
|
void uninivar_strpbrk(void)
|
||||||
{
|
{
|
||||||
char *cs;
|
char *cs;
|
||||||
|
@ -3048,6 +3091,28 @@ void uninivar_strncat(char *Ct, char *S, size_t N)
|
||||||
(void)strncat(Ct,S,N);
|
(void)strncat(Ct,S,N);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uninivar_strncat_s(char *Ct, size_t N1, char *S, size_t N2)
|
||||||
|
{
|
||||||
|
char *ct;
|
||||||
|
char *s;
|
||||||
|
size_t n1;
|
||||||
|
size_t n2;
|
||||||
|
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncat_s(ct,n1,s,n2);
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncat_s(ct,N1,S,N2);
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncat_s(Ct,n1,S,N2);
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncat_s(Ct,N1,s,N2);
|
||||||
|
// cppcheck-suppress uninitvar
|
||||||
|
(void)strncat_s(Ct,N1,S,n2);
|
||||||
|
|
||||||
|
// no warning is expected for
|
||||||
|
(void)strncat_s(Ct,N1,S,N2);
|
||||||
|
}
|
||||||
|
|
||||||
void uninivar_wcsncat(wchar_t *Ct, wchar_t *S, size_t N)
|
void uninivar_wcsncat(wchar_t *Ct, wchar_t *S, size_t N)
|
||||||
{
|
{
|
||||||
wchar_t *ct;
|
wchar_t *ct;
|
||||||
|
|
Loading…
Reference in New Issue