clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name umathmodule.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -analyzer-output=html -analyzer-checker=python -analyzer-disable-checker=deadcode -analyzer-config prune-paths=true,suppress-c++-stdlib=true,suppress-null-return-paths=false,crosscheck-with-z3=true,model-path=/opt/pyrefcon/lib/pyrefcon/models/models -analyzer-config experimental-enable-naive-ctu-analysis=true,ctu-dir=/tmp/pyrefcon/numpy/csa-scan,ctu-index-name=/tmp/pyrefcon/numpy/csa-scan/externalDefMap.txt,ctu-invocation-list=/tmp/pyrefcon/numpy/csa-scan/invocations.yaml,display-ctu-progress=false -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +sse -target-feature +sse2 -target-feature +sse3 -tune-cpu generic -debug-info-kind=limited -dwarf-version=4 -debugger-tuning=gdb -fcoverage-compilation-dir=/tmp/pyrefcon/numpy -resource-dir /opt/pyrefcon/lib/clang/13.0.0 -isystem /opt/pyrefcon/lib/pyrefcon/models/python3.8 -D NDEBUG -D _FORTIFY_SOURCE=2 -D NPY_INTERNAL_BUILD=1 -D HAVE_NPY_CONFIG_H=1 -D _FILE_OFFSET_BITS=64 -D _LARGEFILE_SOURCE=1 -D _LARGEFILE64_SOURCE=1 -I build/src.linux-x86_64-3.8/numpy/core/src/common -I build/src.linux-x86_64-3.8/numpy/core/src/umath -I numpy/core/include -I build/src.linux-x86_64-3.8/numpy/core/include/numpy -I build/src.linux-x86_64-3.8/numpy/distutils/include -I numpy/core/src/common -I numpy/core/src -I numpy/core -I numpy/core/src/npymath -I numpy/core/src/multiarray -I numpy/core/src/umath -I numpy/core/src/npysort -I numpy/core/src/_simd -I build/src.linux-x86_64-3.8/numpy/core/src/common -I build/src.linux-x86_64-3.8/numpy/core/src/npymath -internal-isystem /opt/pyrefcon/lib/clang/13.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-result -Wsign-compare -Wall -Wformat -Werror=format-security -Wformat -Werror=format-security -Wdate-time -fdebug-compilation-dir=/tmp/pyrefcon/numpy -ferror-limit 19 -fwrapv -pthread -stack-protector 2 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/pyrefcon/numpy/csa-scan/reports -x c numpy/core/src/umath/umathmodule.c
| 1 |  | 
| 2 |   | 
| 3 |  | 
| 4 |   | 
| 5 |   | 
| 6 |   | 
| 7 |  | 
| 8 |   | 
| 9 |   | 
| 10 |   | 
| 11 |   | 
| 12 |   | 
| 13 |  | 
| 14 |   | 
| 15 |   | 
| 16 |   | 
| 17 |   | 
| 18 | #define _UMATHMODULE | 
| 19 | #define _MULTIARRAYMODULE | 
| 20 | #define NPY_NO_DEPRECATED_API NPY_API_VERSION | 
| 21 |   | 
| 22 | #include "Python.h" | 
| 23 |   | 
| 24 | #include "npy_config.h" | 
| 25 |   | 
| 26 | #include "numpy/arrayobject.h" | 
| 27 | #include "numpy/ufuncobject.h" | 
| 28 | #include "numpy/npy_3kcompat.h" | 
| 29 | #include "abstract.h" | 
| 30 |   | 
| 31 | #include "numpy/npy_math.h" | 
| 32 | #include "number.h" | 
| 33 |   | 
| 34 | static PyUFuncGenericFunction pyfunc_functions[] = {PyUFunc_On_Om}; | 
| 35 |   | 
| 36 | static int | 
| 37 | object_ufunc_type_resolver(PyUFuncObject *ufunc, | 
| 38 |                                 NPY_CASTING casting, | 
| 39 |                                 PyArrayObject **operands, | 
| 40 |                                 PyObject *type_tup, | 
| 41 |                                 PyArray_Descr **out_dtypes) | 
| 42 | { | 
| 43 |     int i, nop = ufunc->nin + ufunc->nout; | 
| 44 |   | 
| 45 |     out_dtypes[0] = PyArray_DescrFromType(NPY_OBJECT); | 
| 46 |     if (out_dtypes[0] == NULL) { | 
| 47 |         return -1; | 
| 48 |     } | 
| 49 |   | 
| 50 |     for (i = 1; i < nop; ++i) { | 
| 51 |         Py_INCREF(out_dtypes[0]); | 
| 52 |         out_dtypes[i] = out_dtypes[0]; | 
| 53 |     } | 
| 54 |   | 
| 55 |     return 0; | 
| 56 | } | 
| 57 |   | 
| 58 | static int | 
| 59 | object_ufunc_loop_selector(PyUFuncObject *ufunc, | 
| 60 |                             PyArray_Descr **NPY_UNUSED(dtypes), | 
| 61 |                             PyUFuncGenericFunction *out_innerloop, | 
| 62 |                             void **out_innerloopdata, | 
| 63 |                             int *out_needs_api) | 
| 64 | { | 
| 65 |     *out_innerloop = ufunc->functions[0]; | 
| 66 |     *out_innerloopdata = ufunc->data[0]; | 
| 67 |     *out_needs_api = 1; | 
| 68 |   | 
| 69 |     return 0; | 
| 70 | } | 
| 71 |   | 
| 72 | PyObject * | 
| 73 | ufunc_frompyfunc(PyObject *NPY_UNUSED(dummy), PyObject *args, PyObject *kwds) { | 
| 74 |     PyObject *function, *pyname = NULL; | 
| 75 |     int nin, nout, i, nargs; | 
| 76 |     PyUFunc_PyFuncData *fdata; | 
| 77 |     PyUFuncObject *self; | 
| 78 |     const char *fname = NULL; | 
| 79 |     char *str, *types, *doc; | 
| 80 |     Py_ssize_t fname_len = -1; | 
| 81 |     void * ptr, **data; | 
| 82 |     int offset[2]; | 
| 83 |     PyObject *identity = NULL;   | 
| 84 |     static char *kwlist[] = {"", "nin", "nout", "identity", NULL}; | 
| 85 |   | 
| 86 |     if (!PyArg_ParseTupleAndKeywords(args, kwds, "Oii|$O:frompyfunc", kwlist, | 
| 87 |                 &function, &nin, &nout, &identity)) { | 
| 88 |         return NULL; | 
| 89 |     } | 
| 90 |     if (!PyCallable_Check(function)) { | 
| 91 |         PyErr_SetString(PyExc_TypeError, "function must be callable"); | 
| 92 |         return NULL; | 
| 93 |     } | 
| 94 |   | 
| 95 |     nargs = nin + nout; | 
| 96 |   | 
| 97 |     pyname = PyObject_GetAttrString(function, "__name__"); | 
| 98 |     if (pyname) { | 
| 99 |         fname = PyUnicode_AsUTF8AndSize(pyname, &fname_len); | 
| 100 |     } | 
| 101 |     if (fname == NULL) { | 
| 102 |         PyErr_Clear(); | 
| 103 |         fname = "?"; | 
| 104 |         fname_len = 1; | 
| 105 |     } | 
| 106 |   | 
| 107 |      | 
| 108 |       | 
| 109 |       | 
| 110 |       | 
| 111 |       | 
| 112 |       | 
| 113 |       | 
| 114 |       | 
| 115 |       | 
| 116 |       | 
| 117 |     offset[0] = sizeof(PyUFunc_PyFuncData); | 
| 118 |     i = (sizeof(PyUFunc_PyFuncData) % sizeof(void *)); | 
| 119 |     if (i) { | 
| 120 |         offset[0] += (sizeof(void *) - i); | 
| 121 |     } | 
| 122 |     offset[1] = nargs; | 
| 123 |     i = (nargs % sizeof(void *)); | 
| 124 |     if (i) { | 
| 125 |         offset[1] += (sizeof(void *)-i); | 
| 126 |     } | 
| 127 |     ptr = PyArray_malloc(offset[0] + offset[1] + sizeof(void *) + | 
| 128 |                             (fname_len + 14)); | 
| 129 |     if (ptr == NULL) { | 
| 130 |         Py_XDECREF(pyname); | 
| 131 |         return PyErr_NoMemory(); | 
| 132 |     } | 
| 133 |     fdata = (PyUFunc_PyFuncData *)(ptr); | 
| 134 |     fdata->callable = function; | 
| 135 |     fdata->nin = nin; | 
| 136 |     fdata->nout = nout; | 
| 137 |   | 
| 138 |     data = (void **)(((char *)ptr) + offset[0]); | 
| 139 |     data[0] = (void *)fdata; | 
| 140 |     types = (char *)data + sizeof(void *); | 
| 141 |     for (i = 0; i < nargs; i++) { | 
| 142 |         types[i] = NPY_OBJECT; | 
| 143 |     } | 
| 144 |     str = types + offset[1]; | 
| 145 |     memcpy(str, fname, fname_len); | 
| 146 |     memcpy(str+fname_len, " (vectorized)", 14); | 
| 147 |     Py_XDECREF(pyname); | 
| 148 |   | 
| 149 |      | 
| 150 |     doc = "dynamic ufunc based on a python function"; | 
| 151 |   | 
| 152 |     self = (PyUFuncObject *)PyUFunc_FromFuncAndDataAndSignatureAndIdentity( | 
| 153 |             (PyUFuncGenericFunction *)pyfunc_functions, data, | 
| 154 |             types,  1, nin, nout, identity ? PyUFunc_IdentityValue : PyUFunc_None, | 
| 155 |             str, doc,  0, NULL, identity); | 
| 156 |   | 
| 157 |     if (self == NULL) { | 
| 158 |         PyArray_free(ptr); | 
| 159 |         return NULL; | 
| 160 |     } | 
| 161 |     Py_INCREF(function); | 
| 162 |     self->obj = function; | 
| 163 |     self->ptr = ptr; | 
| 164 |   | 
| 165 |     self->type_resolver = &object_ufunc_type_resolver; | 
| 166 |     self->legacy_inner_loop_selector = &object_ufunc_loop_selector; | 
| 167 |     PyObject_GC_Track(self); | 
| 168 |   | 
| 169 |     return (PyObject *)self; | 
| 170 | } | 
| 171 |   | 
| 172 |  | 
| 173 | PyObject * | 
| 174 | add_newdoc_ufunc(PyObject *NPY_UNUSED(dummy), PyObject *args) | 
| 175 | { | 
| 176 |     PyUFuncObject *ufunc; | 
| 177 |     PyObject *str; | 
| 178 |     if (!PyArg_ParseTuple(args, "O!O!:_add_newdoc_ufunc", &PyUFunc_Type, &ufunc, | 
| 179 |                                         &PyUnicode_Type, &str)) { | 
| 180 |         return NULL; | 
| 181 |     } | 
| 182 |     if (ufunc->doc != NULL) { | 
| 183 |         PyErr_SetString(PyExc_ValueError, | 
| 184 |                 "Cannot change docstring of ufunc with non-NULL docstring"); | 
| 185 |         return NULL; | 
| 186 |     } | 
| 187 |   | 
| 188 |     PyObject *tmp = PyUnicode_AsUTF8String(str); | 
| 189 |     if (tmp == NULL) { | 
| 190 |         return NULL; | 
| 191 |     } | 
| 192 |     char *docstr = PyBytes_AS_STRING(tmp); | 
| 193 |   | 
| 194 |      | 
| 195 |       | 
| 196 |       | 
| 197 |       | 
| 198 |       | 
| 199 |       | 
| 200 |     char *newdocstr = malloc(strlen(docstr) + 1); | 
| 201 |     if (!newdocstr) { | 
| 202 |         Py_DECREF(tmp); | 
| 203 |         return PyErr_NoMemory(); | 
| 204 |     } | 
| 205 |     strcpy(newdocstr, docstr); | 
| 206 |     ufunc->doc = newdocstr; | 
| 207 |   | 
| 208 |     Py_DECREF(tmp); | 
| 209 |     Py_RETURN_NONE; | 
| 210 | } | 
| 211 |   | 
| 212 |   | 
| 213 |  | 
| 214 |   | 
| 215 |   | 
| 216 |   | 
| 217 |   | 
| 218 |   | 
| 219 | NPY_VISIBILITY_HIDDEN PyObject *npy_um_str_array_prepare = NULL; | 
| 220 | NPY_VISIBILITY_HIDDEN PyObject *npy_um_str_array_wrap = NULL; | 
| 221 | NPY_VISIBILITY_HIDDEN PyObject *npy_um_str_pyvals_name = NULL; | 
| 222 |   | 
| 223 |  | 
| 224 | static int | 
| 225 | intern_strings(void) | 
| 226 | { | 
| 227 |     if (!(npy_um_str_array_prepare = PyUnicode_InternFromString("__array_prepare__"))) return -1; | 
| 228 |     if (!(npy_um_str_array_wrap = PyUnicode_InternFromString("__array_wrap__"))) return -1; | 
| 229 |     if (!(npy_um_str_pyvals_name = PyUnicode_InternFromString(UFUNC_PYVALS_NAME))) return -1; | 
| 230 |     return 0; | 
| 231 | } | 
| 232 |   | 
| 233 |  | 
| 234 |   | 
| 235 | int initumath(PyObject *m) | 
| 236 | { | 
| 237 |     PyObject *d, *s, *s2; | 
| 238 |     int UFUNC_FLOATING_POINT_SUPPORT = 1; | 
| 239 |   | 
| 240 | #ifdef NO_UFUNC_FLOATING_POINT_SUPPORT | 
| 241 |     UFUNC_FLOATING_POINT_SUPPORT = 0; | 
| 242 | #endif | 
| 243 |   | 
| 244 |      | 
| 245 |     d = PyModule_GetDict(m); | 
| 246 |   | 
| 247 |     PyDict_SetItemString(d, "pi", s = PyFloat_FromDouble(NPY_PI)); | 
| 248 |     Py_DECREF(s); | 
| 249 |     PyDict_SetItemString(d, "e", s = PyFloat_FromDouble(NPY_E)); | 
| 250 |     Py_DECREF(s); | 
| 251 |     PyDict_SetItemString(d, "euler_gamma", s = PyFloat_FromDouble(NPY_EULER)); | 
| 252 |     Py_DECREF(s); | 
| 253 |   | 
| 254 | #define ADDCONST(str) PyModule_AddIntConstant(m, #str, UFUNC_##str) | 
| 255 | #define ADDSCONST(str) PyModule_AddStringConstant(m, "UFUNC_" #str, UFUNC_##str) | 
| 256 |   | 
| 257 |     ADDCONST(ERR_IGNORE); | 
| 258 |     ADDCONST(ERR_WARN); | 
| 259 |     ADDCONST(ERR_CALL); | 
| 260 |     ADDCONST(ERR_RAISE); | 
| 261 |     ADDCONST(ERR_PRINT); | 
| 262 |     ADDCONST(ERR_LOG); | 
| 263 |     ADDCONST(ERR_DEFAULT); | 
| 264 |   | 
| 265 |     ADDCONST(SHIFT_DIVIDEBYZERO); | 
| 266 |     ADDCONST(SHIFT_OVERFLOW); | 
| 267 |     ADDCONST(SHIFT_UNDERFLOW); | 
| 268 |     ADDCONST(SHIFT_INVALID); | 
| 269 |   | 
| 270 |     ADDCONST(FPE_DIVIDEBYZERO); | 
| 271 |     ADDCONST(FPE_OVERFLOW); | 
| 272 |     ADDCONST(FPE_UNDERFLOW); | 
| 273 |     ADDCONST(FPE_INVALID); | 
| 274 |   | 
| 275 |     ADDCONST(FLOATING_POINT_SUPPORT); | 
| 276 |   | 
| 277 |     ADDSCONST(PYVALS_NAME); | 
| 278 |   | 
| 279 | #undef ADDCONST | 
| 280 | #undef ADDSCONST | 
| 281 |     PyModule_AddIntConstant(m, "UFUNC_BUFSIZE_DEFAULT", (long)NPY_BUFSIZE); | 
| 282 |   | 
| 283 |     PyModule_AddObject(m, "PINF", PyFloat_FromDouble(NPY_INFINITY)); | 
| 284 |     PyModule_AddObject(m, "NINF", PyFloat_FromDouble(-NPY_INFINITY)); | 
| 285 |     PyModule_AddObject(m, "PZERO", PyFloat_FromDouble(NPY_PZERO)); | 
| 286 |     PyModule_AddObject(m, "NZERO", PyFloat_FromDouble(NPY_NZERO)); | 
 | 1  | Calling 'PyFloat_FromDouble' |  |  
  | 
 | 3  |  | Returning from 'PyFloat_FromDouble' |  |  
  | 
 | 4  |  | PyObject ownership leak with reference count of 1 |  
  | 
| 287 |     PyModule_AddObject(m, "NAN", PyFloat_FromDouble(NPY_NAN)); | 
| 288 |   | 
| 289 |     s = PyDict_GetItemString(d, "true_divide"); | 
| 290 |     PyDict_SetItemString(d, "divide", s); | 
| 291 |   | 
| 292 |     s = PyDict_GetItemString(d, "conjugate"); | 
| 293 |     s2 = PyDict_GetItemString(d, "remainder"); | 
| 294 |      | 
| 295 |         | 
| 296 |     _PyArray_SetNumericOps(d); | 
| 297 |   | 
| 298 |     PyDict_SetItemString(d, "conj", s); | 
| 299 |     PyDict_SetItemString(d, "mod", s2); | 
| 300 |   | 
| 301 |     if (intern_strings() < 0) { | 
| 302 |         PyErr_SetString(PyExc_RuntimeError, | 
| 303 |            "cannot intern umath strings while initializing _multiarray_umath."); | 
| 304 |         return -1; | 
| 305 |     } | 
| 306 |   | 
| 307 |     return 0; | 
| 308 | } |