kopia lustrzana https://github.com/micropython/micropython
shared/libc/string0: Don't deref args for n==0 case.
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>pull/12894/head
rodzic
bea6ff82fa
commit
9be0623d4c
|
@ -110,8 +110,9 @@ char *strchr(const char *s, int c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int strncmp(const char *s1, const char *s2, size_t n) {
|
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++;
|
int c = *s1++ - *s2++;
|
||||||
|
--n;
|
||||||
if (c) {
|
if (c) {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,7 @@ int strcmp(const char *s1, const char *s2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int strncmp(const char *s1, const char *s2, size_t n) {
|
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 c1 = *s1++; // XXX UTF8 get char, next char
|
||||||
char c2 = *s2++; // XXX UTF8 get char, next char
|
char c2 = *s2++; // XXX UTF8 get char, next char
|
||||||
n--;
|
n--;
|
||||||
|
|
Ładowanie…
Reference in New Issue