|
public static NativeString<T> operator +(NativeString<T> input, string newstr) |
|
{ |
|
NativeString<T> ret = new(input, newstr.Length); |
|
|
|
byte[] data = GetBytes(newstr); |
|
WriteTo(((IntPtr)ret) + GetLengthFromPtr(input), data, ret.allocated); |
Yep, WriteTo() actually writes beyond allocated region if WCharPtr or TCharPtr (when Unicode=true)
this ultimately leads to such consequences:
either ok, or:
The active test run was aborted. Reason: Test host process crashed
or:
Error Message:
Assert.Equal() Failure: Strings differ
Expected: "Рад знакомству 🤝 どうぞよろしく"
Actual: null
https://ci.appveyor.com/project/3Fs/dllexport-ix27o/builds/50882366#L297
and so on.
Test can be found here:
https://github.com/3F/DllExport/blob/9db4bf0ba6793523d12eb0a1680c0cd962283f19/src/DllExport/UnitedTest/NetfxAssetBasicTest.cs#L36
But I also forgot about the new disposing (that's another, actually even more interesting story*)
l.callme<TCharPtr>(ns + " and You 👋", nstruct);
*because this part must be fully reviewed since this creates non-obvious allocation which will lead to memory leaks
Conari/Conari/Types/NativeString.cs
Lines 91 to 96 in ba1a82e
Yep,
WriteTo()actually writes beyond allocated region if WCharPtr or TCharPtr (when Unicode=true)this ultimately leads to such consequences:
either ok, or:
or:
https://ci.appveyor.com/project/3Fs/dllexport-ix27o/builds/50882366#L297
and so on.
Test can be found here:
https://github.com/3F/DllExport/blob/9db4bf0ba6793523d12eb0a1680c0cd962283f19/src/DllExport/UnitedTest/NetfxAssetBasicTest.cs#L36
But I also forgot about the new disposing (that's another, actually even more interesting story*)
*because this part must be fully reviewed since this creates non-obvious allocation which will lead to memory leaks