Анализатор обнаружил потенциально возможную ошибку, связанную с хранением указателя на локальный массив. Предупреждение выдается в том случае, если время жизни массива меньше, чем время жизни указателя на него.
Первый пример:
class MyClass1 { int *m_p; void Foo() { int localArray[33]; ... m_p = localArray; } };
Массив localArray создается в стеке и массив localArray перестанет существовать по завершению функции Foo(). Однако указатель на этот массив будет сохранен в переменной m_p и может по неаккуратности использоваться, что приведет к ошибке.
Второй пример:
struct CVariable { ... char name[64]; }; void CRendererContext::RiGeometryV(int n, char *tokens[]) { for (i=0;i<n;i++) { CVariable var; if (parseVariable(&var, NULL, tokens[i])) { tokens[i] = var.name; } }
В этом примере указатель на массив, находящийся в переменной типа CVariable, сохраняется во внешнем массиве. В результате массив "tokens" после завершения функции RiGeometryV будет содержать указатели на уже несуществующие объекты.
Предупреждение V507 не всегда свидетельствует о наличии ошибки. Приведем сокращенный фрагмент кода, который анализатор считает опасным, но на самом деле этот код корректен:
png_infop info_ptr = png_create_info_struct(png_ptr); ... BYTE trans[256]; info_ptr->trans = trans; ... png_destroy_write_struct(&png_ptr, &info_ptr);
В данном коде время жизни объекта info_ptr совпадает с временем жизни trans. Объект создается внутри png_create_info_struct (), а уничтожается внутри png_destroy_write_struct(). Анализатор не может разобрать данный случай и предполагает, что объект png_ptr поступает извне. Пример кода, где анализатор был бы прав:
void Foo() { png_infop info_ptr; info_ptr = GetExternInfoPng(); BYTE trans[256]; info_ptr->trans = trans; }
Это сообщение подобно сообщению V506.
Данная диагностика классифицируется как:
|
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V507. |