CommunityToolkit / dotnet

.NET Community Toolkit is a collection of helpers and APIs that work for all .NET developers and are agnostic of any specific UI platform. The toolkit is maintained and published by Microsoft, and part of the .NET Foundation.
https://docs.microsoft.com/dotnet/communitytoolkit/?WT.mc_id=dotnet-0000-bramin
Other
3.07k stars 299 forks source link

A combination of Cast and Slice leads to AccessViolationException #674

Closed mahalex closed 1 year ago

mahalex commented 1 year ago

Describe the bug

The following code throws System.AccessViolationException:

            int height = 720;
            int width = 1280;
            byte[] storage = new byte[width * height * sizeof(int)];
            Memory2D<int> data = storage
                .AsMemory()
                .Cast<byte, int>()
                .AsMemory2D(height: height, width: width);
            Memory2D<int> slice = data.Slice(
                row: height / 2,
                column: 0,
                height: height / 2,
                width: width);
            int total = 0;
            foreach (int v in slice.Span)
            {
                total += v;
            }

Regression

No response

Steps to reproduce

Create a project targeting net7.0, paste the above code into the `Main` method, run it.

Expected behavior

The code is supposed to calculate a sum of all values in the slice (in this case, 0).

Screenshots

image

IDE and version

VS 2022

IDE version

17.4.4

Nuget packages

Nuget package version(s)

8.2.0

Additional context

The problem disappears when there's no Cast() (so, we are summing over a Span of bytes). It also disappears when there's no Slice() (so, we are summing over data instead of slice).

Help us help you

No, just wanted to report this

Sergio0694 commented 1 year ago

Good catch!! Thank you 😄

ChristophLindemann commented 1 year ago

@Sergio0694 when will this be released?

ChristophLindemann commented 1 year ago

@Sergio0694 do you have some ETA of when this will be released? I can see you added it to 8.2.1, but I could not find a planned/estimated release date for that?

It's just so I can decide if I should implement a workaround for this, or if I can wait for 8.2.1.

Sergio0694 commented 1 year ago

I don't have an exact ETA just yet, but tentatively I'd say probably around the first half of June or so? Can you use a nightly package from main in the meantime? The feed is this one: https://pkgs.dev.azure.com/dotnet/CommunityToolkit/_packaging/CommunityToolkit-MainLatest/nuget/v3/index.json

ChristophLindemann commented 1 year ago

I guess, I could use one of the nightly builds for now.

I will use 8.2.1-build.2

Thanks