Main Content

MISRA C:2023 Rule 21.13

Any value passed to a function in <ctype.h> shall be representable as an unsigned char or be the value EOF

Since R2024a

Description

Rule Definition

Any value passed to a function in <ctype.h> shall be representable as an unsigned char or be the value EOF.

This rule comes from MISRA C™: 2012 Amendment 1.

Rationale

Functions in <ctype.h> have a well-defined behavior only for int arguments whose value is within the range of unsigned char or the negative value equivalent of EOF. The use of other values results in undefined behavior.

Polyspace Implementation

Polyspace® considers that the negative value equivalent of EOF is -1 and does not raise a violation if you pass -1 as argument to a function in ctype.h.

Troubleshooting

If you expect a rule violation but do not see it, refer to Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

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

bool f(uint8_t a)
{
    return (isdigit((int32_t) a)           /* Compliant     */
            &&  isalpha((int32_t) 'b')      /* Compliant     */
            &&  islower(EOF)                /* Compliant     */
            &&  isalpha(256));              /* Non-compliant */
}

In this example, the rule is violated when 256, which is an neither an unsigned char or the value EOF, is passed as an input argument to the isalpha function.

Note

The int casts in the above example are required to comply with Rule 10.3.

Check Information

Group: Standard libraries
Category: Mandatory
AGC Category: Mandatory

Version History

Introduced in R2024a