Accessing object with temporary lifetime

Операции чтения или операции записи на объекте являются неопределенным поведением

Описание

Этот дефект происходит, когда вы пытаетесь читать из или записать в объект с временным временем жизни, которое возвращено вызовом функции. В структуре или объединении, возвращенном функцией, и содержащий массив, члены массивов являются временными объектами. Время жизни концов временных объектов:

  • Когда полное выражение или полный оператор объявления, содержащий концы вызова, как задано в Стандарте C11.

  • После следующей точки последовательности, как задано в C90 и Стандартах C99. Точка последовательности является точкой в осуществлении программы, где все предыдущие оценки завершены, и никакая последующая оценка еще не запустилась.

Для Кода С++ объект Accessing с временным временем жизни повышает дефект только, когда вы пишете в объект с временным временем жизни.

Если временный пожизненный объект возвращен адресом, никакой дефект не повышен.

Риск

Изменение объектов с временным временем жизни является неопределенным поведением и может вызвать аварийное завершение программы и проблемы мобильности.

Фиксация

Присвойте объект, возвращенный от вызова функции до локальной переменной. Содержимое временного пожизненного объекта копируется в переменную. Можно теперь изменить его безопасно.

Примеры

развернуть все

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>

#define SIZE6 6

struct S_Array
{
    int t;
    int a[SIZE6];
};

struct S_Array func_temp(void);

/* func_temp() returns a struct value containing
* an array with a temporary lifetime.
*/
int func(void) {
 
/*Writing to temporary lifetime object is
 undefined behavior
 */
    return ++(func_temp().a[0]); 
}

void main(void) {
    (void)func();
}

В этом примере, func_temp() возвращает значением структуру с членом массивов a. У этого члена есть временное время жизни. Постепенное увеличение его является неопределенным поведением.

Коррекция — присвоение возвращенное значение к локальной переменной перед записью

Одна возможная коррекция должна присвоить возврат вызова func_temp() к локальной переменной. Содержимое временного объекта a копируется в переменную, которую можно безопасно постепенно увеличить.

 #include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>

#define SIZE6 6

struct S_Array
{
    int t;
    int a[SIZE6];
};

struct S_Array func_temp(void);

int func(void) {

/* Assign object returned by function call to 
 *local variable
 */
    struct S_Array s = func_temp(); 

/* Local variable can safely be
 *incremented
 */
    ++(s.a[0]);                                           
    return s.a[0];
}

void main(void) {
    (void)func();
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: TEMP_OBJECT_ACCESS
Удар: низко
ID CWE: 825
Введенный в R2018a