On 2/22/20, Bruno Albuquerque <b...@gmail.com> wrote:
> https://play.golang.org/p/Y7ICg7t4_nd
>
> ...
>
> Unfortunately, I could not find an incantation that would remove the bound
> checks.

The code from that play.golang.org link is:

----
func NRGBA(rgbData []byte) []byte {
        nrgbaData := make([]byte, len(rgbData)+(len(rgbData)/3))

        offset := 0
        for i := 0; i < len(rgbData); i = i + 3 {
                nrgbaData[i+0+offset] = rgbData[i]
                nrgbaData[i+1+offset] = rgbData[i+1]
                nrgbaData[i+2+offset] = rgbData[i+2]
                nrgbaData[i+3+offset] = 255
                offset++
        }

        return nrgbaData
}
----

Well, the compiler cannot remove the bounds checks because that
function isn't actually bounds-safe, right? For example, if I call
that func with an rgbData slice such that len(rgbData) == 1, then:

nrgbaData is make'd with length (1 + (1/3)), which is 1.
offset is 0.
The loop over i runs 1 time (at i := 0, which satisfies i < 1).

But inside the loop, this line of code:
nrgbaData[i+1+offset] = rgbData[i+1]
is:
nrgbaData[1] = rgbData[1]
which is two bounds violations. As discussed above, both nrgbaData and
rgbData have length 1.

For the broader point, if you're trying to optimize pixel format
conversions, you might find
https://github.com/golang/exp/tree/master/shiny/driver/internal/swizzle
educational.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOeFMNWhrYxTbtOH42gQsJDjka8%2Bw6mTkx9sunTUymQtWxuZnA%40mail.gmail.com.

Reply via email to