Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

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