forked from neovim/neovim
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcoverity-model.c
141 lines (121 loc) · 2.88 KB
/
coverity-model.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// 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/neovim-neovim
//
// Issue 105985
//
// Teach coverity that uv_pipe_open saves fd on success (0 return value)
// and doesn't save it on failure (return value != 0).
struct uv_pipe_s {
int something;
};
int uv_pipe_open(struct uv_pipe_s *handle, int fd)
{
int result;
if (result == 0) {
__coverity_escape__(fd);
}
return result;
}
// Hint Coverity that adding item to d avoids losing track
// of the memory allocated for item.
typedef struct {} dictitem_T;
typedef struct {} dict_T;
int tv_dict_add(dict_T *const d, dictitem_T *const item)
{
__coverity_escape__(item);
}
void *malloc(size_t size)
{
int has_mem;
if (has_mem)
return __coverity_alloc__(size);
else
return 0;
}
void *try_malloc(size_t size)
{
size_t allocated_size = size ? size : 1;
return malloc(allocated_size);
}
void *xmalloc(size_t size)
{
void *p = malloc(size);
if (!p)
__coverity_panic__();
return p;
}
void xfree(void * ptr)
{
__coverity_free__(ptr);
}
void *xcalloc(size_t count, size_t size)
{
size_t allocated_count = count && size ? count : 1;
size_t allocated_size = count && size ? size : 1;
void *p = try_malloc(allocated_count * allocated_size);
if (!p)
__coverity_panic__();
__coverity_writeall0__(p);
return p;
}
void *xrealloc(void *ptr, size_t size)
{
__coverity_escape__(ptr);
void * p = xmalloc(size);
__coverity_writeall__(p);
return p;
}
void *xmallocz(size_t size)
{
void * p = malloc(size + 1);
((char*)p)[size] = 0;
return p;
}
void * xmemdupz(const void * data, size_t len)
{
void * p = xmallocz(len);
__coverity_writeall__(p);
((char*)p)[len] = 0;
return p;
}
void * xmemdup(const void *data, size_t len)
{
void * p = xmalloc(len);
__coverity_writeall__(p);
return p;
}
// Teach coverity that lua errors are noreturn
typedef struct {} lua_State;
int luaL_typerror(lua_State *L, int narg, const char *tname)
{
__coverity_panic__();
return 0;
}
int luaL_error(lua_State *L, const char *fmt, ...)
{
__coverity_panic__();
return 0;
}
int luaL_argerror(lua_State *L, int numarg, const char *extramsg)
{
__coverity_panic__();
return 0;
}
void *luaL_checkudata(lua_State *L, int ud, const char *tname)
{
return __coverity_alloc_nosize__()
}