fix yet another error in "cmd" string handling in load_sym_def(). Added realloc of freed pointers detection in track_memory.awk
This commit is contained in:
parent
a185172b6b
commit
b4b2c91481
|
|
@ -71,7 +71,6 @@ static void child_handler(int signum)
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
my_strdup(_ALLOC_ID_, &xschem_executable, argv[0]);
|
|
||||||
signal(SIGINT, sig_handler);
|
signal(SIGINT, sig_handler);
|
||||||
signal(SIGSEGV, sig_handler);
|
signal(SIGSEGV, sig_handler);
|
||||||
signal(SIGILL, sig_handler);
|
signal(SIGILL, sig_handler);
|
||||||
|
|
@ -85,6 +84,7 @@ int main(int argc, char **argv)
|
||||||
if(!getenv("DISPLAY") || !getenv("DISPLAY")[0]) has_x=0;
|
if(!getenv("DISPLAY") || !getenv("DISPLAY")[0]) has_x=0;
|
||||||
#endif
|
#endif
|
||||||
argc = process_options(argc, argv);
|
argc = process_options(argc, argv);
|
||||||
|
my_strdup(_ALLOC_ID_, &xschem_executable, argv[0]);
|
||||||
if(debug_var>=1 && !has_x)
|
if(debug_var>=1 && !has_x)
|
||||||
fprintf(errfp, "main(): no DISPLAY set, assuming no X available\n");
|
fprintf(errfp, "main(): no DISPLAY set, assuming no X available\n");
|
||||||
/* if detach is 1 no interactive command shell is created ...
|
/* if detach is 1 no interactive command shell is created ...
|
||||||
|
|
|
||||||
|
|
@ -3156,6 +3156,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
|
||||||
xSymbol * symbol;
|
xSymbol * symbol;
|
||||||
int symbols, sym_n_pins=0, generator;
|
int symbols, sym_n_pins=0, generator;
|
||||||
char *cmd = NULL;
|
char *cmd = NULL;
|
||||||
|
char *translated_cmd = NULL;
|
||||||
|
|
||||||
if(!name) {
|
if(!name) {
|
||||||
dbg(0, "l_s_d(): Warning: name parameter set to NULL, returning with no action\n");
|
dbg(0, "l_s_d(): Warning: name parameter set to NULL, returning with no action\n");
|
||||||
|
|
@ -3175,13 +3176,14 @@ int load_sym_def(const char *name, FILE *embed_fd)
|
||||||
dbg(1, "l_s_d(): cmd=%s\n", cmd);
|
dbg(1, "l_s_d(): cmd=%s\n", cmd);
|
||||||
generator = is_generator(cmd);
|
generator = is_generator(cmd);
|
||||||
if(generator) {
|
if(generator) {
|
||||||
cmd = get_generator_command(cmd);
|
translated_cmd = get_generator_command(cmd);
|
||||||
dbg(1, "l_s_d(): generator: cmd=%s\n", cmd);
|
dbg(1, "l_s_d(): generator: cmd=%s\n", cmd);
|
||||||
if(cmd) {
|
if(translated_cmd) {
|
||||||
lcc[level].fd = popen(cmd, "r"); /* execute ss="/path/to/xxx par1 par2 ..." and pipe in the stdout */
|
lcc[level].fd = popen(translated_cmd, "r"); /* execute ss="/path/to/xxx par1 par2 ..." and pipe in the stdout */
|
||||||
} else {
|
} else {
|
||||||
lcc[level].fd = NULL;
|
lcc[level].fd = NULL;
|
||||||
}
|
}
|
||||||
|
my_free(_ALLOC_ID_, &translated_cmd);
|
||||||
} else if(!embed_fd) { /* regular symbol: open file */
|
} else if(!embed_fd) { /* regular symbol: open file */
|
||||||
if(!strcmp(xctx->file_version,"1.0")) {
|
if(!strcmp(xctx->file_version,"1.0")) {
|
||||||
my_strncpy(sympath, abs_sym_path(name, ".sym"), S(sympath));
|
my_strncpy(sympath, abs_sym_path(name, ".sym"), S(sympath));
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,10 @@ BEGIN{
|
||||||
idx[$5] = id
|
idx[$5] = id
|
||||||
}
|
}
|
||||||
else { # realloc
|
else { # realloc
|
||||||
|
if(!($3 in address)) {
|
||||||
|
print "Corruption: address " $3 " was freed. Can not realloc. id=" id
|
||||||
|
print_source($3)
|
||||||
|
}
|
||||||
total += $7 - address[$3]
|
total += $7 - address[$3]
|
||||||
if(total > max) max = total
|
if(total > max) max = total
|
||||||
delete address[$3]
|
delete address[$3]
|
||||||
|
|
@ -73,14 +77,20 @@ END{
|
||||||
for(i in address) {
|
for(i in address) {
|
||||||
stale++
|
stale++
|
||||||
leak+= address[i]
|
leak+= address[i]
|
||||||
print " address[ " i ", " idx[i] " ]= " address[i]
|
print_source(i)
|
||||||
if(show_source) {
|
|
||||||
pipe = "egrep -n 'my_(malloc|calloc|realloc|free|mstrcat|strcat|strncat|strdup|strdup2)\\(" idx[i] ",' *.c xschem.h"
|
|
||||||
while( pipe | getline a) print " " a
|
|
||||||
close(pipe)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
print "Number of unfreed pointers = " stale
|
print "Number of unfreed pointers = " stale
|
||||||
# as a crosscheck 'leak' should be equal to 'total'.
|
# as a crosscheck 'leak' should be equal to 'total'.
|
||||||
print "Total leaked memory = " leak
|
print "Total leaked memory = " leak
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function print_source(add)
|
||||||
|
{
|
||||||
|
print " address[ " add ", " idx[add] " ]= " address[add]
|
||||||
|
if(show_source) {
|
||||||
|
pipe = "egrep -n 'my_(malloc|calloc|realloc|free|mstrcat|strcat|strncat|strdup|strdup2)\\(" idx[add] \
|
||||||
|
",' *.c xschem.h"
|
||||||
|
while( pipe | getline a) print " " a
|
||||||
|
close(pipe)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue