str: drop argument checks no caller can trip

sinit's nil and negative-length tests and stoutf's zero-size test only
had test callers; every real caller passes a buffer and its size. The
len > n check after fullrune succeeded could never fire.
This commit is contained in:
2026-08-16 18:36:40 +09:00
parent 723a271a9c
commit 0aef3506b6
2 changed files with 4 additions and 20 deletions

15
str.c
View File

@@ -1,6 +1,7 @@
#include "dat.h" #include "dat.h"
#include "fn.h" #include "fn.h"
/* Fills s from n bytes of UTF-8; whole, valid, and at most Maxrunes. */
int int
sinit(Str *s, char *src, int n) sinit(Str *s, char *src, int n)
{ {
@@ -8,19 +9,12 @@ sinit(Str *s, char *src, int n)
Rune r; Rune r;
int len; int len;
if(s == nil)
return 0;
s->n = 0; s->n = 0;
if(n < 0 || (n > 0 && src == nil))
return 0;
while(n > 0){ while(n > 0){
if(tmp.n >= Maxrunes) if(tmp.n >= Maxrunes || !fullrune(src, n))
return 0;
if(!fullrune(src, n))
return 0; return 0;
len = chartorune(&r, src); len = chartorune(&r, src);
if(len > n || (r == Runeerror && len == 1) || if((r == Runeerror && len == 1) || (r >= 0xd800 && r <= 0xdfff))
(r >= 0xd800 && r <= 0xdfff))
return 0; return 0;
tmp.r[tmp.n++] = r; tmp.r[tmp.n++] = r;
src += len; src += len;
@@ -75,14 +69,13 @@ scmp(Str *a, Str *b)
return 0; return 0;
} }
/* UTF-8 of s into buf[sz], NUL-terminated, whole runes only. */
int int
stoutf(Str *s, char *buf, int sz) stoutf(Str *s, char *buf, int sz)
{ {
char tmp[UTFmax]; char tmp[UTFmax];
int i, n, len; int i, n, len;
if(sz <= 0)
return 0;
n = 0; n = 0;
for(i = 0; i < s->n; i++){ for(i = 0; i < s->n; i++){
len = runetochar(tmp, &s->r[i]); len = runetochar(tmp, &s->r[i]);

View File

@@ -76,7 +76,6 @@ str_utf8_capacity(struct ct *t)
int n; int n;
char *want; char *want;
} cases[] = { } cases[] = {
{ 0, 0, nil },
{ 1, 0, "" }, { 1, 0, "" },
{ 2, 1, "a" }, { 2, 1, "a" },
{ 3, 1, "a" }, { 3, 1, "a" },
@@ -95,10 +94,6 @@ str_utf8_capacity(struct ct *t)
if(n != cases[i].n) if(n != cases[i].n)
CT_ERRORF(t, "size %d: want length %d, got %d", CT_ERRORF(t, "size %d: want length %d, got %d",
cases[i].size, cases[i].n, n); cases[i].size, cases[i].n, n);
if(cases[i].size == 0){
CT_EQ_INT(t, 'Z', buf[0]);
continue;
}
if(strcmp(cases[i].want, buf) != 0) if(strcmp(cases[i].want, buf) != 0)
CT_ERRORF(t, "size %d: want \"%s\", got \"%s\"", CT_ERRORF(t, "size %d: want \"%s\", got \"%s\"",
cases[i].size, cases[i].want, buf); cases[i].size, cases[i].want, buf);
@@ -120,10 +115,6 @@ str_invalid_and_full_appends(struct ct *t)
Str s; Str s;
int i; int i;
CT_CHECK(t, !sinit(&s, nil, 1));
CT_EQ_INT(t, 0, s.n);
CT_CHECK(t, !sinit(&s, "x", -1));
CT_EQ_INT(t, 0, s.n);
for(i = 0; i < Maxrunes; i++) for(i = 0; i < Maxrunes; i++)
s.r[i] = 'a'; s.r[i] = 'a';
s.n = Maxrunes; s.n = Maxrunes;