A weird example of .toUTF16z concatination side-effects in wcsncat

BoQsc vaidas.boqsc at gmail.com
Thu Apr 7 15:02:25 UTC 2022


On Thursday, 7 April 2022 at 12:51:26 UTC, Stanislav Blinov wrote:
> On Thursday, 7 April 2022 at 10:50:35 UTC, BoQsc wrote:
>
>> 	wchar_t* clang_string         = cast(wchar_t *)"AAAAAAAAAA";
>
> You're witnessing undefined behavior. "AAAAAAAAAA" is a string 
> literal and is stored in the data segment. Mere cast to 
> wchar_t* does not make writing through that pointer legal. 
> Moreover, even if it was legal to write through it, that alone 
> wouldn't be sufficient. From documentation of `wcsncat`:
>
>> The behavior is undefined if the destination array is not 
>> large enough for the contents of both str and dest and the 
>> terminating null wide character.
>
> `wcsncat` does not allocate memory, it expects you to provide a 
> sufficiently large mutable buffer. For example, like this:
>
> ```d
>     // ...
>     auto cls = new wchar_t[256];
>     cls[] = 0;
>     cls[0..10] = 'A';
>     wchar_t* clang_string = cls.ptr;
>     // ...
> ```

That is correct, the results are satisfying. I believe this 
thread is resolved.

```
import std.stdio;

@system void main(){

	import std.utf                : toUTF16z, toUTF16;
	import core.stdc.wchar_       : wcsncat, wcslen, wprintf;
	import core.stdc.stdlib       : wchar_t;
	import core.sys.windows.winnt : LPCWSTR;


	auto cls = new wchar_t[256];
     cls[] = 0;
     cls[0..10] = 'A';
     wchar_t* clang_string = cls.ptr;

	//wchar_t*  clang_string         = cast(wchar_t *)"AAAAAAAAAA";
	wstring   dlang_string         = "BBBBBBBBBB"w; //<---- NEW, 
same results
	LPCWSTR   winpointer_to_string = "CCCCCCCCCC";
	
	wcsncat(clang_string, dlang_string.toUTF16z, 
wcslen(dlang_string.toUTF16z));
	//   String output: AAAAAAAAAABBBBBBBBBB
	
	wcsncat(clang_string, winpointer_to_string, 
wcslen(winpointer_to_string));
	//   String output: AAAAAAAAAABBBBBBBBBBCCCCCCCCCC
	// Expected string: AAAAAAAAAABBBBBBBBBBCCCCCCCCCC

	wprintf(clang_string);
	//   String output: AAAAAAAAAABBBBBBBBBBCCCCCCCCCC
	// Expected string: AAAAAAAAAABBBBBBBBBBCCCCCCCCCC

}
```


More information about the Digitalmars-d-learn mailing list