From e0a256b8d31abd38d1a685312d2f1ce89670e10c Mon Sep 17 00:00:00 2001 From: Walter Van Herck <w.van.herck@fz-juelich.de> Date: Tue, 19 Feb 2019 18:08:09 +0100 Subject: [PATCH] Prevent possible access to null pointers --- .../RealSpaceWidgets/IPositionBuilder.cpp | 39 ++++++++++--------- .../Views/RealSpaceWidgets/IPositionBuilder.h | 11 +++--- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp b/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp index be7b71a0f82..3a3b69f364b 100644 --- a/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp +++ b/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp @@ -96,7 +96,7 @@ double RandomPositionBuilder::positionVariance() const } Lattice1DPositionBuilder::Lattice1DPositionBuilder(const InterferenceFunction1DLattice* p_iff) - : mp_iff(p_iff) + : mP_iff(p_iff->clone()) { } @@ -105,7 +105,7 @@ Lattice1DPositionBuilder::~Lattice1DPositionBuilder() = default; std::vector<std::vector<double>> Lattice1DPositionBuilder::generatePositionsImpl(double layer_size, double) const { - auto lattice_pars = mp_iff->getLatticeParameters(); + auto lattice_pars = mP_iff->getLatticeParameters(); double length = lattice_pars.m_length; double xi = lattice_pars.m_xi; @@ -119,11 +119,11 @@ std::vector<std::vector<double>> Lattice1DPositionBuilder::generatePositionsImpl double Lattice1DPositionBuilder::positionVariance() const { - return mp_iff->positionVariance(); + return mP_iff->positionVariance(); } Lattice2DPositionBuilder::Lattice2DPositionBuilder(const InterferenceFunction2DLattice* p_iff) - : mp_iff(p_iff) + : mP_iff(p_iff->clone()) { } @@ -132,7 +132,7 @@ Lattice2DPositionBuilder::~Lattice2DPositionBuilder() = default; std::vector<std::vector<double>> Lattice2DPositionBuilder::generatePositionsImpl(double layer_size, double) const { - auto& lattice = mp_iff->lattice(); + auto& lattice = mP_iff->lattice(); double l1 = lattice.length1(); double l2 = lattice.length2(); double alpha = lattice.latticeAngle(); @@ -154,12 +154,12 @@ std::vector<std::vector<double>> Lattice2DPositionBuilder::generatePositionsImpl double Lattice2DPositionBuilder::positionVariance() const { - return mp_iff->positionVariance(); + return mP_iff->positionVariance(); } ParaCrystal2DPositionBuilder::ParaCrystal2DPositionBuilder( const InterferenceFunction2DParaCrystal* p_iff) - : mp_iff(p_iff) + : mP_iff(p_iff->clone()) { } @@ -168,17 +168,18 @@ ParaCrystal2DPositionBuilder::~ParaCrystal2DPositionBuilder() = default; std::vector<std::vector<double>> ParaCrystal2DPositionBuilder::generatePositionsImpl(double layer_size, double) const { - return RealSpace2DParacrystalUtils::Compute2DParacrystalLatticePositions(mp_iff, layer_size); + return RealSpace2DParacrystalUtils::Compute2DParacrystalLatticePositions(mP_iff.get(), + layer_size); } double ParaCrystal2DPositionBuilder::positionVariance() const { - return mp_iff->positionVariance(); + return mP_iff->positionVariance(); } Finite2DLatticePositionBuilder::Finite2DLatticePositionBuilder( const InterferenceFunctionFinite2DLattice* p_iff) - : mp_iff(p_iff) + : mP_iff(p_iff->clone()) { } @@ -187,7 +188,7 @@ Finite2DLatticePositionBuilder::~Finite2DLatticePositionBuilder() = default; std::vector<std::vector<double>> Finite2DLatticePositionBuilder::generatePositionsImpl(double layer_size, double) const { - auto& lattice = mp_iff->lattice(); + auto& lattice = mP_iff->lattice(); double l1 = lattice.length1(); double l2 = lattice.length2(); double alpha = lattice.latticeAngle(); @@ -202,20 +203,20 @@ Finite2DLatticePositionBuilder::generatePositionsImpl(double layer_size, double) n1 = l1 == 0.0 ? 2 : static_cast<unsigned>(2.0 * layer_size * std::sqrt(2.0) / l1 / sina); n2 = l2 == 0.0 ? 2 : static_cast<unsigned>(2.0 * layer_size * std::sqrt(2.0) / l2 / sina); } - n1 = std::min(n1, mp_iff->numberUnitCells1()); - n2 = std::min(n2, mp_iff->numberUnitCells2()); + n1 = std::min(n1, mP_iff->numberUnitCells1()); + n2 = std::min(n2, mP_iff->numberUnitCells2()); return Generate2DLatticePoints(l1, l2, alpha, xi, n1, n2); } double Finite2DLatticePositionBuilder::positionVariance() const { - return mp_iff->positionVariance(); + return mP_iff->positionVariance(); } RadialParacrystalPositionBuilder::RadialParacrystalPositionBuilder( const InterferenceFunctionRadialParaCrystal* p_iff) - : mp_iff(p_iff) + : mP_iff(p_iff->clone()) { } @@ -226,7 +227,7 @@ RadialParacrystalPositionBuilder::generatePositionsImpl(double layer_size, doubl { std::vector<std::vector<double>> lattice_positions; - double distance = mp_iff->peakDistance(); + double distance = mP_iff->peakDistance(); // Estimate the limit n of the integer multiple i of the peakDistance required // for populating particles correctly within the 3D model's boundaries @@ -244,7 +245,7 @@ RadialParacrystalPositionBuilder::generatePositionsImpl(double layer_size, doubl // positions of particles located along +x (store at odd index) unsigned i_left = static_cast<unsigned>(std::max(0, 2 * i - 3)); - double offset = mp_iff->randomSample(); + double offset = mP_iff->randomSample(); lattice_positions[static_cast<size_t>(2 * i - 1)][0] = lattice_positions[i_left][0] + distance + offset; lattice_positions[static_cast<size_t>(2 * i - 1)][1] = 0.0; @@ -252,7 +253,7 @@ RadialParacrystalPositionBuilder::generatePositionsImpl(double layer_size, doubl // positions of particles located along -x (store at even index) unsigned i_right = static_cast<unsigned>(2 * (i - 1)); - offset = mp_iff->randomSample(); + offset = mP_iff->randomSample(); lattice_positions[static_cast<size_t>(2 * i)][0] = lattice_positions[i_right][0] - distance + offset; lattice_positions[static_cast<size_t>(2 * i)][1] = 0.0; @@ -262,7 +263,7 @@ RadialParacrystalPositionBuilder::generatePositionsImpl(double layer_size, doubl double RadialParacrystalPositionBuilder::positionVariance() const { - return mp_iff->positionVariance(); + return mP_iff->positionVariance(); } namespace diff --git a/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.h b/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.h index b53ae28a61b..1d92bc7c1cc 100644 --- a/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.h +++ b/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.h @@ -16,6 +16,7 @@ #define IPOSITIONBUILDER_H #include <vector> +#include <memory> class InterferenceFunction1DLattice; class InterferenceFunction2DLattice; @@ -75,7 +76,7 @@ private: std::vector<std::vector<double>> generatePositionsImpl(double layer_size, double density = 0.0) const override; double positionVariance() const override; - const InterferenceFunction1DLattice* mp_iff; + std::unique_ptr<InterferenceFunction1DLattice> mP_iff; }; class Lattice2DPositionBuilder : public IPositionBuilder @@ -88,7 +89,7 @@ private: std::vector<std::vector<double>> generatePositionsImpl(double layer_size, double density = 0.0) const override; double positionVariance() const override; - const InterferenceFunction2DLattice* mp_iff; + std::unique_ptr<InterferenceFunction2DLattice> mP_iff; }; class ParaCrystal2DPositionBuilder : public IPositionBuilder @@ -101,7 +102,7 @@ private: std::vector<std::vector<double>> generatePositionsImpl(double layer_size, double density = 0.0) const override; double positionVariance() const override; - const InterferenceFunction2DParaCrystal* mp_iff; + std::unique_ptr<InterferenceFunction2DParaCrystal> mP_iff; }; class Finite2DLatticePositionBuilder : public IPositionBuilder @@ -114,7 +115,7 @@ private: std::vector<std::vector<double>> generatePositionsImpl(double layer_size, double density = 0.0) const override; double positionVariance() const override; - const InterferenceFunctionFinite2DLattice* mp_iff; + std::unique_ptr<InterferenceFunctionFinite2DLattice> mP_iff; }; class RadialParacrystalPositionBuilder : public IPositionBuilder @@ -127,7 +128,7 @@ private: std::vector<std::vector<double>> generatePositionsImpl(double layer_size, double density = 0.0) const override; double positionVariance() const override; - const InterferenceFunctionRadialParaCrystal* mp_iff; + std::unique_ptr<InterferenceFunctionRadialParaCrystal> mP_iff; }; #endif // IPOSITIONBUILDER_H -- GitLab