python.cfg: Improve Python C API configuration
Add configurations for types, macros, alloc/dealloc and functions.
This commit is contained in:
parent
37a5810779
commit
076c604de8
149
cfg/python.cfg
149
cfg/python.cfg
|
@ -1,6 +1,64 @@
|
|||
<?xml version="1.0"?>
|
||||
<def format="2">
|
||||
<!-- Python C API. see https://docs.python.org/2/c-api/index.html -->
|
||||
<!-- ########## Python C API Types ########## -->
|
||||
<define name="PY_LONG_LONG" value="long long"/>
|
||||
<podtype name="Py_ssize_t" sign="s"/>
|
||||
<define name="Py_uintptr_t" value="uintptr_t"/>
|
||||
<define name="Py_intptr_t" value="intptr_t"/>
|
||||
<define name="PY_UINT32_T" value="uint32_t"/>
|
||||
<define name="PY_UINT64_T" value="uint64_t"/>
|
||||
<define name="PY_INT32_T" value="int32_t"/>
|
||||
<define name="PY_INT64_T" value="int64_t"/>
|
||||
<define name="Py_hash_t" value="Py_ssize_t"/>
|
||||
<define name="Py_uhash_t" value="size_t"/>
|
||||
<define name="Py_ssize_clean_t" value="Py_ssize_t"/>
|
||||
<!-- ########## Python C API Macros / Defines ########## -->
|
||||
<define name="PY_LLONG_MIN" value="LLONG_MIN"/>
|
||||
<define name="PY_LLONG_MAX" value="LLONG_MAX"/>
|
||||
<define name="PY_ULLONG_MAX" value="ULLONG_MAX"/>
|
||||
<define name="PY_SIZE_MAX" value="SIZE_MAX"/>
|
||||
<define name="PY_SSIZE_T_MAX" value="((Py_ssize_t)(((size_t)-1)>>1))"/>
|
||||
<define name="PY_SSIZE_T_MIN" value="(-PY_SSIZE_T_MAX-1)"/>
|
||||
<define name="Py_MEMCPY" value="memcpy"/>
|
||||
<define name="Py_FORCE_EXPANSION(X)" value="X"/>
|
||||
<define name="Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW)" value="(NARROW)(VALUE)"/>
|
||||
<define name="Py_ALIGNED(x)" value=""/>
|
||||
<define name="Py_VA_COPY" value="va_copy"/>
|
||||
<define name="PyMem_MALLOC(n)" value="PyMem_Malloc(n)"/>
|
||||
<define name="PyMem_REALLOC(p, n)" value="PyMem_Realloc(p, n)"/>
|
||||
<define name="PyMem_FREE(p)" value="PyMem_Free(p)"/>
|
||||
<define name="PyMem_Del" value="PyMem_Free"/>
|
||||
<define name="PyMem_DEL" value="PyMem_FREE"/>
|
||||
<define name="PyMem_New(type, n)" value="( (type *) PyMem_Malloc((n) * sizeof(type)) )"/>
|
||||
<define name="PyMem_NEW(type, n)" value="( (type *) PyMem_MALLOC((n) * sizeof(type)) )"/>
|
||||
<define name="PyMem_Resize(p, type, n)" value="( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : (type *) PyMem_Realloc((p), (n) * sizeof(type)) )"/>
|
||||
<define name="PyMem_RESIZE(p, type, n)" value="( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : (type *) PyMem_REALLOC((p), (n) * sizeof(type)) )"/>
|
||||
<define name="PyObject_MALLOC" value="PyObject_Malloc"/>
|
||||
<define name="PyObject_REALLOC" value="PyObject_Realloc"/>
|
||||
<define name="PyObject_FREE" value="PyObject_Free"/>
|
||||
<define name="PyObject_Del" value="PyObject_Free"/>
|
||||
<define name="PyObject_DEL" value="PyObject_Free"/>
|
||||
<!-- ########## Python C API Allocation / Deallocation ########## -->
|
||||
<memory>
|
||||
<alloc init="false" buffer-size="malloc">PyMem_Malloc</alloc>
|
||||
<alloc init="true" buffer-size="calloc">PyMem_Calloc</alloc>
|
||||
<realloc init="false" buffer-size="malloc:2">PyMem_Realloc</realloc>
|
||||
<dealloc>PyMem_Free</dealloc>
|
||||
</memory>
|
||||
<memory>
|
||||
<alloc init="false" buffer-size="malloc">PyMem_RawMalloc</alloc>
|
||||
<alloc init="true" buffer-size="calloc">PyMem_RawCalloc</alloc>
|
||||
<realloc init="false" buffer-size="malloc:2">PyMem_RawRealloc</realloc>
|
||||
<dealloc>PyMem_RawFree</dealloc>
|
||||
</memory>
|
||||
<memory>
|
||||
<alloc init="false" buffer-size="malloc">PyObject_Malloc</alloc>
|
||||
<alloc init="true" buffer-size="calloc">PyObject_Calloc</alloc>
|
||||
<realloc init="false" buffer-size="malloc:2">PyObject_Realloc</realloc>
|
||||
<dealloc>PyObject_Free</dealloc>
|
||||
</memory>
|
||||
<!-- ########## Python C API Functions ########## -->
|
||||
<!-- Those are macros, but it's helpful to declare a function here -->
|
||||
<function name="Py_INCREF,Py_IncRef,Py_DECREF,Py_DecRef">
|
||||
<leak-ignore/>
|
||||
|
@ -20,6 +78,22 @@
|
|||
<not-uninit/>
|
||||
</arg>
|
||||
</function>
|
||||
<!-- void Py_Exit(int status) -->
|
||||
<function name="Py_Exit">
|
||||
<noreturn>true</noreturn>
|
||||
<returnValue type="void"/>
|
||||
<arg nr="1" direction="in">
|
||||
<not-uninit/>
|
||||
</arg>
|
||||
</function>
|
||||
<!-- void Py_FatalError(const char *message) -->
|
||||
<function name="Py_FatalError">
|
||||
<noreturn>true</noreturn>
|
||||
<returnValue type="void"/>
|
||||
<arg nr="1" direction="in">
|
||||
<not-uninit/>
|
||||
</arg>
|
||||
</function>
|
||||
<function name="Py_Initialize,Py_Finalize">
|
||||
<noreturn>false</noreturn>
|
||||
<returnValue type="void"/>
|
||||
|
@ -337,6 +411,81 @@
|
|||
<not-uninit/>
|
||||
</arg>
|
||||
</function>
|
||||
<!-- void* PyMem_Calloc(size_t nelem, size_t elsize) -->
|
||||
<!-- void* PyMem_RawCalloc(size_t nelem, size_t elsize) -->
|
||||
<function name="PyMem_Calloc,PyMem_RawCalloc">
|
||||
<use-retval/>
|
||||
<noreturn>false</noreturn>
|
||||
<returnValue type="void *"/>
|
||||
<arg nr="1" direction="in">
|
||||
<not-uninit/>
|
||||
<valid>1:</valid>
|
||||
</arg>
|
||||
<arg nr="2" direction="in">
|
||||
<not-uninit/>
|
||||
<valid>0:</valid>
|
||||
</arg>
|
||||
</function>
|
||||
<!-- void PyMem_Free(void *p) -->
|
||||
<!-- void PyMem_RawFree(void *p) -->
|
||||
<function name="PyMem_Free,PyMem_RawFree">
|
||||
<noreturn>false</noreturn>
|
||||
<returnValue type="void"/>
|
||||
<arg nr="1">
|
||||
<not-uninit/>
|
||||
</arg>
|
||||
</function>
|
||||
<!-- void* PyMem_Malloc(size_t n) -->
|
||||
<!-- void* PyMem_RawMalloc(size_t n) -->
|
||||
<function name="PyMem_Malloc,PyMem_RawMalloc">
|
||||
<noreturn>false</noreturn>
|
||||
<returnValue type="void *"/>
|
||||
<use-retval/>
|
||||
<arg nr="1" direction="in">
|
||||
<not-uninit/>
|
||||
<valid>0:</valid>
|
||||
</arg>
|
||||
</function>
|
||||
<!-- void* PyMem_Realloc(void *p, size_t n) -->
|
||||
<!-- void* PyMem_RawRealloc(void *p, size_t n) -->
|
||||
<function name="PyMem_Realloc,PyMem_RawRealloc">
|
||||
<returnValue type="void *"/>
|
||||
<use-retval/>
|
||||
<noreturn>false</noreturn>
|
||||
<arg nr="1">
|
||||
<not-uninit/>
|
||||
</arg>
|
||||
<arg nr="2" direction="in">
|
||||
<not-uninit/>
|
||||
<valid>0:</valid>
|
||||
</arg>
|
||||
</function>
|
||||
<!-- void PyObject_Del(void *op) -->
|
||||
<function name="PyObject_Del">
|
||||
<noreturn>false</noreturn>
|
||||
<returnValue type="void"/>
|
||||
<arg nr="1">
|
||||
<not-uninit/>
|
||||
</arg>
|
||||
</function>
|
||||
<!-- TYPE* PyObject_New(TYPE, PyTypeObject *type) -->
|
||||
<function name="PyObject_New">
|
||||
<noreturn>false</noreturn>
|
||||
<use-retval/>
|
||||
<arg nr="1"/>
|
||||
<arg nr="2"/>
|
||||
</function>
|
||||
<!-- TYPE* PyObject_NewVar(TYPE, PyTypeObject *type, Py_ssize_t size) -->
|
||||
<function name="PyObject_NewVar">
|
||||
<noreturn>false</noreturn>
|
||||
<use-retval/>
|
||||
<arg nr="1"/>
|
||||
<arg nr="2"/>
|
||||
<arg nr="3" direction="in">
|
||||
<not-uninit/>
|
||||
<not-bool/>
|
||||
</arg>
|
||||
</function>
|
||||
<!-- Deprecated DL_IMPORT and DL_EXPORT macros -->
|
||||
<define name="DL_IMPORT(RTYPE)" value="RTYPE"/>
|
||||
<define name="DL_EXPORT(RTYPE)" value="RTYPE"/>
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h> // should be the first include
|
||||
#include <stdio.h>
|
||||
|
||||
void validCode(PyObject * pPyObjArg)
|
||||
{
|
||||
|
@ -23,6 +24,11 @@ void validCode(PyObject * pPyObjArg)
|
|||
Py_CLEAR(pPyObjArg);
|
||||
Py_CLEAR(pPyObjNULL);
|
||||
(void)PyErr_NewException("text", NULL, NULL);
|
||||
|
||||
char * pBuf1 = PyMem_Malloc(5);
|
||||
PyMem_Free(pBuf1);
|
||||
int * pIntBuf1 = PyMem_New(int, 10);
|
||||
PyMem_Free(pIntBuf1);
|
||||
}
|
||||
|
||||
void nullPointer()
|
||||
|
@ -32,3 +38,24 @@ void nullPointer()
|
|||
// cppcheck-suppress nullPointer
|
||||
Py_DECREF(NULL);
|
||||
}
|
||||
|
||||
void PyMem_Malloc_memleak()
|
||||
{
|
||||
char * pBuf1 = PyMem_Malloc(1);
|
||||
printf("%p", pBuf1);
|
||||
// cppcheck-suppress memleak
|
||||
}
|
||||
|
||||
void PyMem_Malloc_mismatchAllocDealloc()
|
||||
{
|
||||
char * pBuf1 = PyMem_Malloc(10);
|
||||
// cppcheck-suppress mismatchAllocDealloc
|
||||
free(pBuf1);
|
||||
}
|
||||
|
||||
void PyMem_New_memleak()
|
||||
{
|
||||
char * pBuf1 = PyMem_New(char, 5);
|
||||
printf("%p", pBuf1);
|
||||
// cppcheck-suppress memleak
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue