util: trim() fix for UB on pointer arithmetic

Follow-up fix on commit df4c061136

"
While it is true reversing the condition solves a single-byte read at
one before s, there is a second instance of UB.

Having a pointer to one before an object is in of itself UB in C, it's
on the side of language lawyering, but it's UB.
I add here a quote from a C standard draft:
> When an expression that has integer type is added to or subtracted
> from a pointer, the result has the type of the pointer operand.
> If both the pointer operand and the result point to elements of the
> same array object, or one past the last element of the array object,
> the evaluation shall not produce an overflow; otherwise, the
> behavior is undefined.
Taken from: http://www.iso-9899.info/n1570.html#6.5.6p8
"

Thanks Guilherme Janczak <guilherme.janczak@yandex.com>
This commit is contained in:
Hiltjo Posthuma 2021-05-06 12:18:21 +02:00
parent 68c1c4e511
commit 058547e707

7
util.c
View File

@ -60,8 +60,7 @@ static void
trim(char *s) {
char *e;
e = s + strlen(s) - 1;
while(e > s && isspace((unsigned char)*e))
e--;
*(e + 1) = '\0';
for (e = s + strlen(s); e > s && isspace((unsigned char)*(e - 1)); e--)
;
*e = '\0';
}