Skip to content

Convert char to unsigned before calling ctype.h functions#1

Open
fghzxm wants to merge 1 commit intotusharjois:masterfrom
fghzxm:ctype
Open

Convert char to unsigned before calling ctype.h functions#1
fghzxm wants to merge 1 commit intotusharjois:masterfrom
fghzxm:ctype

Conversation

@fghzxm
Copy link

@fghzxm fghzxm commented Oct 24, 2023

the isspace and isdigit functions, like many other functions from ctype.h, actually take an int as the parameter, and are specified to have undefined behavior when the parameter is not in the range (-1)-255. Because it is implementation-defined whether char is signed or unsigned (and on most compilers targeting x86 it is actually signed), if a char in the range 128-254 (say, because the format string is encoded in a superset of ASCII, including UTF-8) is passed to those functions, it could be sign-extended to (-128)-(-2) and cause undefined behavior.

This patch adds manually conversion from char to unsigned char before passing them to ctype.h functions; since unsigned char-to-int conversion is zero-extension, this avoids said undefined behavior.

the `isspace` and `isdigit` functions, like many other functions from
ctype.h, actually take an `int` as the parameter, and are specified to
have undefined behavior when the parameter is not in the range (-1)-255.
Because it is implementation-defined whether `char` is signed or
unsigned (and on most compilers targeting x86 it is actually signed), if
a `char` in the range 128-254 (say, because the format string is encoded
in a superset of ASCII, including UTF-8) is passed to those functions,
it could be sign-extended to (-128)-(-2) and cause undefined behavior.

This patch adds manually conversion from `char` to `unsigned char`
before passing them to ctype.h functions; since `unsigned char`-to-`int`
conversion is zero-extension, this avoids said undefined behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant