V1060. Passing 'BSTR ' to the 'SysAllocString' function may lead to incorrect object creation.
The analyzer has detected the passing of a string of type 'BSTR' to the 'SysAllocString' function.
BSTR FirstBstr = ....;
BSTR SecondBstr = SysAllocString(FirstBstr);
Copying a 'BSTR' string by passing it to the 'SysAllocString' function may result in a logic error.
BSTR (basic string or binary string) is a string data type that is used by COM, Automation, and Interop functions. BSTR is represented in the following way:
- Length prefix. A four-byte integer that contains the number of bytes in the following data string. It appears immediately before the first character of the data string and does not include the terminator.
- Data string. A string of Unicode characters. May contain multiple embedded null characters.
- Terminator. Two null characters.
A BSTR is a pointer that points to the first character of the string, not to the length prefix.
The 'SysAllocString' function handles 'BSTR' strings in the same way as it does regular wide C strings. It means that if the string contains multiple embedded null characters, 'SysAllocString' will return a truncated string. To avoid unexpected behavior, rewrite the code using wrapper classes over 'BSTR' such as 'CComBSTR' or '_bstr_t'.
For example, you can use the following pattern to correctly copy one 'BSTR' string to another:
CComBstr firstBstr(L"I am a happy BSTR.");
BSTR secoundBstr = firstBstr.Copy();
This is another way to do it:
_bstr_t firstBstr(L"I am a happy BSTR too.");
BSTR secoundBstr = firstBstr.copy();