﻿# V727\. Return value of 'wcslen' function is not multiplied by 'sizeof\(wchar\_t\)'\.

Анализатор обнаружил выражение, которое на его взгляд предназначается для вычисления размера буфера в байтах, требуемого для хранения строки\. В этом выражении допущена ошибка\.

Когда стоит задача получения размера строки типа char, стандартным решением является использование конструкции "strlen\(str\) \+ 1"\. Функция strlen\(\) вычисляет длину некой строки, а единица означает резервирование одного байта для [терминального нуля](https://pvs-studio.ru/ru/blog/terms/0088/)\. Но если речь идет о строке типа wchar\_t, char16\_t или char32\_t, то следует не забывать умножать "длину строки \+ 1" на размер одного символа, то есть на 'sizeof\(T\)'\. 

Рассмотрим несколько синтетических примеров ошибок\.

Пример N1:

```cpp
wchar_t *str = L"Test";
size_t size = wcslen(str) + 1 * sizeof(wchar_t);
```

Из\-за пропущенных скобок происходит умножение 'sizeof' на единицу, а затем сложение с функцией, вычисляющей длину строки\. Корректный код:

```cpp
size_t size = (wcslen(str) + 1) * sizeof(wchar_t);
```

Пример N2:

Выражение может быть записано и в другой последовательности, при которой сначала будет происходить умножение результата функции на 'sizeof', а затем сложение с единицей\.

```cpp
.... = malloc(sizeof(wchar_t) * wcslen(str) + 1);
```

Порой может случиться такая ситуация, когда программист в процессе написания вспомнил, что длину строки следует умножать на "sizeof\(wchar\_t\)", но по привычке добавил 1\. В результате памяти будет выделено на 1 байт меньше, чем необходимо\.

Корректные варианты кода:

```cpp
.... = malloc(wcslen(str) * sizeof(wchar_t) + 1 * sizeof(wchar_t));

.... = malloc((wcslen(str) + 1) * sizeof(wchar_t));
```