On Wednesday, 26 May 2021 at 16:35:36 UTC, Ali Çehreli wrote:
On 5/25/21 9:00 PM, Виталий Фадеев wrote:

>      immutable(char)* toStringz( ref string s )
>      {
>          if ( s.capacity <= s.length )
>              s.reserve( s.length + 1 );
>
>          char* cptr = cast( char* ) s.ptr; // C ptr
>          char* zptr = cptr + s.length;     // zero ptr
>          *zptr = '\0';

That's undefined behavior because that location does not belong to the string. Here is an example that defeats the proposed toStringz:

void main()
{
    string s;
    s = "D string";

    auto c_string = toStringz( s );

    auto other = s;
    other ~= 'X';    // <-- Seemingly unrelated operation

// ...
}

puts accesses that unrelated 'X' and more bytes after that:

  C string: D stringX1^

Ali

Yes. True.

reserve/capacity - not for all cases.

Reply via email to