According to the C Standard, Section subclause 7.4 [ISO/IEC 9899:2011],
The header
<ctype.h>declares several functions useful for classifying and mapping characters. In all cases the argument is anint, the value of which shall be representable as anunsigned charor shall equal the value of the macroEOF. If the argument has any other value, the behavior is undefined.
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <ctype.h>
#include <stddef.h>
size_t count_preceding_whitespace(const char *s) {
const char *t = s;
/* possibly *t < 0 */
while (*t && isspace(*t)) {
++t;
}
return t - s;
}
|
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <ctype.h>
#include <stddef.h>
size_t count_preceding_whitespace(const char *s) {
const char *t = s;
while (*t && isspace((unsigned char)*t)) {
++t;
}
return t - s;
}
|
...
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
| CERT C Secure Coding Standard | STR34-C. Cast characters to unsigned char before converting to larger integer sizes |
| CERT C++ Secure Coding Standard | STR37-CPP. Arguments to character handling functions must be representable as an unsigned char |
| ISO/IEC TS 17961 (Draft) | Passing arguments to character-handling functions that are not representable as unsigned char [chrsgnext] |
| MITRE CWE | CWE-704, Incorrect type conversion or cast CWE-686, Function call with incorrect argument type |
Bibliography
| [ISO/IEC 9899:2011] | Section Subclause 7.4, "Character Handling <ctype.h>" |
| [Kettlewell 2002] | Section 1.1, "<ctype.h> and Characters Types" |
...