@@ -162,7 +162,7 @@ namespace utf8
162
162
LPUTF8 EncodeFull (char16 ch, __out_ecount (3 ) LPUTF8 ptr);
163
163
164
164
// Encode a surrogate pair into a utf8 sequence
165
- LPUTF8 EncodeSurrogatePair (char16 surrogateHigh, char16 surrogateLow, __out_ecount (3 ) LPUTF8 ptr);
165
+ LPUTF8 EncodeSurrogatePair (char16 surrogateHigh, char16 surrogateLow, __out_ecount (4 ) LPUTF8 ptr);
166
166
167
167
// Encode ch into a UTF8 sequence ignoring surrogate pairs (which are encoded as two
168
168
// separate code points).
@@ -177,7 +177,7 @@ namespace utf8
177
177
}
178
178
179
179
// Encode ch into a UTF8 sequence while being aware of surrogate pairs.
180
- inline LPUTF8 EncodeTrueUtf8 (char16 ch, const char16** source, charcount_t * cch, __out_ecount (3 ) LPUTF8 ptr)
180
+ inline LPUTF8 EncodeTrueUtf8 (char16 ch, const char16** source, charcount_t * cch, __out_ecount ((*cch + 1 ) * 3 ) LPUTF8 ptr)
181
181
{
182
182
if (ch < 0x80 )
183
183
{
@@ -201,11 +201,16 @@ namespace utf8
201
201
if ((surrogateHigh >= 0xD800 && surrogateHigh <= 0xDBFF ) &&
202
202
(surrogateLow >= 0xDC00 && surrogateLow <= 0xDFFF ))
203
203
{
204
+ LPUTF8 retptr = EncodeSurrogatePair (surrogateHigh, surrogateLow, ptr);
205
+
206
+ // SAL analysis gets confused if we call EncodeSurrogatePair after
207
+ // modifying cch
208
+
204
209
// Consume the low surrogate
205
210
*source = *source + 1 ;
206
211
*cch = *cch - 1 ;
207
212
208
- return EncodeSurrogatePair (surrogateHigh, surrogateLow, ptr) ;
213
+ return retptr ;
209
214
}
210
215
}
211
216
0 commit comments