Skip to content

Commit

Permalink
shared/libc/string0: Don't deref args for n==0 case.
Browse files Browse the repository at this point in the history
C99 says that strncmp has UB for either string being NULL, so the
current behavior is technically correct, but it's an easy fix to handle
this case correctly.

7.1.4: "unless explicitly stated otherwise in the detailed
description... if an argument to a function has ...null pointer.. the
behavior is undefined".

7.21.1: "Unless explicitly stated otherwise in the description of a
particular function in this subclause, pointer arguments on such a call
shall still have valid values, as described in 7.1.4".

Also make the same change for the minimal version in bare-arm/lib.c.

This work was funded through GitHub Sponsors.

Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
  • Loading branch information
jimmo authored and dpgeorge committed Nov 7, 2023
1 parent bea6ff8 commit 9be0623
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 2 deletions.
3 changes: 2 additions & 1 deletion ports/bare-arm/lib.c
Expand Up @@ -110,8 +110,9 @@ char *strchr(const char *s, int c) {
}

int strncmp(const char *s1, const char *s2, size_t n) {
while (*s1 && *s2 && n-- > 0) {
while (n > 0 && *s1 && *s2) {
int c = *s1++ - *s2++;
--n;
if (c) {
return c;
}
Expand Down
2 changes: 1 addition & 1 deletion shared/libc/string0.c
Expand Up @@ -154,7 +154,7 @@ int strcmp(const char *s1, const char *s2) {
}

int strncmp(const char *s1, const char *s2, size_t n) {
while (*s1 && *s2 && n > 0) {
while (n > 0 && *s1 && *s2) {
char c1 = *s1++; // XXX UTF8 get char, next char
char c2 = *s2++; // XXX UTF8 get char, next char
n--;
Expand Down

0 comments on commit 9be0623

Please sign in to comment.