170 похожих чатов

@Endill Если позволите, я хотел бы начать новый "раунд". 1. В

соответствии с http://eel.is/c++draft/basic.types#basic.compound-3.1 имеется четыре категории значений указателей. С последними двумя всё более-менее понятно (ptr == nullptr или указатель на область внутри освобождённого storage). Но вот допустим, что выражение
reinterpret_cast<T *>(reinterpret_cast<char *>(ptr) + 1)
было бы well-formed, и при этом sizeof(T) > 1 (то есть адрес не на начало объекта), или вообще взять наобум число и сделать из него указатель. Как тогда отнести такие значения к категориям? Указатель на объект, которого не существует? (http://eel.is/c++draft/basic.types#footnote-46) Значит, категория значения выбирается в соответствии с контекстом (существует ли действительно объект по такому адресу такого типа, и указывает ли указатель на него/на область за его концом), ведь иначе не было бы категории pointer past the end (такие указатели были бы pointer to an object without lifetime). Но если категория выбирается из контекста существования объекта по адресу, как можно считывать объект в виде байт (http://eel.is/c++draft/basic.lval#11)? Просто получается, что мы пытаемся считать объекты типа unsigned char (или двух других), к примеру при помощи
reinterpret_cast<unsigned char *>(&t)
, но на самом деле, в контексте, никаких unsigned char объектов не существует на данный момент, и в соответствии с http://eel.is/c++draft/basic.memobj#basic.life-6 всё очень плохо. Единственное объеснение что я нахожу, так это то, что http://eel.is/c++draft/basic.types.general#def:representation,object существует одновременно с любым объектом, которому оно соответствует, и когда мы считываем объект как unsigned char, на самом деле мы читаем его object representation. Значит можно легально взять адрес объекта, преобразовать его к unsigned char и совершить indirection к любому байту с целью read значение.
2. Перейдём к пункту http://eel.is/c++draft/basic.memobj#basic.life-6. Относительно значений, "any pointer that represents the address of the storage location where the object will be or was located", здесь подразумеваются указатели на первый байт объекта или возможно куда-то в середину объекта также? То есть имеются ли здесь ввиду указатели на байты storage, которое занимал объект, или же именно указатели, которые "point to" (http://eel.is/c++draft/basic.types#def:point). Зачем имеется возможность преобразовать эти указатели в cv-q void * и затем в cv-q unsigned char* ? Что касается сущности, какие именно это указатели: только деклараторы или expressions тоже, а что если два валидных выражения разного типа указывают на один и тот же байт памяти? Хотя, так как выражения лишь промежуточный шаг между декларатором и значением, и судя по http://eel.is/c++draft/gram.expr#:this и http://eel.is/c++draft/basic.memobj#basic.life-example-1, выражения тоже... Тогда что имеется в виду под glvalue в следующем пункте? (http://eel.is/c++draft/basic.memobj#basic.life-7) Выражения, но лишь те, что не являются указателями? Затем, допустим, в в хранилище объекта был создан новый, тогда выражения, на основе связанных со старым объектом никаким образом не могут быть использованы для доступа к новому объекту (включая, когда новый объект начинается не по тому же адресу)? И на последок. Имя массива преобразуется к указателю на первый элемент массива по определению (http://eel.is/c++draft/conv.array), а операция subscripting (http://eel.is/c++draft/expr.sub, http://eel.is/c++draft/dcl.array#example-4) также использует это преобразование. И что в этом случае? Эти определения лишь говорят, на что при использовании таких выражений в обычном случае мы обратимся к объекту, который является элементом массива? UB из-за обращения к умершим элементам массива? Или же, так как массив не умирает, то и не умирает его object representation, и subscription через имя массива приводит к считыванию его object representation?
А вообще, я бы не отказался почитать статьи, если у вас какие есть на примете.

1 ответов

7 просмотров

1. 1) в том же пункте под списком категорий значение указателя описывается как, выражаясь кратко, соответствующее первому байту объекта. о поведении программ с другими значениями указателей стандарт ничего не говорит — undefined behavior во всей красе. 2) unsigned char объекты на месте «большого» объекта вполне себе существуют согласно basic.types.general#4 3) я считаю, что поведение такого кода описано в expr.reinterpret.cast#7, expr.static.cast#13, expr.add#4.2, expr.unary.op#1, basic.lval#11 и basic.types.general#4 2. 1) напомню, что этот пункт не релевантен для того вашего примера, где буфер предоставляет storage для другого объекта 2) адрес объекта это адрес первого байта, если коротко. подробности в intro.object-9 3) что касается преобразования в void и дальше, это, наверное, нужно для переиспользования storage посредством имеющегося указателя на объект, который там был, в том числе частями 4) указатели это полноценные объекты — они и имеются в виду в basic.life#6. ваши рассуждения про деклараторы мне совсем не понятны 5) в basic.life#7 речь о glvalue, которые можно «получить», например, разыменовав указатель из пункта 6 6) «переиспользовать» выражения можно только если удовлетворены критерии transparently replaceable, чему посвящен пункт 8 7) array-to-pointer преобразование (decay) происходит не по определению, а лишь там, где оно разрешено или не запрещено. например, оно не применяется к аргументам sizeof. но это так, к слову ход мысли дальше не улавливаю, но то, что там написано, кажется, пересекается со сказанным мной выше и пожалуйста, выделяйте в таких простынях пункты, чтобы было легче обозначать, на что я отвечаю

Похожие вопросы

Обсуждают сегодня

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
31
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Где можно найти примеры эффективного "асинхронного" tcp сервера на C? Я видел select, kqueue, poll, epoll и т.д. Ввод-вывод неблокирующий, но обработка клиентов блокирующая
#
10
Книга Юрова В.И пойдёт для обучения?
Botsman
24
Всем доброго дня, ребят подскажите пожалуйста, если в курсе по ассемблеру используется MASM32, могу ли я использовать FASM? В чем явная разница и будет ли у меня все работать?
Botsman
17
Hi Everyone! To all Are you Looking for Interview Support at the Lowest Price? Look no further! Then contact us 👉We offer Interview Support :-for a low cost variety of tech...
Rambabu Nallamilli
3
Hello experts, Could someone kindly tell me how to run vacuum inside a plpgsql function? If you have any link please share. Thank you
Amol Palav
10
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
7
Карта сайта