From c533e1206f7e7b97b6d722c03593399e4d1be6af Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Thu, 11 Apr 2019 13:40:48 +0200 Subject: [PATCH] Protect against nullptr access when combining AQUANCON records --- .../parser/eclipse/EclipseState/Aquancon.cpp | 8 +- tests/parser/AquanconTests.cpp | 75 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/opm/parser/eclipse/EclipseState/Aquancon.cpp b/src/opm/parser/eclipse/EclipseState/Aquancon.cpp index 21f5b3997..12b9f4256 100755 --- a/src/opm/parser/eclipse/EclipseState/Aquancon.cpp +++ b/src/opm/parser/eclipse/EclipseState/Aquancon.cpp @@ -219,7 +219,13 @@ namespace Opm { { if (element1.global_index == element2.global_index) { - *(element1.influx_coeff) += *(element2.influx_coeff); + if (element1.influx_coeff && element2.influx_coeff) + *(element1.influx_coeff) += *(element2.influx_coeff); + else { + if (element1.influx_coeff || element2.influx_coeff) + throw std::invalid_argument("Sorry - can not combine defaulted and not default AQUANCON records"); + } + return true; } diff --git a/tests/parser/AquanconTests.cpp b/tests/parser/AquanconTests.cpp index a58207ccd..3540473c1 100755 --- a/tests/parser/AquanconTests.cpp +++ b/tests/parser/AquanconTests.cpp @@ -25,6 +25,71 @@ along with OPM. If not, see . using namespace Opm; +inline Deck createAQUANCONDeck_DEFAULT_INFLUX2() { + const char *deckData = + "DIMENS\n" + "3 3 3 /\n" + "\n" + "GRID\n" + "\n" + "ACTNUM\n" + " 0 8*1 0 8*1 0 8*1 /\n" + "DXV\n" + "1 1 1 /\n" + "\n" + "DYV\n" + "1 1 1 /\n" + "\n" + "DZV\n" + "1 1 1 /\n" + "\n" + "TOPS\n" + "9*100 /\n" + "\n" + "SOLUTION\n" + "\n" + "AQUANCON\n" + " 1 1 1 1 1 1 1 J- 1.0 /\n" + " 1 1 1 1 1 1 1 J- /\n" + "/ \n"; + + Parser parser; + return parser.parseString(deckData); +} + + +inline Deck createAQUANCONDeck_DEFAULT_INFLUX1() { + const char *deckData = + "DIMENS\n" + "3 3 3 /\n" + "\n" + "GRID\n" + "\n" + "ACTNUM\n" + " 0 8*1 0 8*1 0 8*1 /\n" + "DXV\n" + "1 1 1 /\n" + "\n" + "DYV\n" + "1 1 1 /\n" + "\n" + "DZV\n" + "1 1 1 /\n" + "\n" + "TOPS\n" + "9*100 /\n" + "\n" + "SOLUTION\n" + "\n" + "AQUANCON\n" + " 1 1 1 1 1 1 1 J- /\n" + " 1 1 1 1 1 1 1 J- /\n" + "/ \n"; + + Parser parser; + return parser.parseString(deckData); +} + inline Deck createAQUANCONDeck() { const char *deckData = "DIMENS\n" @@ -95,3 +160,13 @@ BOOST_AUTO_TEST_CASE(AquanconTest){ expected_output.at(i).record_index.begin(), expected_output.at(i).record_index.end() ); } } + +BOOST_AUTO_TEST_CASE(AquanconTest_DEFAULT_INFLUX) { + auto deck1 = createAQUANCONDeck_DEFAULT_INFLUX1(); + EclipseState eclState1( deck1 ); + BOOST_CHECK_NO_THROW(Aquancon( eclState1.getInputGrid(), deck1)); + + auto deck2 = createAQUANCONDeck_DEFAULT_INFLUX2(); + EclipseState eclState2( deck2 ); + BOOST_CHECK_THROW(Aquancon( eclState2.getInputGrid(), deck2), std::invalid_argument); +}