Skip to main content

IAR Embedded Workbench for RX 5.20

CERT-ARR38-C_e

In this section:
Synopsis

Guarantee that library functions do not form invalid pointers.

Enabled by default

Yes

Severity/Certainty

High/High

highhigh.png
Full description

C library functions that make changes to arrays or objects take at least two arguments: a pointer to the array or object and an integer indicating the number of elements or bytes to be manipulated. Supplying arguments to such a function might cause the function to form a pointer that does not point into or just past the end of the object, resulting in undefined behavior.

Coding standards
CERT ARR38-C

Guarantee that library functions do not form invalid pointers

CWE 121

Stack-based Buffer Overflow

CWE 119

Improper Restriction of Operations within the Bounds of a Memory Buffer

CWE 125

Out-of-bounds Read

CWE 123

Write-what-where Condition

CWE 805

Buffer Access with Incorrect Length Value

CWE 129

Improper Validation of Array Index

Code examples

The following code example fails the check and will give a warning:

#include <stdint.h>
#include <stdio.h>

struct obj {
    char c;
    long long i;
};

void func(FILE *f, struct obj *objs, size_t num_objs) {
    const size_t obj_size = 16;
    if (num_objs > (SIZE_MAX / obj_size) ||
        num_objs != fwrite(objs, obj_size, num_objs, f)) {
        /* Handle error */
    }
}

The following code example passes the check and will not give a warning about this issue:

#include <stdint.h>
#include <stdio.h>

struct obj {
    char c;
    long long i;
};

void func(FILE *f, struct obj *objs, size_t num_objs) {
    const size_t obj_size = sizeof *objs;
    if (num_objs > (SIZE_MAX / obj_size) ||
        num_objs != fwrite(objs, obj_size, num_objs, f)) {
        /* Handle error */
    }
}