Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Инициализация неинициализированной переменной не приводит к UB?

#cpp #инициализация


Почему (1) является UB, а (2) - нет?

char x;
char y = x; // (1)

unsigned char x;
unsigned char y = x; // (2)


Информация взята отсюда
    


Ответы

Ответ 1



В настоящий момент имеется расхождение между C стандартом и C++ стандартом. В стандарте зыка C написано (6.2.6 Representations of types) 5 Certain object representations need not represent a value of the object type. If the stored value of an object has such a representation and is read by an lvalue expression that does not have character type, the behavior is undefined. If such a representation is produced by a side effect that modifies all or any part of the object by an lvalue expression that does not have character type, the behavior is undefined.50) Such a representation is called a trap representation. Так называемый символьный тип (character type) определяется в стандарте C следующим образом (6.2.5 Types): 15 The three types char, signed char, and unsigned char are collectively called the character types. The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char Интересно отметить, что в стандарте C++ нет определения термина character type, хотя этот термин используется, и под ним подразумевается аналогичное определение как обобщенное название типов char, signed char и unsigned char. Итак, в стандарте языка C говорится о неопределенном поведении, когда объект не имеет (любой) символьный тип. В стандарте C++ 2014, как я понимаю, при инициативе Страуструпа, решили уточнить в частности, и это положение о неопределенном поведении в отношении символьных типов. Там указали, что исключением является только беззнаковый символьный тип (unsigned char) 12 If no initializer is specified for an object, the object is default-initialized. When storage for an object with automatic or dynamic storage duration is obtained, the object has an indeterminate value, and if no initialization is performed for the object, that object retains an indeterminate value until that value is replaced (5.18). [Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2. — end note] If an indeterminate value is produced by an evaluation, the behavior is undefined except in the following cases: .... (12.3) - If an indeterminate value of unsigned narrow character type is produced by the evaluation of the initialization expression when initializing an object of unsigned narrow character type, that object is initialized to an indeterminate value. Я думаю, что это уточнение в стандарте C++ 2014 связано с тем, что для некоторых систем представления целочисленных значений для отдельных аппаратных архитектур для знакового символьного типа также имеется в наличии так называемое trap-представление. Например, отрицательный ноль может быть таким представлением, не допустимым для представления валидных чисел.

Комментариев нет:

Отправить комментарий