libcurl.cfg: Add library configuration for libcurl (#2120)

Add curl_easy_*() functions and deprecated functions with warnings.
Add tests and prepare donate-cpu.py
Reference: https://curl.haxx.se/libcurl/c/
This commit is contained in:
Sebastian 2019-08-29 15:11:59 +02:00 committed by GitHub
parent 8782a5f5e4
commit a501f65c8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 602 additions and 1 deletions

View File

@ -18,7 +18,7 @@ env:
before_install:
# install needed deps
- travis_retry sudo apt-get update -qq
- travis_retry sudo apt-get install -qq python-pygments qt5-default qt5-qmake qtbase5-dev qtcreator libxml2-utils libpcre3 gdb unzip wx-common xmlstarlet python3-dev liblua5.3-dev
- travis_retry sudo apt-get install -qq python-pygments qt5-default qt5-qmake qtbase5-dev qtcreator libxml2-utils libpcre3 gdb unzip wx-common xmlstarlet python3-dev liblua5.3-dev libcurl3
- travis_retry python2 -m pip install --user pytest==4.6.4
- travis_retry python2 -m pip install --user pylint
- travis_retry python2 -m pip install --user unittest2

487
cfg/libcurl.cfg Normal file
View File

@ -0,0 +1,487 @@
<?xml version="1.0"?>
<def format="2">
<!-- libcurl C API. See https://curl.haxx.se/libcurl/c/ -->
<!-- The libcurl C API is typically include by '#include <curl/curl.h>' -->
<!-- ########## libcurl Types ########## -->
<podtype name="CURLcode"/>
<!-- ########## libcurl defines / macros ########## -->
<define name="CURLE_OK" value="(0)"/>
<!-- ########## libcurl Allocation / Deallocation ########## -->
<resource>
<alloc init="true">curl_easy_init</alloc>
<alloc init="true">curl_easy_duphandle</alloc>
<dealloc>curl_easy_cleanup</dealloc>
</resource>
<memory>
<alloc init="true">curl_easy_escape</alloc>
<alloc init="true">curl_easy_unescape</alloc>
<alloc init="true">curl_escape</alloc>
<alloc init="true">curl_unescape</alloc>
<dealloc>curl_free</dealloc>
</memory>
<memory>
<alloc init="true">curl_getenv</alloc>
<alloc init="true">curl_maprintf</alloc>
<alloc init="true">curl_mvaprintf</alloc>
<dealloc>free</dealloc>
</memory>
<!-- ########## libcurl C API Functions ########## -->
<!-- void curl_easy_cleanup(CURL * handle ); -->
<function name="curl_easy_cleanup">
<noreturn>false</noreturn>
<returnValue type="void"/>
<arg nr="1">
<not-uninit/>
<not-bool/>
</arg>
</function>
<!-- CURL *curl_easy_duphandle(CURL *handle ); -->
<function name="curl_easy_duphandle">
<noreturn>false</noreturn>
<returnValue type="CURL *"/>
<use-retval/>
<arg nr="1">
<not-uninit/>
<not-bool/>
</arg>
</function>
<!-- char *curl_easy_escape( CURL * curl , const char * string , int length ); -->
<function name="curl_easy_escape">
<noreturn>false</noreturn>
<returnValue type="char *"/>
<use-retval/>
<arg nr="1">
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
</arg>
<arg nr="3" direction="in">
<not-uninit/>
<not-bool/>
<valid>0:</valid>
</arg>
</function>
<!-- CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... ); -->
<function name="curl_easy_getinfo">
<noreturn>false</noreturn>
<returnValue type="CURLcode"/>
<leak-ignore/>
<arg nr="1">
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
</arg>
<arg nr="3" direction="out">
<not-bool/>
</arg>
</function>
<!-- CURL *curl_easy_init( ); -->
<function name="curl_easy_init">
<noreturn>false</noreturn>
<returnValue type="CURL *"/>
<use-retval/>
</function>
<!-- CURLcode curl_easy_pause(CURL *handle , int bitmask ); -->
<function name="curl_easy_pause">
<noreturn>false</noreturn>
<returnValue type="CURLcode"/>
<leak-ignore/>
<arg nr="1">
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
<not-bool/>
</arg>
</function>
<!-- CURLcode curl_easy_perform(CURL * easy_handle ); -->
<function name="curl_easy_perform">
<noreturn>false</noreturn>
<returnValue type="CURLcode"/>
<leak-ignore/>
<arg nr="1">
<not-uninit/>
<not-bool/>
</arg>
</function>
<!-- CURLcode curl_easy_recv( CURL * curl , void * buffer , size_t buflen , size_t * n ); -->
<function name="curl_easy_recv">
<noreturn>false</noreturn>
<returnValue type="CURLcode"/>
<leak-ignore/>
<arg nr="1">
<not-uninit/>
</arg>
<arg nr="2" direction="out">
<minsize type="argvalue" arg="3"/>
</arg>
<arg nr="3" direction="in">
<not-uninit/>
<valid>0:</valid>
</arg>
<arg nr="4" direction="out">
<not-null/>
<not-bool/>
</arg>
</function>
<!-- void curl_easy_reset(CURL *handle ); -->
<function name="curl_easy_reset">
<noreturn>false</noreturn>
<returnValue type="void"/>
<leak-ignore/>
<arg nr="1">
<not-uninit/>
</arg>
</function>
<!-- CURLcode curl_easy_send( CURL * curl , const void * buffer , size_t buflen , size_t * n ); -->
<function name="curl_easy_send">
<noreturn>false</noreturn>
<returnValue type="CURLcode"/>
<leak-ignore/>
<arg nr="1">
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<minsize type="argvalue" arg="3"/>
<not-uninit/>
</arg>
<arg nr="3" direction="in">
<not-uninit/>
<valid>0:</valid>
</arg>
<arg nr="4" direction="out">
<not-null/>
<not-bool/>
</arg>
</function>
<!-- CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); -->
<function name="curl_easy_setopt">
<noreturn>false</noreturn>
<returnValue type="CURLcode"/>
<leak-ignore/>
<arg nr="1">
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
</arg>
<arg nr="3" direction="in">
<not-uninit/>
</arg>
</function>
<!-- const char *curl_easy_strerror(CURLcode errornum); -->
<function name="curl_easy_strerror">
<noreturn>false</noreturn>
<returnValue type="const char *"/>
<use-retval/>
<arg nr="1" direction="in">
<not-uninit/>
<not-bool/>
</arg>
</function>
<!-- char *curl_easy_unescape( CURL * curl , const char * url , int inlength , int * outlength ); -->
<function name="curl_easy_unescape">
<noreturn>false</noreturn>
<returnValue type="char *"/>
<arg nr="1">
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
</arg>
<arg nr="3" direction="in">
<not-uninit/>
<valid>0:</valid>
</arg>
<arg nr="4" direction="out">
<not-bool/>
</arg>
</function>
<!-- CURLcode curl_easy_upkeep(CURL * handle ); -->
<function name="curl_easy_upkeep">
<noreturn>false</noreturn>
<returnValue type="CURLcode"/>
<leak-ignore/>
<arg nr="1">
<not-uninit/>
</arg>
</function>
<!-- char *curl_escape( const char * url , int length ); -->
<function name="curl_escape">
<noreturn>false</noreturn>
<returnValue type="char *"/>
<use-retval/>
<warn severity="style" alternatives="curl_easy_escape" reason="Obsolete"/>
<arg nr="1" direction="in">
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
<not-bool/>
<valid>0:</valid>
</arg>
</function>
<!-- void curl_free( char * ptr ); -->
<function name="curl_free">
<noreturn>false</noreturn>
<returnValue type="void"/>
<arg nr="1"/>
</function>
<!-- char *curl_getenv(const char * name ); -->
<function name="curl_getenv">
<noreturn>false</noreturn>
<returnValue type="char *"/>
<use-retval/>
<warn severity="style">This function will be removed from the public libcurl API in a near future. It will instead be made "available" by source code access only, and then as curlx_getenv().</warn>
<arg nr="1" direction="in">
<not-uninit/>
<not-bool/>
</arg>
</function>
<!-- char *curl_maprintf(const char * format , ...); -->
<function name="curl_maprintf">
<noreturn>false</noreturn>
<returnValue type="char *"/>
<use-retval/>
<warn severity="style">These functions will be removed from the public libcurl API in the future. Do not use them in any new programs or projects.</warn>
<formatstr/>
<arg nr="1" direction="in">
<formatstr/>
<not-uninit/>
</arg>
</function>
<!-- int curl_mfprintf(FILE * fd , const char * format , ...); -->
<function name="curl_mfprintf">
<returnValue type="int"/>
<noreturn>false</noreturn>
<leak-ignore/>
<warn severity="style" alternatives="fprintf" reason="Obsolete"/>
<arg nr="1" direction="inout">
<not-null/>
<not-uninit/>
</arg>
<formatstr/>
<arg nr="2" direction="in">
<formatstr/>
<not-uninit/>
</arg>
</function>
<!-- int curl_mprintf(const char * format , ...); -->
<function name="curl_mprintf">
<noreturn>false</noreturn>
<returnValue type="int"/>
<leak-ignore/>
<warn severity="style" alternatives="printf" reason="Obsolete"/>
<formatstr/>
<arg nr="1" direction="in">
<formatstr/>
<not-uninit/>
</arg>
</function>
<!-- int curl_msnprintf(char * buffer , size_t maxlength , const char * format , ...); -->
<function name="curl_msnprintf">
<returnValue type="int"/>
<noreturn>false</noreturn>
<leak-ignore/>
<warn severity="style" alternatives="snprintf" reason="Obsolete"/>
<arg nr="1" direction="out">
<not-uninit/>
<minsize type="argvalue" arg="2"/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
<valid>0:</valid>
</arg>
<formatstr/>
<arg nr="3" direction="in">
<formatstr/>
<not-null/>
<not-uninit/>
</arg>
</function>
<!-- int curl_msprintf(char * buffer , const char * format , ...); -->
<function name="curl_msprintf">
<returnValue type="int"/>
<noreturn>false</noreturn>
<leak-ignore/>
<warn severity="style" alternatives="sprintf" reason="Obsolete"/>
<arg nr="1" direction="out">
<not-uninit/>
<minsize type="strlen" arg="2"/>
</arg>
<formatstr/>
<arg nr="2" direction="in">
<formatstr/>
<not-null/>
<not-uninit/>
</arg>
</function>
<!-- CURLMcode curl_multi_socket(CURLM * multi_handle, curl_socket_t sockfd, int *running_handles); -->
<function name="curl_multi_socket">
<noreturn>false</noreturn>
<returnValue type="CURLMcode"/>
<leak-ignore/>
<warn severity="style" alternatives="curl_multi_socket_action" reason="Obsolete">Usage of curl_multi_socket is deprecated, whereas the function is equivalent to curl_multi_socket_action with ev_bitmask set to 0.</warn>
<arg nr="1">
<not-null/>
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
</arg>
<arg nr="3" direction="out">
<not-null/>
<not-bool/>
</arg>
</function>
<!-- CURLMcode curl_multi_socket_all(CURLM *multi_handle, int *running_handles); -->
<function name="curl_multi_socket_all">
<noreturn>false</noreturn>
<returnValue type="CURLMcode"/>
<leak-ignore/>
<warn severity="style" alternatives="curl_multi_socket_action" reason="Obsolete"/>
<arg nr="1">
<not-null/>
<not-uninit/>
</arg>
<arg nr="2" direction="out">
<not-null/>
<not-bool/>
</arg>
</function>
<!-- char *curl_mvaprintf(const char * format , va_list args ); -->
<function name="curl_mvaprintf">
<returnValue type="char *"/>
<noreturn>false</noreturn>
<use-retval/>
<warn severity="style">These functions will be removed from the public libcurl API in the future. Do not use them in any new programs or projects.</warn>
<arg nr="1" direction="in">
<not-uninit/>
<formatstr/>
</arg>
<arg nr="2"/>
</function>
<!-- int curl_mvfprintf(FILE * fd , const char * format , va_list args ); -->
<function name="curl_mvfprintf">
<returnValue type="int"/>
<noreturn>false</noreturn>
<leak-ignore/>
<warn severity="style" alternatives="vfprintf" reason="Obsolete"/>
<arg nr="1" direction="inout">
<not-null/>
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
<formatstr/>
</arg>
<arg nr="3"/>
</function>
<!-- int curl_mvprintf(const char * format , va_list args ); -->
<function name="curl_mvprintf">
<returnValue type="int"/>
<noreturn>false</noreturn>
<leak-ignore/>
<warn severity="style" alternatives="vprintf" reason="Obsolete"/>
<arg nr="1" direction="in">
<not-uninit/>
<formatstr/>
</arg>
<arg nr="2"/>
</function>
<!-- int curl_mvsnprintf(char * buffer , size_t maxlength , const char * format , va_list args ); -->
<function name="curl_mvsnprintf">
<returnValue type="int"/>
<noreturn>false</noreturn>
<leak-ignore/>
<warn severity="style" alternatives="vsnprintf" reason="Obsolete"/>
<arg nr="1" direction="out">
<not-uninit/>
<minsize type="argvalue" arg="2"/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
<valid>0:</valid>
</arg>
<arg nr="3" direction="in">
<not-null/>
<not-uninit/>
<formatstr/>
</arg>
<arg nr="4"/>
</function>
<!-- int curl_mvsprintf(char * buffer , const char * format , va_list args ); -->
<function name="curl_mvsprintf">
<returnValue type="int"/>
<noreturn>false</noreturn>
<leak-ignore/>
<warn severity="style" alternatives="vsprintf" reason="Obsolete"/>
<arg nr="1" direction="out">
<not-null/>
</arg>
<arg nr="2" direction="in">
<not-null/>
<not-uninit/>
<formatstr/>
</arg>
<arg nr="3"/>
</function>
<!-- int curl_strequal(char * str1 , char * str2 ); -->
<function name="curl_strequal">
<noreturn>false</noreturn>
<returnValue type="int"/>
<use-retval/>
<pure/>
<leak-ignore/>
<warn severity="style">These functions will be removed from the public libcurl API in a near future. They will instead be made "available" by source code access only, and then as curlx_strequal() and curlx_strenqual().</warn>
<arg nr="1" direction="in">
<not-null/>
<not-uninit/>
<strz/>
</arg>
<arg nr="2" direction="in">
<not-null/>
<not-uninit/>
<strz/>
</arg>
</function>
<!-- int curl_strnequal(char * str1 , char * str2 , size_t len ); -->
<function name="curl_strnequal">
<noreturn>false</noreturn>
<returnValue type="int"/>
<use-retval/>
<pure/>
<leak-ignore/>
<warn severity="style">These functions will be removed from the public libcurl API in a near future. They will instead be made "available" by source code access only, and then as curlx_strequal() and curlx_strenqual().</warn>
<arg nr="1" direction="in">
<not-null/>
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-null/>
<not-uninit/>
</arg>
<arg nr="3" direction="in">
<not-uninit/>
<not-bool/>
<valid>0:</valid>
</arg>
</function>
<!-- char *curl_unescape( const char * url , int length ); -->
<function name="curl_unescape">
<noreturn>false</noreturn>
<returnValue type="char *"/>
<use-retval/>
<warn severity="style" alternatives="curl_easy_unescape" reason="Obsolete"/>
<arg nr="1" direction="in">
<not-uninit/>
</arg>
<arg nr="2" direction="in">
<not-uninit/>
<not-bool/>
<valid>0:</valid>
</arg>
</function>
</def>

86
test/cfg/libcurl.c Normal file
View File

@ -0,0 +1,86 @@
// Test library configuration for libcurl.cfg
//
// Usage:
// $ cppcheck --check-library --library=libcurl --enable=information --error-exitcode=1 --inline-suppr --suppress=missingIncludeSystem test/cfg/libcurl.c
// =>
// No warnings about bad library configuration, unmatched suppressions, etc. exitcode=0
//
#include <curl/curl.h>
#include <stdio.h>
void validCode()
{
CURL *curl = curl_easy_init();
if (curl) {
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
printf("error");
} else {
long response_code;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
printf("%ld", response_code);
char * pStr = curl_easy_escape(curl, "a", 1);
if (pStr)
printf("%s", pStr);
curl_free(pStr);
curl_easy_reset(curl);
}
curl_easy_cleanup(curl);
}
}
void ignoredReturnValue(CURL * handle)
{
// cppcheck-suppress ignoredReturnValue
curl_easy_strerror(1);
}
void resourceLeak_curl_easy_init()
{
CURL *curl = curl_easy_init();
printf("%p", curl);
// cppcheck-suppress resourceLeak
}
void resourceLeak_curl_easy_duphandle(CURL * handle)
{
CURL *curl = curl_easy_duphandle(handle);
printf("%p", curl);
// cppcheck-suppress resourceLeak
}
void memleak_curl_easy_escape(CURL * handle)
{
char * pStr = curl_easy_escape(handle, "a", 1);
if (pStr)
printf("%s", pStr);
// cppcheck-suppress memleak
}
void nullPointer(CURL * handle)
{
char * buf[10] = {0};
size_t len;
curl_easy_recv(handle, buf, 10, &len);
// cppcheck-suppress nullPointer
curl_easy_recv(handle, buf, 10, NULL);
curl_easy_send(handle, buf, 10, &len);
// cppcheck-suppress nullPointer
curl_easy_send(handle, buf, 10, NULL);
}
void uninitvar(CURL * handle)
{
char * bufInit[10] = {0};
char * bufUninit;
size_t len;
curl_easy_send(handle, bufInit, 10, &len);
// cppcheck-suppress uninitvar
curl_easy_send(handle, bufUninit, 10, &len);
}

View File

@ -226,6 +226,33 @@ else
fi
${CPPCHECK} ${CPPCHECK_OPT} --library=lua ${DIR}lua.c
# libcurl.c
set +e
pkg-config --version
PKGCONFIG_RETURNCODE=$?
set -e
if [ $PKGCONFIG_RETURNCODE -ne 0 ]; then
echo "pkg-config needed to retrieve libcurl configuration is not available, skipping syntax check."
else
set +e
LIBCURLCONFIG=$(pkg-config --cflags libcurl)
LIBCURLCONFIG_RETURNCODE=$?
set -e
if [ $LIBCURLCONFIG_RETURNCODE -eq 0 ]; then
set +e
echo -e "#include <curl/curl.h>" | ${CC} ${CC_OPT} ${LIBCURLCONFIG} -x c -
LIBCURLCONFIG_RETURNCODE=$?
set -e
if [ $LIBCURLCONFIG_RETURNCODE -ne 0 ]; then
echo "libcurl not completely present or not working, skipping syntax check with ${CC}."
else
echo "libcurl found and working, checking syntax with ${CC} now."
${CC} ${CC_OPT} ${LIBCURLCONFIG} ${DIR}libcurl.c
fi
fi
fi
${CPPCHECK} ${CPPCHECK_OPT} --library=libcurl ${DIR}libcurl.c
# Check the syntax of the defines in the configuration files
set +e
xmlstarlet --version

View File

@ -273,6 +273,7 @@ def scan_package(work_path, cppcheck_path, jobs):
'googletest': ['<gtest/gtest.h>'],
'gtk': ['<gtk/gtk.h>', '<glib.h>', '<glib/', '<gnome.h>'],
'libcerror': ['<libcerror.h>'],
# 'libcurl': ['<curl/curl.h>'], <= enable after release of version 1.89
# 'lua': ['<lua.h>', '"lua.h"'], <= enable after release of version 1.89
'microsoft_sal': ['<sal.h>'],
'motif': ['<X11/', '<Xm/'],