Exact equality comparison against a floating-point literal

ID

c.correctness.float_equality

Severity

low

Remediation Complexity

medium

Remediation Risk

medium

Remediation Effort

low

Resource

Numeric

Language

C / C++

Description

This uses == or != to compare against a floating-point literal. Floating-point values are approximations, so exact equality rarely holds after arithmetic and gives surprising results. Compare against a tolerance instead, e.g. fabs(x - expected) < epsilon.

Rationale

This uses == or != to compare against a floating-point literal. Floating-point values are approximations, so exact equality rarely holds after arithmetic and gives surprising results. Compare against a tolerance instead, e.g. fabs(x - expected) < epsilon.

The following code illustrates the pattern detected by this rule:

void check(double d, float f) {
    // FLAGGED: Exact equality comparison against a floating-point literal
    if (d == 1.0) {
        printf("one\n");
    }
    // FLAGGED: Exact equality comparison against a floating-point literal
    if (3.14 == d) {
        printf("pi\n");
    }
    // FLAGGED: Exact equality comparison against a floating-point literal
    if (f != 0.5f) {
        printf("not half\n");
    }
}

Remediation

Follow secure coding practices and review the references below for detailed remediation guidance.

Configuration

This detector does not need any configuration.