From bb6b87a2685c0d71b5c38be33c100f85ac0b9cee Mon Sep 17 00:00:00 2001 From: Renaud G Date: Thu, 25 Jul 2019 09:59:29 +0200 Subject: Rework of the component to be a proper lib --- booleancondition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'booleancondition.cpp') diff --git a/booleancondition.cpp b/booleancondition.cpp index f62c900..c81f5ab 100644 --- a/booleancondition.cpp +++ b/booleancondition.cpp @@ -159,5 +159,5 @@ qint64 BooleanCondition::valueToScalar() const m_value->run(nullptr); auto result= m_value->getResult(); - return result->getResult(Result::SCALAR).toInt(); + return result->getResult(Dice::RESULT_TYPE::SCALAR).toInt(); } -- cgit v1.2.3-70-g09d2 From 8b04d886845be5c3b57caae4d96b53133c51ab14 Mon Sep 17 00:00:00 2001 From: Renaud G Date: Thu, 25 Jul 2019 22:29:20 +0200 Subject: Fix crash found by afl --- booleancondition.cpp | 5 ++++- node/scalaroperatornode.cpp | 7 +++++++ operationcondition.cpp | 4 ++++ parsingtoolbox.cpp | 8 ++++++-- 4 files changed, 21 insertions(+), 3 deletions(-) (limited to 'booleancondition.cpp') diff --git a/booleancondition.cpp b/booleancondition.cpp index c81f5ab..6747727 100644 --- a/booleancondition.cpp +++ b/booleancondition.cpp @@ -159,5 +159,8 @@ qint64 BooleanCondition::valueToScalar() const m_value->run(nullptr); auto result= m_value->getResult(); - return result->getResult(Dice::RESULT_TYPE::SCALAR).toInt(); + if(result) + return result->getResult(Dice::RESULT_TYPE::SCALAR).toInt(); + else + return 0; } diff --git a/node/scalaroperatornode.cpp b/node/scalaroperatornode.cpp index 9edbcdc..821150b 100644 --- a/node/scalaroperatornode.cpp +++ b/node/scalaroperatornode.cpp @@ -66,6 +66,13 @@ void ScalarOperatorNode::run(ExecutionNode* previous) m_internalNode->getResult()->setPrevious(previousResult); } + if(internalResult == nullptr) + { + m_errors.insert(Dice::ERROR_CODE::NO_VALID_RESULT, + QObject::tr("No Valid result in arithmetic operatoion: %1").arg(toString(true))); + return; + } + switch(m_arithmeticOperator) { case Die::PLUS: diff --git a/operationcondition.cpp b/operationcondition.cpp index 67b10fc..507416d 100644 --- a/operationcondition.cpp +++ b/operationcondition.cpp @@ -41,6 +41,10 @@ void OperationCondition::setBoolean(BooleanCondition* boolean) qint64 OperationCondition::hasValid(Die* b, bool recursive, bool unhighlight) const { + if(nullptr == m_boolean) + { + return 0; + } QList listValues; if(recursive) { diff --git a/parsingtoolbox.cpp b/parsingtoolbox.cpp index 702019d..2453eb7 100644 --- a/parsingtoolbox.cpp +++ b/parsingtoolbox.cpp @@ -204,13 +204,17 @@ Validator* ParsingToolBox::readValidator(QString& str, bool hasSquare) { OperationCondition* condition= new OperationCondition(); condition->setValueNode(operandNode); - Validator* valid= readValidator(str,hasSquare); + Validator* valid= readValidator(str, hasSquare); BooleanCondition* boolC= dynamic_cast(valid); if(nullptr != boolC) { condition->setBoolean(boolC); + returnVal= condition; + } + else + { + delete condition; } - returnVal= condition; } } else if(readOperand(str, operandNode)) -- cgit v1.2.3-70-g09d2 From 72741802a92c1420a7b709ef0c8b0cad1897c302 Mon Sep 17 00:00:00 2001 From: Renaud G Date: Sun, 28 Jul 2019 00:54:44 +0200 Subject: fix timeouts about valid range --- booleancondition.cpp | 81 +++++++++++++++++++++++++++++++++++++++++++++------- booleancondition.h | 8 +++--- 2 files changed, 75 insertions(+), 14 deletions(-) (limited to 'booleancondition.cpp') diff --git a/booleancondition.cpp b/booleancondition.cpp index 6747727..7fc71bc 100644 --- a/booleancondition.cpp +++ b/booleancondition.cpp @@ -20,7 +20,66 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "booleancondition.h" -#include + +Dice::CONDITION_STATE testEqual(bool insideRange, const std::pair& range) +{ + if(!insideRange) + return Dice::CONDITION_STATE::UNREACHABLE; + else if(insideRange && (range.first == range.second)) + return Dice::CONDITION_STATE::ALWAYSTRUE; + else + return Dice::CONDITION_STATE::REACHABLE; +} + +Dice::CONDITION_STATE testGreatherThan(qint64 value, const std::pair& range) +{ + if(value >= std::max(range.first, range.second)) + return Dice::CONDITION_STATE::UNREACHABLE; + else if(value < std::min(range.first, range.second)) + return Dice::CONDITION_STATE::ALWAYSTRUE; + else + return Dice::CONDITION_STATE::REACHABLE; +} + +Dice::CONDITION_STATE testLesserThan(qint64 value, const std::pair& range) +{ + if(value <= std::min(range.first, range.second)) + return Dice::CONDITION_STATE::UNREACHABLE; + else if(value > std::max(range.first, range.second)) + return Dice::CONDITION_STATE::ALWAYSTRUE; + else + return Dice::CONDITION_STATE::REACHABLE; +} + +Dice::CONDITION_STATE testGreaterOrEqual(qint64 value, const std::pair& range) +{ + if(value > std::max(range.first, range.second)) + return Dice::CONDITION_STATE::UNREACHABLE; + else if(value <= std::min(range.first, range.second)) + return Dice::CONDITION_STATE::ALWAYSTRUE; + else + return Dice::CONDITION_STATE::REACHABLE; +} + +Dice::CONDITION_STATE testLesserOrEqual(qint64 value, const std::pair& range) +{ + if(value < std::min(range.first, range.second)) + return Dice::CONDITION_STATE::UNREACHABLE; + else if(value >= std::max(range.first, range.second)) + return Dice::CONDITION_STATE::ALWAYSTRUE; + else + return Dice::CONDITION_STATE::REACHABLE; +} + +Dice::CONDITION_STATE testDifferent(bool inside, const std::pair& range) +{ + if(inside && (range.first == range.second)) + return Dice::CONDITION_STATE::UNREACHABLE; + else if(!inside) + return Dice::CONDITION_STATE::ALWAYSTRUE; + else + return Dice::CONDITION_STATE::REACHABLE; +} BooleanCondition::BooleanCondition() : m_operator(Equal) {} @@ -117,33 +176,35 @@ QString BooleanCondition::toString() } return QStringLiteral("[%1%2]").arg(str).arg(valueToScalar()); } -bool BooleanCondition::isValidRangeSize(std::pair range) const + +Dice::CONDITION_STATE BooleanCondition::isValidRangeSize(const std::pair& range) const { - bool isValid= false; + Dice::CONDITION_STATE state; auto valueScalar= valueToScalar(); qint64 boundValue= qBound(range.first, valueScalar, range.second); + bool isInsideRange= (boundValue == valueScalar); switch(m_operator) { case Equal: - isValid= (boundValue == valueScalar); + state= testEqual(isInsideRange, range); //(isInsideRange && (range.first != range.second)) ? ; break; case GreaterThan: - isValid= range.first <= valueScalar; + state= testGreatherThan(valueScalar, range); break; case LesserThan: - isValid= range.second >= valueScalar; + state= testLesserThan(valueScalar, range); break; case GreaterOrEqual: - isValid= range.first < valueScalar; + state= testGreaterOrEqual(valueScalar, range); break; case LesserOrEqual: - isValid= range.second > valueScalar; + state= testLesserOrEqual(valueScalar, range); break; case Different: - isValid= (boundValue == valueScalar); + state= testDifferent(isInsideRange, range); break; } - return isValid; + return state; } Validator* BooleanCondition::getCopy() const { diff --git a/booleancondition.h b/booleancondition.h index c542a0c..54c243a 100644 --- a/booleancondition.h +++ b/booleancondition.h @@ -42,20 +42,20 @@ public: Different }; BooleanCondition(); - virtual ~BooleanCondition(); + virtual ~BooleanCondition() override; - virtual qint64 hasValid(Die* b, bool recursive, bool unhighlight= false) const; + virtual qint64 hasValid(Die* b, bool recursive, bool unhighlight= false) const override; void setOperator(LogicOperator m); void setValueNode(ExecutionNode*); QString toString(); - virtual bool isValidRangeSize(std::pair range) const; + virtual Dice::CONDITION_STATE isValidRangeSize(const std::pair& range) const override; /** * @brief getCopy * @return */ - virtual Validator* getCopy() const; + virtual Validator* getCopy() const override; private: qint64 valueToScalar() const; -- cgit v1.2.3-70-g09d2 From 0a059fd7f9721d74dad7d0a11f6d8a16db1717ee Mon Sep 17 00:00:00 2001 From: Renaud G Date: Sun, 28 Jul 2019 00:55:10 +0200 Subject: Prevent crashes when copying boolean condition --- booleancondition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'booleancondition.cpp') diff --git a/booleancondition.cpp b/booleancondition.cpp index 7fc71bc..82d599b 100644 --- a/booleancondition.cpp +++ b/booleancondition.cpp @@ -210,7 +210,7 @@ Validator* BooleanCondition::getCopy() const { BooleanCondition* val= new BooleanCondition(); val->setOperator(m_operator); - val->setValueNode(m_value); + val->setValueNode(m_value->getCopy()); return val; } qint64 BooleanCondition::valueToScalar() const -- cgit v1.2.3-70-g09d2