Rule A0-4-4 (required, implementation, partially automated)

Range, domain and pole errors shall be checked when using math functions.

Rationale

The C Standard defines the following types of error related to math functions specifically: domain error – input arguments are outside a domain of a mathematical function definition pole error – for finite input arguments a function gives an exact infinite result

range error – a result of a mathematical function cannot be represented by the return type limitations Domain and pole errors require that bounds are checked for input parameters before calling a mathematical function. Range errors in most cases cannot be prevented, as their occurrence mostly depend on the implementation of floating-point numbers (see A0-4-1). Checking for range errors for multi-threaded applications require that floating-point exception state is in a per-thread basis.

Example

//% $Id: A0-4-4.cpp 305588 2018-01-29 11:07:35Z michal.szczepankiewicz $ #include <cmath> #include <cfenv> float Foo(float val) { //non-compliant, domain error for negative values return std::sqrt(val); } float Bar(float val) { //non-compliant //domain error for val < 0 //pole error for val==0 return std::log(val); } // \return true, if a range error occurred bool DetectRangeErr() { return ((math_errhandling & MATH_ERREXCEPT) && (fetestexcept(FE_INEXACT | FE_OVERFLOW | FE_UNDERFLOW) != 0)); }

See also

SEI CERT C++ Coding Standard [10]: FLP32-C: Prevent or detect domain and range errors in math functions