#6247 closed defect (invalid)
Uninitialized code in _functions.c
Reported by: | Andreas Heuermann | Owned by: | Andreas Heuermann |
---|---|---|---|
Priority: | high | Milestone: | 1.17.0 |
Component: | Code Generation | Version: | v1.17.0-dev |
Keywords: | uninitialized memory | Cc: | daniel.bouskela@… |
Description
While debugging ThermoSysPro.Examples.SimpleExamples.TestStaticDrum1
to find why it is not simulating I found a few issues using clang --analyze
. One of the is uninitialized variables used in an equation in ThermoSysPro.Examples.SimpleExamples.TestStaticDrum1_functions.c
To reproduce run
loadModel(Modelica,{"3.2.3"}); getErrorString(); loadModel(ThermoSysPro); getErrorString(); setCommandLineOptions("-d=newInst"); getErrorString(); buildModel(ThermoSysPro.Examples.SimpleExamples.TestStaticDrum1);
and add --analyze
to CFLAGS
in the generate makefile.
Running make again and clang will print:
ThermoSysPro.Examples.SimpleExamples.TestStaticDrum1_functions.c:19001:42: warning: The left operand of '-' is a garbage value _dxp = (-((_dh1satp + (_x) * (_dh2satp - _dh1satp)) / tmp6));
And in fact that is correct, _dh2satp
and _dh1satp
are not initialized.
See the code of the surrounding function:
DLLExport ThermoSysPro_Properties_WaterSteamSimple_ThermoProperties__ph omc_ThermoSysPro_Properties_WaterSteamSimple_prop4__Ph(threadData_t *threadData, modelica_real _p, modelica_real _h) { ThermoSysPro_Properties_WaterSteamSimple_ThermoProperties__ph _pro; modelica_real _h1sat; modelica_real _h2sat; modelica_real _T1sat; modelica_real _T2sat; modelica_real _d1sat; modelica_real _d2sat; modelica_real _u1sat; modelica_real _u2sat; modelica_real _s1sat; modelica_real _s2sat; modelica_real _cp1sat; modelica_real _cp2sat; modelica_real _dd1satp; modelica_real _dd2satp; modelica_real _du1satp; modelica_real _du2satp; modelica_real _dxh; modelica_real _dxp; modelica_real _dh1satp; modelica_real _dh2satp; modelica_real _x; modelica_real tmp1; modelica_real tmp2; modelica_real tmp3; modelica_real tmp4; modelica_real tmp5; modelica_real tmp6; modelica_real tmp7; modelica_real tmp8; modelica_real tmp9; modelica_real tmp10; modelica_real tmp11; modelica_real tmp12; modelica_real tmp13; modelica_real tmp14; modelica_real tmp15; modelica_real tmp16; _tailrecursive: OMC_LABEL_UNUSED ThermoSysPro_Properties_WaterSteamSimple_ThermoProperties__ph_construct(threadData, _pro); // _pro has no default value. // _h1sat has no default value. // _h2sat has no default value. // _T1sat has no default value. // _T2sat has no default value. // _d1sat has no default value. // _d2sat has no default value. // _u1sat has no default value. // _u2sat has no default value. // _s1sat has no default value. // _s2sat has no default value. // _cp1sat has no default value. // _cp2sat has no default value. // _dd1satp has no default value. // _dd2satp has no default value. // _du1satp has no default value. // _du2satp has no default value. // _dxh has no default value. // _dxp has no default value. // _dh1satp has no default value. // _dh2satp has no default value. // _x has no default value. _h1sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Enthalpy_h1sat__P(threadData, _p); _h2sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Enthalpy_h2sat__P(threadData, _p); _T1sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Temperature_T1__Ph(threadData, _p, _h1sat); _d1sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Density_d1__Ph(threadData, _p, _h1sat); _u1sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Energy_u1__Ph(threadData, _p, _h1sat); _s1sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Entropy_s1__Ph(threadData, _p, _h1sat); _cp1sat = omc_ThermoSysPro_Properties_WaterSteamSimple_HeatCapacity_cp1__Ph(threadData, _p, _h1sat); _T2sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Temperature_T2__Ph(threadData, _p, _h2sat); _d2sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Density_d2__Ph(threadData, _p, _h2sat); _u2sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Energy_u2__Ph(threadData, _p, _h2sat); _s2sat = omc_ThermoSysPro_Properties_WaterSteamSimple_Entropy_s2__Ph(threadData, _p, _h2sat); _cp2sat = omc_ThermoSysPro_Properties_WaterSteamSimple_HeatCapacity_cp2__Ph(threadData, _p, _h2sat); tmp1 = _h2sat - _h1sat; _x = (_h - _h1sat) / tmp1; _pro._x = _x; _pro._T = (1.0 - _x) * (_T1sat) + (_x) * (_T2sat); tmp2 = _d1sat; tmp3 = _d2sat; tmp4 = (1.0 - _x) / tmp2 + (_x) / tmp3; _pro._d = (1.0) / tmp4; _pro._u = (1.0 - _x) * (_u1sat) + (_x) * (_u2sat); _pro._s = (1.0 - _x) * (_s1sat) + (_x) * (_s2sat); _pro._cp = (1.0 - _x) * (_cp1sat) + (_x) * (_cp2sat); tmp5 = _h2sat - _h1sat; _dxh = (1.0) / tmp5; tmp6 = _h2sat - _h1sat; _dxp = (-((_dh1satp + (_x) * (_dh2satp - _dh1satp)) / tmp6)); _dd1satp = omc_ThermoSysPro_Properties_WaterSteamSimple_Density_dd1ph__Ph(threadData, _p, _h1sat); _du1satp = omc_ThermoSysPro_Properties_WaterSteamSimple_Energy_du1ph__Ph(threadData, _p, _h1sat); _dd2satp = omc_ThermoSysPro_Properties_WaterSteamSimple_Density_dd2ph__Ph(threadData, _p, _h2sat); _du2satp = omc_ThermoSysPro_Properties_WaterSteamSimple_Energy_du2ph__Ph(threadData, _p, _h2sat); _dh1satp = omc_ThermoSysPro_Properties_WaterSteamSimple_Enthalpy_dh1satp__P(threadData, _p); _dh2satp = omc_ThermoSysPro_Properties_WaterSteamSimple_Enthalpy_dh2satp__P(threadData, _p); tmp7 = _pro._d; tmp8 = _d1sat; tmp9 = _d2sat; _pro._ddhp = (-(((tmp7 * tmp7)) * ((-((_dxh) / tmp8)) + (_dxh) / tmp9))); tmp10 = _pro._d; tmp11 = _d1sat; tmp12 = _d1sat; tmp13 = (tmp12 * tmp12); tmp14 = _d2sat; tmp15 = _d2sat; tmp16 = (tmp15 * tmp15); _pro._ddph = (-(((tmp10 * tmp10)) * ((-((_dxp) / tmp11)) + ((1.0 - _x) * ((-((1.0) / tmp13)))) * (_dd1satp) + (_dxp) / tmp14 + ((_x) * ((-((1.0) / tmp16)))) * (_dd2satp)))); _pro._duph = (-((_dxp) * (_u1sat))) + (1.0 - _x) * (_du1satp) + (_dxp) * (_u2sat) + (_x) * (_du2satp); _pro._duhp = (-((_dxh) * (_u1sat))) + (_dxh) * (_u2sat); _return: OMC_LABEL_UNUSED return _pro; }
Change History (5)
comment:1 by , 4 years ago
comment:2 by , 4 years ago
It turns out that ThermoSysPro 3.2/Properties/WaterSteamSimple/prop4_Ph.mo
is (probably) wrong.
In an algorithm section
dxp := -(dh1satp + x*(dh2satp - dh1satp))/(h2sat - h1sat);
is using dh1satp
and dh2satp
before they are initialized a few lines later.
comment:3 by , 4 years ago
There is a bunch more such warnings actually.
https://libraries.openmodelica.org/branches/master/ThermoSysPro/files/ThermoSysPro_ThermoSysPro.Examples.SimpleExamples.TestStaticDrum1.err
The new Front-end does not have the warnings yet. Maybe you missed them there.
https://libraries.openmodelica.org/branches/newInst/ThermoSysPro/files/ThermoSysPro_ThermoSysPro.Examples.SimpleExamples.TestStaticDrum1.err
comment:4 by , 4 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
This needs to be solved by the developers of the library, so I'm closing this ticket.
comment:5 by , 4 years ago
Cc: | added |
---|
The solution will be to switch
and
Probably a missing
listReverse
somewhere.