From 2aa88b969ddb35a7106aa09ee1c114b783f64a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Martins?= <82839172+amartinsmg@users.noreply.github.com> Date: Wed, 11 Feb 2026 00:11:24 -0300 Subject: [PATCH] Harden numeric domain checks in math routines --- src/area_shape.h | 2 +- src/basic_operations.h | 1 + src/combinatorics.h | 4 ++-- src/geometry.h | 10 +++++----- src/probability_distribution.h | 4 +++- src/test/main.c | 8 ++++++++ src/trigonometry.h | 13 ++++++++----- 7 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/area_shape.h b/src/area_shape.h index 22d1904..1515f08 100644 --- a/src/area_shape.h +++ b/src/area_shape.h @@ -158,7 +158,7 @@ double trapezoidArea(double largerBase, double smallerBase, double height) double regularPolygonArea(double side, int nOfSides) { double apothen, perimeter, result; - assert(side > 0 && nOfSides > 0); + assert(side > 0 && nOfSides >= 3); apothen = side / (2 * tan(M_PI / nOfSides)); perimeter = side * nOfSides; result = perimeter * apothen / 2; diff --git a/src/basic_operations.h b/src/basic_operations.h index a4a4e63..8028a5b 100644 --- a/src/basic_operations.h +++ b/src/basic_operations.h @@ -13,6 +13,7 @@ double logarithm(double num, double base) { + assert(num > 0 && base > 0 && base != 1); double result = log(num) / log(base); return result; } diff --git a/src/combinatorics.h b/src/combinatorics.h index 34e848c..77be3ea 100644 --- a/src/combinatorics.h +++ b/src/combinatorics.h @@ -51,7 +51,7 @@ long long cyclePermutation(int num) long long arrangement(int total, int selected) { long long result; - assert(total > 0 && selected >= 0); + assert(total > 0 && selected >= 0 && selected <= total); result = factorial(total) / factorial(total - selected); return result; } @@ -113,7 +113,7 @@ double cyclePermutationlf(int num) double arrangementlf(int total, int selected) { double result; - assert(total > 0 && selected >= 0); + assert(total > 0 && selected >= 0 && selected <= total); result = factoriallf(total) / factoriallf(total - selected); return result; } diff --git a/src/geometry.h b/src/geometry.h index a6ec2d2..1ac8b8d 100644 --- a/src/geometry.h +++ b/src/geometry.h @@ -79,7 +79,7 @@ double *midpointPoints(double ax, double ay, double bx, double by) double slopeOfLine(double x1, double y1, double x2, double y2) { double result; - assert(x1 != x2 || y1 != y2); + assert(x1 != x2); result = (y2 - y1) / (x2 - x1); return result; } @@ -156,7 +156,7 @@ double circlePerimeter(double radius) int nOfDiagnonalsPolygon(int nOfSides) { double result; - assert(nOfSides > 0); + assert(nOfSides >= 3); result = nOfSides * (nOfSides - 3) / 2; return result; } @@ -171,7 +171,7 @@ int nOfDiagnonalsPolygon(int nOfSides) double convexPolygonSumInteriorAngles(double nOfSides) { double result; - assert(nOfSides > 0); + assert(nOfSides >= 3); result = (nOfSides - 2) * M_PI; return result; } @@ -187,7 +187,7 @@ double convexPolygonSumInteriorAngles(double nOfSides) double regularPolygonInteriorAngle(int nOfSides) { double result; - assert(nOfSides > 0); + assert(nOfSides >= 3); result = convexPolygonSumInteriorAngles(nOfSides) / nOfSides; return result; } @@ -202,7 +202,7 @@ double regularPolygonInteriorAngle(int nOfSides) double convexPolygonExteriorAngle(int nOfSides) { double result; - assert(nOfSides > 0); + assert(nOfSides >= 3); result = 2 * M_PI / nOfSides; return result; } diff --git a/src/probability_distribution.h b/src/probability_distribution.h index b7e061d..ffdad07 100644 --- a/src/probability_distribution.h +++ b/src/probability_distribution.h @@ -22,7 +22,8 @@ double binominal(int trials, double successProb, int success) { double result; - assert(trials > 0 && success >= 0 && successProb >= 0 && successProb <= 1); + assert(trials > 0 && success >= 0 && success <= trials && + successProb >= 0 && successProb <= 1); result = combinationlf(trials, success) * pow(successProb, success) * pow((1 - successProb), (trials - success)); @@ -39,6 +40,7 @@ double binominal(int trials, double successProb, int success) double poisson(double lambda, unsigned x) { double result; + assert(lambda >= 0); result = exp(-lambda) * pow(lambda, x) / factoriallf(x); return result; } diff --git a/src/test/main.c b/src/test/main.c index 172e8ee..7b84bf6 100644 --- a/src/test/main.c +++ b/src/test/main.c @@ -255,6 +255,14 @@ int main() test(185, round(radians2degrees(regularPolygonInteriorAngle(6))) == 120); test(186, round(radians2degrees(convexPolygonExteriorAngle(5))) == 72); test(187, round(radians2degrees(convexPolygonExteriorAngle(6))) == 60); + test(188, nOfDiagnonalsPolygon(3) == 0); + test(189, round(radians2degrees(convexPolygonSumInteriorAngles(3))) == 180); + test(190, round(radians2degrees(regularPolygonInteriorAngle(3))) == 60); + test(191, round(radians2degrees(convexPolygonExteriorAngle(3))) == 120); + test(192, arrangement(7, 0) == 1); + test(193, arrangementlf(7, 0) == 1); + test(194, roundTo(sideTriangleLC(5, 7, degrees2radians(179)), 5) == 11.99956); + test(195, roundTo(logarithm(1000, 10), 6) == 3); puts("Passed all tests successfully!"); diff --git a/src/trigonometry.h b/src/trigonometry.h index 9a14f6a..badf8ed 100644 --- a/src/trigonometry.h +++ b/src/trigonometry.h @@ -29,7 +29,7 @@ double hypotenuse(double sideA, double sideB) double sideRightTriangle(double hypotenuse, double sideA) { double result; - assert(sideA > 0 && hypotenuse > 0); + assert(sideA > 0 && hypotenuse > sideA); result = sqrt(pow(hypotenuse, 2) - pow(sideA, 2)); return result; } @@ -45,7 +45,7 @@ double sideRightTriangle(double hypotenuse, double sideA) double sideTriangleLC(double sideA, double sideB, double oppositeAngle) { double result; - assert(sideA > 0 && sideB > 0 && oppositeAngle > 0); + assert(sideA > 0 && sideB > 0 && oppositeAngle > 0 && oppositeAngle < M_PI); result = sqrt(pow(sideA, 2) + pow(sideB, 2) - (2 * sideA * sideB * cos(oppositeAngle))); return result; } @@ -61,7 +61,8 @@ double sideTriangleLC(double sideA, double sideB, double oppositeAngle) double angleTriangleLC(double oppositeSide, double sideA, double sideB) { double result; - assert(sideA > 0 && sideB > 0 && oppositeSide > 0); + assert(sideA > 0 && sideB > 0 && oppositeSide > 0 && + oppositeSide < sideA + sideB && oppositeSide > fabs(sideA - sideB)); result = acos((pow(sideA, 2) + pow(sideB, 2) - pow(oppositeSide, 2)) / (2 * sideA * sideB)); return result; } @@ -77,7 +78,8 @@ double angleTriangleLC(double oppositeSide, double sideA, double sideB) double sideTriangleLS(double oppositeAngle, double sideA, double oppositeAngle2A) { double result; - assert(sideA > 0 && oppositeAngle > 0 && oppositeAngle2A > 0); + assert(sideA > 0 && oppositeAngle > 0 && oppositeAngle < M_PI && + oppositeAngle2A > 0 && oppositeAngle2A < M_PI); result = sideA / sin(oppositeAngle2A) * sin(oppositeAngle); return result; } @@ -93,7 +95,8 @@ double sideTriangleLS(double oppositeAngle, double sideA, double oppositeAngle2A double angleTriangleLS(double oppositeSide, double sideA, double oppositeAngle2A) { double result; - assert(oppositeSide > 0 && sideA > 0 && oppositeAngle2A > 0); + assert(oppositeSide > 0 && sideA > 0 && oppositeAngle2A > 0 && oppositeAngle2A < M_PI && + oppositeSide <= sideA / sin(oppositeAngle2A)); result = asin(oppositeSide / (sideA / sin(oppositeAngle2A))); return result; }