T tracer tools: fix memory leaks, clang warnings
- Fix memory leaks detected by ASan - Initialize variables that are flagged by compiler - C struct initializer: x:y needs to be .x=y
This commit is contained in:
committed by
Robert Schmidt
parent
5a98ead92b
commit
8a2a5015e6
@@ -256,7 +256,9 @@ int main(int argc, char *argv[])
|
||||
err("%s is not correct in T_messages.txt", name);
|
||||
i++;
|
||||
}
|
||||
free(l);
|
||||
fclose(in);
|
||||
free_database(database);
|
||||
if (i != last_fun + 1) err("VCD FUNCTIONS wrong in T_messages.txt");
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -43,6 +43,14 @@ typedef struct {
|
||||
buffer value;
|
||||
} parser;
|
||||
|
||||
void *my_bsearch(const void *key, const void *base,
|
||||
size_t nmemb, size_t size,
|
||||
int (*compar)(const void *, const void *))
|
||||
{
|
||||
if (nmemb == 0) return NULL;
|
||||
return bsearch(key, base, nmemb, size, compar);
|
||||
}
|
||||
|
||||
void put(buffer *b, int c)
|
||||
{
|
||||
if (b->size == b->maxsize) {
|
||||
@@ -125,7 +133,7 @@ int string_cmp(const void *_p1, const void *_p2)
|
||||
|
||||
id *add_id(database *r, char *idname, int i)
|
||||
{
|
||||
if (bsearch(&(id){name:idname}, r->i, r->isize, sizeof(id), id_cmp) != NULL)
|
||||
if (my_bsearch(&(id){.name=idname}, r->i, r->isize, sizeof(id), id_cmp) != NULL)
|
||||
{ printf("ERROR: ID '%s' declared more than once\n", idname); exit(1); }
|
||||
if ((r->isize & 1023) == 0) {
|
||||
r->i = realloc(r->i, (r->isize + 1024) * sizeof(id));
|
||||
@@ -143,14 +151,14 @@ id *add_id(database *r, char *idname, int i)
|
||||
r->i[r->isize].id = i;
|
||||
r->isize++;
|
||||
qsort(r->i, r->isize, sizeof(id), id_cmp);
|
||||
return (id*)bsearch(&(id){name:idname}, r->i, r->isize, sizeof(id), id_cmp);
|
||||
return (id*)my_bsearch(&(id){.name=idname}, r->i, r->isize, sizeof(id), id_cmp);
|
||||
}
|
||||
|
||||
group *get_group(database *r, char *group_name)
|
||||
{
|
||||
group *ret;
|
||||
|
||||
ret = bsearch(&(group){name:group_name},
|
||||
ret = my_bsearch(&(group){.name=group_name},
|
||||
r->g, r->gsize, sizeof(group), group_cmp);
|
||||
if (ret != NULL) return ret;
|
||||
|
||||
@@ -166,7 +174,7 @@ group *get_group(database *r, char *group_name)
|
||||
|
||||
qsort(r->g, r->gsize, sizeof(group), group_cmp);
|
||||
|
||||
return bsearch(&(group){name:group_name},
|
||||
return my_bsearch(&(group){.name=group_name},
|
||||
r->g, r->gsize, sizeof(group), group_cmp);
|
||||
}
|
||||
|
||||
@@ -182,7 +190,7 @@ void group_add_id(group *g, char *id)
|
||||
|
||||
void id_add_group(id *i, char *group)
|
||||
{
|
||||
char *g = bsearch(&group, i->groups, i->gsize, sizeof(char *), string_cmp);
|
||||
char *g = my_bsearch(&group, i->groups, i->gsize, sizeof(char *), string_cmp);
|
||||
if (g != NULL) return;
|
||||
|
||||
if ((i->gsize & 1023) == 0) {
|
||||
@@ -392,7 +400,7 @@ void list_groups(void *_d)
|
||||
static int onoff_id(database *d, char *name, int *a, int onoff)
|
||||
{
|
||||
id *i;
|
||||
i = bsearch(&(id){name:name}, d->i, d->isize, sizeof(id), id_cmp);
|
||||
i = my_bsearch(&(id){.name=name}, d->i, d->isize, sizeof(id), id_cmp);
|
||||
if (i == NULL) return 0;
|
||||
a[i->id] = onoff;
|
||||
printf("turning %s %s\n", onoff ? "ON" : "OFF", name);
|
||||
@@ -403,7 +411,7 @@ static int onoff_group(database *d, char *name, int *a, int onoff)
|
||||
{
|
||||
group *g;
|
||||
int i;
|
||||
g = bsearch(&(group){name:name}, d->g, d->gsize, sizeof(group), group_cmp);
|
||||
g = my_bsearch(&(group){.name=name}, d->g, d->gsize, sizeof(group), group_cmp);
|
||||
if (g == NULL) return 0;
|
||||
for (i = 0; i < g->size; i++) onoff_id(d, g->ids[i], a, onoff);
|
||||
return 1;
|
||||
@@ -442,7 +450,7 @@ char *event_vcd_name_from_id(void *_database, int id)
|
||||
int event_id_from_name(void *_database, char *name)
|
||||
{
|
||||
database *d = _database;
|
||||
id *i = (id*)bsearch(&(id){name:name}, d->i, d->isize, sizeof(id), id_cmp);
|
||||
id *i = (id*)my_bsearch(&(id){.name=name}, d->i, d->isize, sizeof(id), id_cmp);
|
||||
if (i == NULL)
|
||||
{ printf("%s:%d: '%s' not found\n", __FILE__, __LINE__, name); abort(); }
|
||||
return i->id;
|
||||
@@ -516,3 +524,31 @@ void database_get_generic_description(void *_d, int id,
|
||||
PUTC(&o, 0);
|
||||
*desc = o.obuf;
|
||||
}
|
||||
|
||||
void free_database(void *_d)
|
||||
{
|
||||
database *d = _d;
|
||||
int i;
|
||||
int j;
|
||||
free(d->name);
|
||||
for (i = 0; i < d->isize; i++) {
|
||||
free(d->i[i].name);
|
||||
free(d->i[i].desc);
|
||||
free(d->i[i].groups);
|
||||
for (j = 0; j < d->i[i].asize; j++) {
|
||||
free(d->i[i].arg_type[j]);
|
||||
free(d->i[i].arg_name[j]);
|
||||
}
|
||||
free(d->i[i].arg_type);
|
||||
free(d->i[i].arg_name);
|
||||
free(d->i[i].vcd_name);
|
||||
}
|
||||
free(d->i);
|
||||
for (i = 0; i < d->gsize; i++) {
|
||||
free(d->g[i].name);
|
||||
free(d->g[i].ids);
|
||||
}
|
||||
free(d->g);
|
||||
free(d->id_to_pos);
|
||||
free(d);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
/* returns an opaque pointer - truly a 'database *', see database.c */
|
||||
void *parse_database(char *filename);
|
||||
void free_database(void *database);
|
||||
void dump_database(void *database);
|
||||
void list_ids(void *database);
|
||||
void list_groups(void *database);
|
||||
|
||||
@@ -55,8 +55,8 @@ int main(int n, char **v)
|
||||
int found;
|
||||
int count = 1;
|
||||
int check_time = 0;
|
||||
time_t sec;
|
||||
long nsec;
|
||||
time_t sec = 0; /* initialization not necessary but gcc is not happy */
|
||||
long nsec = 0; /* initialization not necessary but gcc is not happy */
|
||||
|
||||
for (i = 1; i < n; i++) {
|
||||
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||
|
||||
@@ -107,7 +107,7 @@ void send_event(gui *_gui, enum event_type type, ...)
|
||||
struct gui *g = _gui;
|
||||
int do_write = 0;
|
||||
va_list ap;
|
||||
struct event *e;
|
||||
struct event *e = NULL; /* initialization not necessary but gcc is not happy */
|
||||
|
||||
if (g->queued_events == NULL) do_write = 1;
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ int main(int n, char **v)
|
||||
int i;
|
||||
event_handler *h;
|
||||
logger *textlog;
|
||||
gui *g;
|
||||
gui *g = NULL; /* initialization not necessary but gcc is not happy */
|
||||
int gui_mode = 0;
|
||||
view *out;
|
||||
int gui_active = 1;
|
||||
|
||||
Reference in New Issue
Block a user