Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C.
Массивы в качестве временных объектов не должны конвертироваться в указатель. Это связано с тем, что временные объекты существуют только на время выполнения полного выражения и уничтожаются сразу после его завершения.
Массив может быть членом структуры или объединения и, следовательно, быть частью любого выражения (value expression). Поскольку при использовании массива в выражении он всегда конвертируется в указатель, в C есть возможность сформировать такой указатель на массив, который является подобъектом временного объекта. Модификация элементов временного массива, а также доступ к ним после окончания времени жизни ведёт к неопределённому поведению.
Рассмотрим пример кода:
struct S
{
int arr[10];
};
struct S getS(void);
void foo(int const *p);
void bar()
{
p = getS().arr; // <=
foo(getS().arr); // <=
int j = getS().arr[3];
getS().arr[3] = j; // <=
}
Структура S
в качестве поля содержит массив arr
из 10 элементов. Анализатор выдаст предупреждение при попытке получить доступ к этому массиву через временный объект.
Для исправления нужно объявить объект с нормальным временем жизни:
struct S
{
int arr[10];
};
struct S s;
struct S getS(void);
void foo(int const* p);
void global_object()
{
int* p = s.arr;
s.arr[0] = 1;
p[1] = 1;
foo(s.arr);
}
void local_object()
{
struct S obj = getS();
int* p = obj.arr;
obj.arr[0] = 1;
p[1] = 1;
foo(obj.arr);
}