Данное диагностическое правило основано на руководстве 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); }
Данная диагностика классифицируется как:
|