Skip to content

Incorrect NativeString<T> operator + implementation for 2-byte type characters #22

@3F

Description

@3F

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions