-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Closed
Labels
Description
From https://github.com/dotnet/coreclr/issues/3143
To mark a function to be only be able to be called in an unsafe block.
It came up as an issue with having an IntPtr based api for Vector.Copy be equally could apply to something like a .ctor where you are passing an internal buffer to use (e.g. https://github.com/dotnet/coreclr/issues/3142)
Or risk of use of buffers with overlapped I/O tasks and dispose dotnet/corefx#5954 (comment)
To indicate that the caller is aware there are risks and to be careful. What I am suggesting is something where .ctor 2 is forced to be unsafe in the same way .ctor 3 is:
public BufferedThing(int bufferSize){}
[CallerMustBeUnsafe]
public BufferedThing(byte[] internalBuffer){}
public BufferedThing(byte* internalBuffer, int bufferLength){}e.g.
var buffer0 = new BufferedThing(10); // fine
var buffer1 = new BufferedThing(new byte[10]); // compile error
unsafe {
var buffer2 = new BufferedThing(new byte[10]); // fine
}
unsafe {
var buffer = new byte[10];
fixed (byte* pBuffer = &buffer[0]) {
var buffer3 = new BufferedThing(pBuffer, 10); // fine
}
}