Take care of a pair of memory leaks that occur when the BFM demod GUI
is closed.
==786== 19,952 (24 direct, 19,928 indirect) bytes in 1 blocks are definitely lost in loss record 7,065 of 7,081
==786== at 0x4C2D54F: operator new(unsigned long) (vg_replace_malloc.c:334)
==786== by 0x54C82ED: allocate (new_allocator.h:111)
==786== by 0x54C82ED: allocate (alloc_traits.h:436)
==786== by 0x54C82ED: _M_get_node (stl_list.h:383)
==786== by 0x54C82ED: _M_create_node<FFTWEngine::Plan* const&> (stl_list.h:572)
==786== by 0x54C82ED: _M_insert<FFTWEngine::Plan* const&> (stl_list.h:1801)
==786== by 0x54C82ED: push_back (stl_list.h:1118)
==786== by 0x54C82ED: FFTWEngine::configure(int, bool) (fftwengine.cpp:35)
==786== by 0x4F4590B: SpectrumVis::handleConfigure(int, int, FFTWindow::Function) (spectrumvis.cpp:206)
==786== by 0x4F459EE: SpectrumVis::handleMessage(Message const&) (spectrumvis.cpp:170)
==786== by 0x548346C: BasebandSampleSink::handleInputMessages() (basebandsamplesink.cpp:21)
==786== by 0x69E1615: QMetaObject::activate(QObject*, int, int, void**) (in /usr/lib/libQt5Core.so.5.10.1)
==786== by 0x5497D4B: MessageQueue::push(Message*, bool) (messagequeue.cpp:52)
==786== by 0x33F9D61A: BFMDemodGUI::BFMDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) (bfmdemodgui.cpp:352)
==786== by 0x33F9D985: BFMDemodGUI::create(PluginAPI*, DeviceUISet*, BasebandSampleSink*) (bfmdemodgui.cpp:50)
==786== by 0x33FB035D: non-virtual thunk to BFMPlugin::createRxChannelGUI(DeviceUISet*, BasebandSampleSink*) (bfmplugin.cpp:57)
==786== by 0x4F47F19: DeviceUISet::loadRxChannelSettings(Preset const*, PluginAPI*) (deviceuiset.cpp:201)
==786== by 0x4EA51EA: MainWindow::loadPresetSettings(Preset const*, int) (mainwindow.cpp:575)
==786== by 0x4EAC81B: MainWindow::MainWindow(qtwebapp::LoggerWithFile*, MainParser const&, QWidget*) (mainwindow.cpp:176)
==786== by 0x10A49B: runQtApplication(int, char**, qtwebapp::LoggerWithFile*) (main.cpp:120)
==786== by 0x109B38: main (main.cpp:131)
==786==
==786== 54,096 (112 direct, 53,984 indirect) bytes in 1 blocks are definitely lost in loss record 7,075 of 7,081
==786== at 0x4C2D54F: operator new(unsigned long) (vg_replace_malloc.c:334)
==786== by 0x69E9162: QObject::QObject(QObject*) (in /usr/lib/libQt5Core.so.5.10.1)
==786== by 0x5497BEE: MessageQueue::MessageQueue(QObject*) (messagequeue.cpp:26)
==786== by 0x54834FF: BasebandSampleSink::BasebandSampleSink() (basebandsamplesink.cpp:6)
==786== by 0x4F45A29: SpectrumVis::SpectrumVis(float, GLSpectrum*) (spectrumvis.cpp:26)
==786== by 0x33F9D53C: BFMDemodGUI::BFMDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) (bfmdemodgui.cpp:342)
==786== by 0x33F9D985: BFMDemodGUI::create(PluginAPI*, DeviceUISet*, BasebandSampleSink*) (bfmdemodgui.cpp:50)
==786== by 0x33FB035D: non-virtual thunk to BFMPlugin::createRxChannelGUI(DeviceUISet*, BasebandSampleSink*) (bfmplugin.cpp:57)
==786== by 0x4F47F19: DeviceUISet::loadRxChannelSettings(Preset const*, PluginAPI*) (deviceuiset.cpp:201)
==786== by 0x4EA51EA: MainWindow::loadPresetSettings(Preset const*, int) (mainwindow.cpp:575)
==786== by 0x4EAC81B: MainWindow::MainWindow(qtwebapp::LoggerWithFile*, MainParser const&, QWidget*) (mainwindow.cpp:176)
==786== by 0x10A49B: runQtApplication(int, char**, qtwebapp::LoggerWithFile*) (main.cpp:120)
==786== by 0x109B38: main (main.cpp:131)
The m_parms.tot_errs array is not initialized prior to its first use
in the RDSDemod::biphase function. ASAN does not pick up on this
directly, but instead reports it as follows (note that ASAN fills
memory with 0xBE and -1094795586 is 0xBEBEBEBE):
./plugins/channelrx/demodbfm/rdsdemod.cpp:159:95: runtime error: signed
integer overflow: -1094795586 + -1094795586 cannot be represented in type
'int'
The m_parms.subcarr_bb array does not appear to be read prior to
initialization, but we initialize it to zero anyway for the sake
of good hygiene.
UBSan reports the following error when replaying an IQ stream:
./plugins/samplesource/filesource/filesourcegui.cpp:331:29: runtime
error: signed integer overflow: 2704064 * 1000 cannot be represented
in type 'int'
By rearranging the calculation, we can be sure that the calculation never
overflows.