Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
GBP
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
V512. A call of the 'Foo' function will…
Сообщения PVS-Studio
Диагностики общего назначения (General Analysis, C++)
Диагностики общего назначения (General Analysis, C#)
Диагностики общего назначения (General Analysis, Java)
Диагностика микро-оптимизаций (C++)
Диагностика 64-битных ошибок (Viva64, C++)
Cтандарт MISRA
Стандарт AUTOSAR
Дополнительная информация
Оглавление

V512. A call of the 'Foo' function will lead to a buffer overflow or underflow.

2 апреля 2013 г.

Анализатор обнаружил потенциально возможную ошибку, связанную с заполнением, копированием или сравнением буферов памяти. Ошибка может приводить к переполнению буфера (buffer overflow) или, наоборот, к его неполной обработке (buffer underflow).

Это достаточно распространенный вид ошибки, возникающий из-за опечаток или невнимательности. Неприятность подобных ошибок заключается в том, что программа долгое время может работать стабильно. Из-за удачного стечения обстоятельств в неинициализированной памяти могут находиться приемлемые значения. Область перезаписываемой памяти может не использоваться.

Приведем два примера, взятых из реальных приложений.

Пример N1.

MD5Context *ctx;
...
memset(ctx, 0, sizeof(ctx));

Здесь из-за опечатки нулями заполняется не вся структура, а только её часть. Ошибка в том, что вычисляется размер указателя, а не структуры MD5Context. Корректный вариант кода:

MD5Context *ctx;
...
memset(ctx, 0, sizeof(*ctx));

Пример N2.

#define CONT_MAP_MAX 50
int _iContMap[CONT_MAP_MAX];
memset(_iContMap, -1, CONT_MAP_MAX);

В данном примере также неверно указан размер заполняемого буфера. Корректный вариант:

#define CONT_MAP_MAX 50
int _iContMap[CONT_MAP_MAX];
memset(_iContMap, -1, CONT_MAP_MAX * sizeof(int));

Пример N3.

struct MyTime
{
  ....
  int time;
};
MyTime s;
time((time_t*)&s.time);

В данном примере также неверно указан тип 's.time'. В случае, когда используется 64-битный time_t, произойдёт переполнение. Корректный вариант:

struct MyTime
{
  ....
  time_t time;
};
MyTime s;
time(&s.time);

Примечание касательно функции strncpy.

Некоторых программистов удивляет, что анализатор выдает предупреждение V512 на подобный код:

char buf[5];
strncpy(buf, "X", 100);

На первый взгляд может показаться, что функция должна скопировать только 2 байта (символ 'X' и терминальный ноль). Но на самом деле, здесь действительно произойдет выход за пределы массива. Здесь забыто одно свойство функции 'strncpy'. Цитата из описания этой функции на сайте MSDN: If count is greater than the length of strSource, the destination string is padded with null characters up to length count.

Примечание касательно ложных срабатываний.

Так сложилось, что для некоторых проектов, анализатор выдает много ложных срабатываний, предупреждая об использовании, только части массива (buffer underflow). А иногда наоборот, все предупреждения о переполнении буфера являются ложными. В этом случае, вы можете воспользоваться тонкой настройкой диагностического правила.

Для этого можно вписать где-то в текст программы следующие комментарии:

//-V512_UNDERFLOW_OFF
//-V512_OVERFLOW_OFF

Первый комментарий отключает предупреждения в данной единице трансляции о неполном использовании массива, а второй о переполнении. Если написать оба комментария, то это будет аналогично полному отключению диагностического правила V512.

Эти комментарии следует вписать в заголовочный файл, который включается во все другие файлы. Например, таким файлом может быть "stdafx.h". Если вписать этот комментарий в "*.cpp" файл, то он будет действовать только для этого файла.

Работа с неизвестными значениями аргументов для форматных строк

Иногда анализатор при работе с форматной строкой может не знать точное значение аргумента – к примеру, когда он пришел из параметра функции:

void foo(int someVar)
{
  char buf[2];
  sprintf(buf, "%d", someVar);
  ....
}

По умолчанию здесь предупреждение выдаваться не будет. Чтобы включить его выдачу, добавьте следующий комментарий:

//V_512_WARN_ON_UNKNOWN_FORMAT_ARGS

В этом случае для работы анализатор будет использовать диапазон значений из типа аргумента.

Данная диагностика классифицируется как:

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V512.

Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять