From 002fc568de07eae5f75e16846d4f2e68c0926748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 20 Nov 2017 16:15:41 +0100 Subject: [PATCH] [poincare] Fix division by zero Change-Id: I644b70b58e6c2610681141158892668afc5a9c58 --- poincare/src/arithmetic.cpp | 3 +++ poincare/src/division_quotient.cpp | 3 +++ poincare/src/division_remainder.cpp | 3 +++ poincare/test/simplify_easy.cpp | 2 ++ 4 files changed, 11 insertions(+) diff --git a/poincare/src/arithmetic.cpp b/poincare/src/arithmetic.cpp index 2d8df4bde..f5fe302d1 100644 --- a/poincare/src/arithmetic.cpp +++ b/poincare/src/arithmetic.cpp @@ -6,6 +6,9 @@ namespace Poincare { const Integer Arithmetic::k_primorial32("525896479052627740771371797072411912900610967452630"); Integer Arithmetic::LCM(const Integer * a, const Integer * b) { + if (a->isZero() || b->isZero()) { + return Integer(0); + } Integer signResult = Integer::Division(Integer::Multiplication(*a, *b), GCD(a,b)).quotient; signResult.setNegative(false); return signResult; diff --git a/poincare/src/division_quotient.cpp b/poincare/src/division_quotient.cpp index 7f36ba10e..7565ba3e1 100644 --- a/poincare/src/division_quotient.cpp +++ b/poincare/src/division_quotient.cpp @@ -50,6 +50,9 @@ Expression * DivisionQuotient::shallowReduce(Context& context, AngleUnit angleUn Integer a = r0->numerator(); Integer b = r1->numerator(); + if (b.isZero()) { + return replaceWith(new Undefined(), true); // TODO: new Infinite(a.isNegative()) + } Integer result = Integer::Division(a, b).quotient; return replaceWith(new Rational(result), true); } diff --git a/poincare/src/division_remainder.cpp b/poincare/src/division_remainder.cpp index 02caf8997..bac5e2760 100644 --- a/poincare/src/division_remainder.cpp +++ b/poincare/src/division_remainder.cpp @@ -50,6 +50,9 @@ Expression * DivisionRemainder::shallowReduce(Context& context, AngleUnit angleU Integer a = r0->numerator(); Integer b = r1->numerator(); + if (b.isZero()) { + return replaceWith(new Undefined(), true); // TODO: new Infinite(a.isNegative()) + } Integer result = Integer::Division(a, b).remainder; return replaceWith(new Rational(result), true); } diff --git a/poincare/test/simplify_easy.cpp b/poincare/test/simplify_easy.cpp index 4c991296a..c33f81c2e 100644 --- a/poincare/test/simplify_easy.cpp +++ b/poincare/test/simplify_easy.cpp @@ -136,9 +136,11 @@ QUIZ_CASE(poincare_simplify_easy) { assert_parsed_expression_simplify_to("ceil(-1.3)", "-1"); assert_parsed_expression_simplify_to("conj(1/2)", "1/2"); assert_parsed_expression_simplify_to("quo(19,3)", "6"); + assert_parsed_expression_simplify_to("quo(19,0)", "undef"); assert_parsed_expression_simplify_to("quo(-19,3)", "-7"); assert_parsed_expression_simplify_to("rem(19,3)", "1"); assert_parsed_expression_simplify_to("rem(-19,3)", "2"); + assert_parsed_expression_simplify_to("rem(19,0)", "undef"); assert_parsed_expression_simplify_to("99!", "933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000"); assert_parsed_expression_simplify_to("floor(-1.3)", "-2"); assert_parsed_expression_simplify_to("frac(-1.3)", "0.7");