Представление ловушек для структур - PullRequest
0 голосов
/ 23 декабря 2018

Я бы хотел понять концепцию представления ловушек в деталях.Определение довольно ясно Section 3.19.4:

представление объекта, которое не обязательно должно представлять значение типа объекта

Хорошо, я хотел бы попробовать этонекоторые примеры.

struct test_t{
    uint64_t member;
};

struct test_t *test_ptr = malloc(sizeof(uint32_t));
struct test_t = *test_ptr; //1

Я не думаю, что //1 вызывает UB здесь, потому что Section 6.2.6.1:

Если хранимое значение объекта имеет такое представлениеи читается выражением lvalue, которое не имеет символьного типа, поведение не определено.

, но

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

Я думаю, что UB будет вызвано чем-то вроде

printf("Test.member = %lu\n", test.member);

Но яЯ не уверен, как доказать, что в таком случае представление member является ловушкой.

1 Ответ

0 голосов
/ 23 декабря 2018

member не имеет представлений ловушек, поскольку uint64_t не имеет представлений ловушек.

7.20.1.1 Целочисленные типы точной ширины

2 Имя определения типа uint N _t обозначает целочисленный тип без знака с шириной N и без битов заполнения.Таким образом, uint24_t обозначает такой целочисленный тип без знака с шириной ровно 24 бита.

Нет битов заполнения.И из следующего раздела мы узнаем:

6.2.6.2 Целочисленные типы

1 Для целых типов без знака, кроме unsigned char,биты представления объекта должны быть разделены на две группы: биты значения и биты заполнения (не должно быть ни одной из последних).Если имеется N битов значения, каждый бит должен представлять различную степень 2 от 1 до 2 N - 1 , так что объекты этого типа должны быть способны представлять значения от 0 до 2 N - 1 с использованием чистого двоичного представления;это должно быть известно как представление значения.Значения любых битов заполнения не определены. 53)

Где примечание 53, несмотря на то, что оно ненормативное, говорит нам, что эти биты заполнения (если они существуют) могут использоватьсяto trap:

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

Хотя биты значений никогда не могут содержать недопустимый шаблон.

Таким образом, вы не можете создать представление ловушки uint64_t в правильно сформированной программе.Имейте в виду, что ваша программа имеет UB из-за доступа за пределы, но это не вызвано возможностью представления ловушек.Все не определено само по себе.

...