From 8f44839f3ee7d30919ef1901d459a926fdf48dfb Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 9 Dec 2012 16:24:39 +0100 Subject: [PATCH] com_measure.c, measure.c: remove memory leaks --- src/frontend/com_measure2.c | 125 ++++++++++++++++++++++++++++-------- src/frontend/measure.c | 12 ++-- 2 files changed, 104 insertions(+), 33 deletions(-) diff --git a/src/frontend/com_measure2.c b/src/frontend/com_measure2.c index f93e25bf4..c22481a22 100644 --- a/src/frontend/com_measure2.c +++ b/src/frontend/com_measure2.c @@ -236,6 +236,8 @@ measure_function_type(char *operation) else mFunctionType = AT_UNKNOWN; + tfree(mFunction); + return (mFunctionType); } @@ -1479,6 +1481,7 @@ get_measure2( ANALYSIS_TYPE_T mFunctionType = AT_UNKNOWN; int wl_cnt; char *p; + int ret_val = MEASUREMENT_FAILURE; *result = 0.0e0; /* default result */ @@ -1586,14 +1589,14 @@ get_measure2( if (measure_parse_trigtarg(measTrig, words , wlTarg, "trig", errbuf) == 0) { measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret1; } if ((measTrig->m_rise == -1) && (measTrig->m_fall == -1) && (measTrig->m_cross == -1) && (measTrig->m_at == 1e99)) { sprintf(errbuf, "at, rise, fall or cross must be given\n"); measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret1; } while (words != wlTarg) @@ -1604,14 +1607,14 @@ get_measure2( if (measure_parse_trigtarg(measTarg, words , NULL, "targ", errbuf) == 0) { measure_errMessage(mName, mFunction, "TARG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret1; } if ((measTarg->m_rise == -1) && (measTarg->m_fall == -1) && (measTarg->m_cross == -1)&& (measTarg->m_at == 1e99)) { sprintf(errbuf, "at, rise, fall or cross must be given\n"); measure_errMessage(mName, mFunction, "TARG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret1; } // measure trig @@ -1624,7 +1627,7 @@ get_measure2( if (isnan(measTrig->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret1; } // measure targ com_measure_when(measTarg); @@ -1632,7 +1635,7 @@ get_measure2( if (isnan(measTarg->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "TARG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret1; } // print results @@ -1642,7 +1645,18 @@ get_measure2( printf("%-20s= %e targ= %e trig= %e\n", mName, (measTarg->m_measured - measTrig->m_measured), measTarg->m_measured, measTrig->m_measured); *result = (measTarg->m_measured - measTrig->m_measured); - return MEASUREMENT_OK; + + ret_val = MEASUREMENT_OK; + +err_ret1: + tfree(mAnalysis); + tfree(mName); + tfree(measTarg->m_vec); + tfree(measTarg); + tfree(measTrig->m_vec); + tfree(measTrig); + + return ret_val; } case AT_FIND: { @@ -1654,7 +1668,7 @@ get_measure2( if (measure_parse_find(meas, words, wlWhen, errbuf) == 0) { measure_errMessage(mName, mFunction, "FIND", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret2; } if (meas->m_at == 1e99) { @@ -1667,7 +1681,7 @@ get_measure2( if (measure_parse_when(measFind, words, errbuf) == 0) { measure_errMessage(mName, mFunction, "WHEN", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret2; } com_measure_when(measFind); @@ -1675,7 +1689,7 @@ get_measure2( if (isnan(measFind->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "AT", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret2; } measure_at(meas, measFind->m_measured); @@ -1688,7 +1702,7 @@ get_measure2( if (isnan(meas->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "AT", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret2; } // print results @@ -1698,7 +1712,18 @@ get_measure2( printf("%-20s= %e\n", mName, meas->m_measured); *result = meas->m_measured; - return MEASUREMENT_OK; + + ret_val = MEASUREMENT_OK; + +err_ret2: + tfree(mAnalysis); + tfree(mName); + tfree(meas->m_vec); + tfree(meas); + tfree(measFind->m_vec); + tfree(measFind); + + return ret_val; } case AT_WHEN: { @@ -1707,7 +1732,7 @@ get_measure2( meas->m_analysis = mAnalysis; if (measure_parse_when(meas, words, errbuf) == 0) { measure_errMessage(mName, mFunction, "WHEN", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret3; } com_measure_when(meas); @@ -1715,7 +1740,7 @@ get_measure2( if (isnan(meas->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "WHEN", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret3; } // print results @@ -1725,7 +1750,16 @@ get_measure2( printf("%-20s= %e\n", mName, meas->m_measured); *result = meas->m_measured; - return MEASUREMENT_OK; + + ret_val = MEASUREMENT_OK; + +err_ret3: + tfree(mAnalysis); + tfree(mName); + tfree(meas->m_vec); + tfree(meas); + + return ret_val; } case AT_RMS: case AT_INTEG: @@ -1736,7 +1770,7 @@ get_measure2( meas->m_analysis = mAnalysis; if (measure_parse_trigtarg(meas, words , NULL, "trig", errbuf) == 0) { measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret4; } // measure @@ -1745,7 +1779,7 @@ get_measure2( if (isnan(meas->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); // ?? - return MEASUREMENT_FAILURE; + goto err_ret4; } if (meas->m_at == 1e99) @@ -1758,7 +1792,16 @@ get_measure2( printf("%-20s= %.*e from= %.*e to= %.*e\n", mName, precision, meas->m_measured, precision, meas->m_from, precision, meas->m_to); *result = meas->m_measured; - return MEASUREMENT_OK; + + ret_val = MEASUREMENT_OK; + +err_ret4: + tfree(mAnalysis); + tfree(mName); + tfree(meas->m_vec); + tfree(meas); + + return ret_val; } case AT_AVG: @@ -1771,7 +1814,7 @@ get_measure2( if (measure_parse_trigtarg(meas, words , NULL, "trig", errbuf) == 0) { measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret5; } // measure @@ -1779,7 +1822,7 @@ get_measure2( if (isnan(meas->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); // ?? - return MEASUREMENT_FAILURE; + goto err_ret5; } if (meas->m_at == 1e99) @@ -1792,8 +1835,16 @@ get_measure2( printf("%-20s= %e from= %e to= %e\n", mName, meas->m_measured, meas->m_at, meas->m_measured_at); *result = meas->m_measured; - return MEASUREMENT_OK; + ret_val = MEASUREMENT_OK; + +err_ret5: + tfree(mAnalysis); + tfree(mName); + tfree(meas->m_vec); + tfree(meas); + + return ret_val; } case AT_MIN: case AT_MAX: @@ -1806,7 +1857,7 @@ get_measure2( measTrig->m_analysis = mAnalysis; if (measure_parse_trigtarg(measTrig, words , NULL, "trig", errbuf) == 0) { measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret6; } // measure @@ -1818,7 +1869,7 @@ get_measure2( if (isnan(measTrig->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); // ?? - return MEASUREMENT_FAILURE; + goto err_ret6; } if ((mFunctionType == AT_MIN) || (mFunctionType == AT_MAX)) { @@ -1838,7 +1889,16 @@ get_measure2( *result = measTrig->m_measured_at; } - return MEASUREMENT_OK; + + ret_val = MEASUREMENT_OK; + +err_ret6: + tfree(mAnalysis); + tfree(mName); + tfree(measTrig->m_vec); + tfree(measTrig); + + return ret_val; } case AT_PP: { @@ -1848,7 +1908,7 @@ get_measure2( measTrig->m_analysis = mAnalysis; if (measure_parse_trigtarg(measTrig, words , NULL, "trig", errbuf) == 0) { measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); - return MEASUREMENT_FAILURE; + goto err_ret7; } // measure min @@ -1856,7 +1916,7 @@ get_measure2( if (isnan(measTrig->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); // ?? - return MEASUREMENT_FAILURE; + goto err_ret7; } minValue = measTrig->m_measured; @@ -1865,7 +1925,7 @@ get_measure2( if (isnan(measTrig->m_measured)) { sprintf(errbuf, "out of interval\n"); measure_errMessage(mName, mFunction, "TRIG", errbuf, autocheck); // ?? - return MEASUREMENT_FAILURE; + goto err_ret7; } maxValue = measTrig->m_measured; @@ -1876,7 +1936,16 @@ get_measure2( printf("%-20s= %e from= %e to= %e\n", mName, (maxValue - minValue), measTrig->m_from, measTrig->m_to); *result = (maxValue - minValue); - return MEASUREMENT_OK; + + ret_val = MEASUREMENT_OK; + +err_ret7: + tfree(mAnalysis); + tfree(mName); + tfree(measTrig->m_vec); + tfree(measTrig); + + return ret_val; } case AT_DERIV: diff --git a/src/frontend/measure.c b/src/frontend/measure.c index 579ea9656..d6678f13e 100644 --- a/src/frontend/measure.c +++ b/src/frontend/measure.c @@ -137,7 +137,7 @@ com_meas(wordlist *wl) wl_let = wl_cons(copy(newvec), NULL); com_let(wl_let); wl_free(wl_let); - // fprintf(stdout, "in: %s\n", line_in); + tfree(line_in); } @@ -315,6 +315,7 @@ do_measure( txfree(an_type); txfree(resname); txfree(meastype); + wl_free(measure_word_list); break; } } else { @@ -346,9 +347,10 @@ do_measure( } /* end of for loop (first pass through .meas lines) */ - if (chk_only) - return (measures_passed); - + if (chk_only) { + tfree(an_name); + return (measures_passed); + } /* second pass through .meas cards: now do param|expr .meas statements */ newcard = meas_results; for (meas_card = ft_curckt->ci_meas; meas_card != NULL; meas_card = meas_card->li_next) { @@ -461,7 +463,7 @@ measure_parse_line(char *line) char *extra_item; /* extra item */ wl = NULL; - (void) gettok(&line); + txfree(gettok(&line)); do { item = gettok(&line); if (!(item))