17db96d56Sopenharmony_ci/* Coverity Scan model
27db96d56Sopenharmony_ci *
37db96d56Sopenharmony_ci * This is a modeling file for Coverity Scan. Modeling helps to avoid false
47db96d56Sopenharmony_ci * positives.
57db96d56Sopenharmony_ci *
67db96d56Sopenharmony_ci * - A model file can't import any header files.
77db96d56Sopenharmony_ci * - Therefore only some built-in primitives like int, char and void are
87db96d56Sopenharmony_ci *   available but not wchar_t, NULL etc.
97db96d56Sopenharmony_ci * - Modeling doesn't need full structs and typedefs. Rudimentary structs
107db96d56Sopenharmony_ci *   and similar types are sufficient.
117db96d56Sopenharmony_ci * - An uninitialized local pointer is not an error. It signifies that the
127db96d56Sopenharmony_ci *   variable could be either NULL or have some data.
137db96d56Sopenharmony_ci *
147db96d56Sopenharmony_ci * Coverity Scan doesn't pick up modifications automatically. The model file
157db96d56Sopenharmony_ci * must be uploaded by an admin in the analysis settings of
167db96d56Sopenharmony_ci * http://scan.coverity.com/projects/200
177db96d56Sopenharmony_ci */
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci/* dummy definitions, in most cases struct fields aren't required. */
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci#define NULL (void *)0
227db96d56Sopenharmony_ci#define assert(op) /* empty */
237db96d56Sopenharmony_citypedef int sdigit;
247db96d56Sopenharmony_citypedef long Py_ssize_t;
257db96d56Sopenharmony_citypedef unsigned short wchar_t;
267db96d56Sopenharmony_citypedef struct {} PyObject;
277db96d56Sopenharmony_citypedef struct {} grammar;
287db96d56Sopenharmony_citypedef struct {} DIR;
297db96d56Sopenharmony_citypedef struct {} RFILE;
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci/* Python/pythonrun.c
327db96d56Sopenharmony_ci * resource leak false positive */
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_civoid Py_FatalError(const char *msg) {
357db96d56Sopenharmony_ci    __coverity_panic__();
367db96d56Sopenharmony_ci}
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci/* Objects/longobject.c
397db96d56Sopenharmony_ci * NEGATIVE_RETURNS false positive */
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_cistatic PyObject *get_small_int(sdigit ival)
427db96d56Sopenharmony_ci{
437db96d56Sopenharmony_ci    /* Never returns NULL */
447db96d56Sopenharmony_ci    PyObject *p;
457db96d56Sopenharmony_ci    assert(p != NULL);
467db96d56Sopenharmony_ci    return p;
477db96d56Sopenharmony_ci}
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ciPyObject *PyLong_FromLong(long ival)
507db96d56Sopenharmony_ci{
517db96d56Sopenharmony_ci    PyObject *p;
527db96d56Sopenharmony_ci    int maybe;
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci    if ((ival >= -5) && (ival < 257 + 5)) {
557db96d56Sopenharmony_ci        p = get_small_int(ival);
567db96d56Sopenharmony_ci        assert(p != NULL);
577db96d56Sopenharmony_ci        return p;
587db96d56Sopenharmony_ci    }
597db96d56Sopenharmony_ci    if (maybe)
607db96d56Sopenharmony_ci        return p;
617db96d56Sopenharmony_ci    else
627db96d56Sopenharmony_ci        return NULL;
637db96d56Sopenharmony_ci}
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ciPyObject *PyLong_FromLongLong(long long ival)
667db96d56Sopenharmony_ci{
677db96d56Sopenharmony_ci    return PyLong_FromLong((long)ival);
687db96d56Sopenharmony_ci}
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ciPyObject *PyLong_FromSsize_t(Py_ssize_t ival)
717db96d56Sopenharmony_ci{
727db96d56Sopenharmony_ci    return PyLong_FromLong((long)ival);
737db96d56Sopenharmony_ci}
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci/* tainted sinks
767db96d56Sopenharmony_ci *
777db96d56Sopenharmony_ci * Coverity considers argv, environ, read() data etc as tained.
787db96d56Sopenharmony_ci */
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ciPyObject *PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
817db96d56Sopenharmony_ci{
827db96d56Sopenharmony_ci    __coverity_tainted_data_sink__(filename);
837db96d56Sopenharmony_ci    return NULL;
847db96d56Sopenharmony_ci}
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci/* Python/fileutils.c */
877db96d56Sopenharmony_ciwchar_t *Py_DecodeLocale(const char* arg, size_t *size)
887db96d56Sopenharmony_ci{
897db96d56Sopenharmony_ci   wchar_t *w;
907db96d56Sopenharmony_ci    __coverity_tainted_data_sink__(arg);
917db96d56Sopenharmony_ci    __coverity_tainted_data_sink__(size);
927db96d56Sopenharmony_ci   return w;
937db96d56Sopenharmony_ci}
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci/* Python/marshal.c */
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_cistatic Py_ssize_t r_string(char *s, Py_ssize_t n, RFILE *p)
987db96d56Sopenharmony_ci{
997db96d56Sopenharmony_ci    __coverity_tainted_string_argument__(s);
1007db96d56Sopenharmony_ci    return 0;
1017db96d56Sopenharmony_ci}
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_cistatic long r_long(RFILE *p)
1047db96d56Sopenharmony_ci{
1057db96d56Sopenharmony_ci    long l;
1067db96d56Sopenharmony_ci    unsigned char buffer[4];
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci    r_string((char *)buffer, 4, p);
1097db96d56Sopenharmony_ci    __coverity_tainted_string_sanitize_content__(buffer);
1107db96d56Sopenharmony_ci    l = (long)buffer;
1117db96d56Sopenharmony_ci    return l;
1127db96d56Sopenharmony_ci}
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci/* Coverity doesn't understand that fdopendir() may take ownership of fd. */
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ciDIR *fdopendir(int fd)
1177db96d56Sopenharmony_ci{
1187db96d56Sopenharmony_ci    DIR *d;
1197db96d56Sopenharmony_ci    if (d) {
1207db96d56Sopenharmony_ci        __coverity_close__(fd);
1217db96d56Sopenharmony_ci    }
1227db96d56Sopenharmony_ci    return d;
1237db96d56Sopenharmony_ci}
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci/* Modules/_datetime.c
1267db96d56Sopenharmony_ci *
1277db96d56Sopenharmony_ci * Coverity thinks that the input values for these function come from a
1287db96d56Sopenharmony_ci * tainted source PyDateTime_DATE_GET_* macros use bit shifting.
1297db96d56Sopenharmony_ci */
1307db96d56Sopenharmony_cistatic PyObject *
1317db96d56Sopenharmony_cibuild_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag)
1327db96d56Sopenharmony_ci{
1337db96d56Sopenharmony_ci    PyObject *result;
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(y);
1367db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(m);
1377db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(d);
1387db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(hh);
1397db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(mm);
1407db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(ss);
1417db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(dstflag);
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci    return result;
1447db96d56Sopenharmony_ci}
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_cistatic int
1477db96d56Sopenharmony_ciymd_to_ord(int year, int month, int day)
1487db96d56Sopenharmony_ci{
1497db96d56Sopenharmony_ci    int ord = 0;
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(year);
1527db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(month);
1537db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(day);
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci    return ord;
1567db96d56Sopenharmony_ci}
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_cistatic int
1597db96d56Sopenharmony_cinormalize_date(int *year, int *month, int *day)
1607db96d56Sopenharmony_ci{
1617db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(*year);
1627db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(*month);
1637db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(*day);
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci    return 0;
1667db96d56Sopenharmony_ci}
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_cistatic int
1697db96d56Sopenharmony_ciweekday(int year, int month, int day)
1707db96d56Sopenharmony_ci{
1717db96d56Sopenharmony_ci    int w = 0;
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(year);
1747db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(month);
1757db96d56Sopenharmony_ci    __coverity_tainted_data_sanitize__(day);
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci    return w;
1787db96d56Sopenharmony_ci}
1797db96d56Sopenharmony_ci
180