git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: undefined behavior in builtin/am.c

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Jul 1, 2022, 17:54 UTC
Message-ID
<d717324b-d7dc-fc5c-7bd7-2b74c4dfb644@gmail.com>
In-Reply-To
<130c3636-b978-1600-df53-6a38c3414a88@gmx.de>
Hi Roland
On 01/07/2022 18:03, Roland Illig wrote:
Show 14 quoted lines
> Hi,
> 
> builtin/am.c says:
>  > static int str_isspace(const char *str)
>  > {
>  >     for (; *str; str++)
>  >         if (!isspace(*str))
>  >             return 0;
>  >
>  >     return 1;
>  > }
> 
> The macro 'isspace' must only be called with an integer representable as
> an 'unsigned char', or with the value of the macro EOF.

Thanks for reporting this. Git uses its own version of isspace() (see git-compat-util.h & ctype.c) which does not suffer from this limitation as it casts its argument to an unsigned char.

Best Wishes
Phillip
Show 12 quoted lines
> On platforms where plain 'char' is a signed integer type, any character
> whose value is negative invokes undefined behavior (except for the one
> character that by coincidence has the same value as the macro EOF).
> 
> To fix this, write '!isspace((unsigned char)*str)' instead.
> 
> I have no idea how to trigger this part of the code but for someone who
> knows this part of Git, it should be easy. Depending on the platform,
> this kind of error may be silently ignored or crash the program, as
> always with undefined behavior.
> 
> Roland
Previous: Roland Illig
Message 4 of 4 in “undefined behavior in builtin/am.c”
  1. Roland IlligJul 1, 2022
  2. Jeff KingJul 1, 2022
  3. Roland IlligJul 1, 2022
  4. Phillip WoodJul 1, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.