forked from python/cpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add modeling file for Coverity Scan.
The modeling file avoids false positive reports.
- Loading branch information
Showing
1 changed file
with
112 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
/* Coverity Scan model | ||
* | ||
* This is a modeling file for Coverity Scan. Modeling helps to avoid false | ||
* positives. | ||
* | ||
* - A model file can't import any header files. | ||
* - Therefore only some built-in primitives like int, char and void are | ||
* available but not wchar_t, NULL etc. | ||
* - Modeling doesn't need full structs and typedefs. Rudimentary structs | ||
* and similar types are sufficient. | ||
* - An uninitialized local pointer is not an error. It signifies that the | ||
* variable could be either NULL or have some data. | ||
* | ||
* Coverity Scan doesn't pick up modifications automatically. The model file | ||
* must be uploaded by an admin in the analysis settings of | ||
* http://scan.coverity.com/projects/200 | ||
* | ||
*/ | ||
|
||
|
||
/* dummy definitions, in most cases struct fields aren't required. */ | ||
|
||
#define NULL (void *)0 | ||
|
||
typedef int sdigit; | ||
typedef long Py_ssize_t; | ||
typedef unsigned short wchar_t; | ||
typedef struct {} PyObject; | ||
typedef struct {} grammar; | ||
typedef int sdigit; | ||
typedef struct {} DIR; | ||
typedef struct {} RFILE; | ||
|
||
|
||
/* Python/pythonrun.c | ||
* resourece leak false positive */ | ||
|
||
void Py_FatalError(const char *msg) { | ||
__coverity_panic__(); | ||
} | ||
|
||
/* Objects/longobject.c | ||
* NEGATIVE_RETURNS false positive */ | ||
|
||
static PyObject small_ints[257 + 5]; | ||
|
||
static PyObject *get_small_int(sdigit ival) | ||
{ | ||
PyObject *p; | ||
if (((ival + 5) >= 0) && ((ival + 5) < 257 + 5)) { | ||
return &small_ints[ival + 5]; | ||
} | ||
return p; | ||
} | ||
|
||
/* tainted sinks | ||
* | ||
* Coverity considers argv, environ, read() data etc as tained. | ||
*/ | ||
|
||
PyObject *PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename) | ||
{ | ||
__coverity_tainted_data_sink__(filename); | ||
return NULL; | ||
} | ||
|
||
/* Python/fileutils.c */ | ||
wchar_t *_Py_char2wchar(const char* arg, size_t *size) | ||
{ | ||
wchar_t *w; | ||
__coverity_tainted_data_sink__(arg); | ||
__coverity_tainted_data_sink__(size); | ||
return w; | ||
} | ||
|
||
/* Parser/pgenmain.c */ | ||
grammar *getgrammar(char *filename) | ||
{ | ||
grammar *g; | ||
__coverity_tainted_data_sink__(filename); | ||
return g; | ||
} | ||
|
||
/* Python/marshal.c */ | ||
|
||
static Py_ssize_t r_string(char *s, Py_ssize_t n, RFILE *p) | ||
{ | ||
__coverity_tainted_string_argument__(s); | ||
return 0; | ||
} | ||
|
||
static long r_long(RFILE *p) | ||
{ | ||
long l; | ||
unsigned char buffer[4]; | ||
|
||
r_string((char *)buffer, 4, p); | ||
__coverity_tainted_string_sanitize_content__(buffer); | ||
l = (long)buffer; | ||
return l; | ||
} | ||
|
||
/* Coverity doesn't understand that fdopendir() may take ownership of fd. */ | ||
|
||
DIR *fdopendir(int fd) { | ||
DIR *d; | ||
if (d) { | ||
__coverity_close__(fd); | ||
} | ||
return d; | ||
} | ||
|