diff options
Diffstat (limited to 'src/strings')
| -rw-r--r-- | src/strings/builder.go | 6 | ||||
| -rw-r--r-- | src/strings/builder_test.go | 13 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/strings/builder.go b/src/strings/builder.go index 189dadb1e7..7c9b686241 100644 --- a/src/strings/builder.go +++ b/src/strings/builder.go @@ -15,7 +15,11 @@ import ( // Do not copy a non-zero Builder. type Builder struct { addr *Builder // of receiver, to detect copies by value - buf []byte + + // External users should never get direct access to this buffer, since + // the slice at some point will be converted to a string using unsafe, also + // data between len(buf) and cap(buf) might be uninitialized. + buf []byte } // noescape hides a pointer from escape analysis. It is the identity function diff --git a/src/strings/builder_test.go b/src/strings/builder_test.go index c3c627ee7d..36fd7a77e3 100644 --- a/src/strings/builder_test.go +++ b/src/strings/builder_test.go @@ -385,3 +385,16 @@ func BenchmarkBuildString_ByteBuffer(b *testing.B) { } }) } + +func TestBuilderGrowSizeclasses(t *testing.T) { + s := Repeat("a", 19) + allocs := testing.AllocsPerRun(100, func() { + var b Builder + b.Grow(18) + b.WriteString(s) + _ = b.String() + }) + if allocs > 1 { + t.Fatalf("unexpected amount of allocations: %v, want: 1", allocs) + } +} |
