powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / virtual methods
25 сообщений из 356, страница 7 из 15
virtual methods
    #39652880
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_deva guestпропущено...
Не понимаю, к чему это.К тому, что некоторые из присутствующих считают это
Код: plaintext
1.
(size_t)&(((stype *)0)->member)

самостоятельной частью выражения, которое таковым, на самом деле, не является, а всё выражение будет оценено как взятие адреса с приведением к size_t. И никакого доступа, приводящего к UB от слова "совсем"!Т.е. UB может возникать только в полных выражениях, а в подвыражениях UB не бывает?
...
Рейтинг: 0 / 0
virtual methods
    #39652884
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovЯ повторю, что? насколько мне известно, placement new вообще ничего не делает с переданным ему буфером.А зачем он нужен, если ничего не делает? Можно не вызвать его тогда...
Basil A. SidorovПоэтому ответ на ваш вопрос зависит от того, что происходит с буфером, а это, в любом случае, происходит вне placement new.Я рассчитывал на код, который создаёт массив из трёх элементов поверх массива из двух, при этом первые 2 элемента будут содержать те же значение, что и первые 2 элемента старого массива. И это без копирования (иначе откуда возьмётся amortized constant, если мы будем всё копировать?).
Было бы забавно увидеть попытки написать такой код.
...
Рейтинг: 0 / 0
virtual methods
    #39652886
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestА зачем он нужен, если ничего не делает?Вроде, должно быть очевидно, что placement new позволяет превратить указатель на массив байт в типированный указатель.
Цена вопроса - внешнее управление существованием буфера и ручная работа с конструкторами и деструкторами типа.
...
Рейтинг: 0 / 0
virtual methods
    #39652887
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovВроде, должно быть очевидно, что placement new позволяет превратить указатель на массив байт в типированный указатель.Чем он тогда отличается от каста?
...
Рейтинг: 0 / 0
virtual methods
    #39652889
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestсамостоятельной частью выражения, которое таковым, на самом деле, не является, а всё выражение будет оценено как взятие адреса с приведением к size_t. И никакого доступа, приводящего к UB от слова "совсем"!Т.е. UB может возникать только в полных выражениях, а в подвыражениях UB не бывает?[/quot]Я же, вроде, до этого ясно написал, про подвыражения...
Конечно, UB по нулевому указателю может быть и в подвыражении. Простой пример:
Код: plaintext
1.
2.
3.
typedef void (A::* A_func)();
A_func** a = NULL;
A_func f = **a;

Неопределенное поведение выделено и является подвыражением rvalue выражения.
Кстати, еще хотелось бы ответить, что по своей сути, доступ по указателю (void*)0 не является ошибкой, так как в нулевом адресе адресного пространства процессора нет ничего неопределенного и в данном случае UB лишь условность стандарта и компилятора на его основе.
...
Рейтинг: 0 / 0
virtual methods
    #39652894
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devеще хотелось бы ответить,...отметить
:)
...
Рейтинг: 0 / 0
virtual methods
    #39652895
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_dev, ок.

Так в конце-концов что делать с тем, что lvalue по определению обозначает объект, нулевой указатель по определению не указывает ни на какой объект, а результат оператора * это lvalue? Какой объект обозначает это lvalue, если оно применено к нулевому указателю?
...
Рейтинг: 0 / 0
virtual methods
    #39652898
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestЧем он тогда отличается от каста?Тем, что это частный случай переопределения оператора "operator new", который работает там, где не работает преобразование void* к нужному типу.
...
Рейтинг: 0 / 0
virtual methods
    #39652899
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov где не работает преобразование void* к нужному типу.А можно пример где оно не работает?
...
Рейтинг: 0 / 0
virtual methods
    #39652900
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestrdb_dev, ок.
Так в конце-концов что делать с тем, что lvalue по определению обозначает объект,обозначает любую разыменованную область памяти.

a guestнулевой указатель по определению не указывает ни на какой объект,Не надо путать nullptr и NULL.
При использовании доступа по указателю NULL ((void*)0) компилятор хоть и выкинет предупреждение UB, но соберёт вполне рабочий код, так как он понятия не имеет, что именно пишет программист - прикладное ПО или же какой-нибудь legacy загрузчик ОС из MBR или BR, который грузится в 0000:7c

a guestа результат оператора * это lvalue?не обязательно... Это может быть и prvalue:
Код: plaintext
1.
2.
3.
int *pa, *pb;
int a, b = 20;
*a = *b  // prvalue of int


a guestКакой объект обозначает это lvalue, если оно применено к нулевому указателю?Какой тип указателя используешь, такой объект там и будет подразумеваться компилятором.
Что у нас там в далёком прошлом под DOS'ом располагалось в самом начале адресного пространства процессора Intel 8086? Таблица векторов прерываний (функций BIOS и DOS вызываемых машинной командой int)?
А что располагается сейчас в адресном пространстве пользовательского процесса Windows? 64кБ read-only памяти, каждый байт, которой, проинициализирован значением 0x00?
...
Рейтинг: 0 / 0
virtual methods
    #39652901
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestВ boost есть некий вектор (boost/container/vector.hpp), видимо, типа STL-вектора.
Вот его оператор доступа по индексу:
Код: plaintext
1.
2.
3.
4.
5.
   reference operator[](size_type n) BOOST_NOEXCEPT_OR_NOTHROW
   {
      BOOST_ASSERT(this->m_holder.m_size > n);
      return this->m_holder.start()[n];
   }




В реализацию m_holder не смотрел, думаю, в этом нет необходимости. В описании complexity для push_back написано "Amortized constant time", а значит в векторе выделяется (и экспоненциально расширяется) кусок нетипизированной памяти, в котором по мере надобности создаются объекты.
А что это значит? Это значит, что массива объектов в этом куске памяти нет, а в операторе [] вектора мы видим обращение по индексу, т.е. арифметику указателей. А она, упрощённо говоря, вне массива приводит к UB: http://eel.is/c draft/expr.add#4

Вот, пример UB в boost.
Нет там никакого UB в этом коде.
UB будет если юзер обратится к индексу за пределами массива. Это будут проблемы юзера, потому что в доке по вектору прямо написано при каких условиях можно [].
...
Рейтинг: 0 / 0
virtual methods
    #39652902
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestА можно пример где оно не работает?
Код: sql
1.
Тип переменная = new(буфер) Тип

Тип это примитив или объект, а не указатель на примитив или объект.
...
Рейтинг: 0 / 0
virtual methods
    #39652904
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyНет там никакого UB в этом коде.Очевидно, в самом-по-себе коде буста UB нет, ведь это библиотека. UB будет когда юзер вызовет код из буста.
Anatoly MoskovskyUB будет если юзер обратится к индексу за пределами массива.Там нет массива, а обращаются памятью так, как будто он там есть.
Anatoly MoskovskyЭто будут проблемы юзера, потому что в доке по вектору прямо написано при каких условиях можно [].А из того, что написано в стандарте следует, что больше, чем с n == 0 оператор[] вызывать нельзя, даже если size > 1.
...
Рейтинг: 0 / 0
virtual methods
    #39652908
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_deva guestrdb_dev, ок.
Так в конце-концов что делать с тем, что lvalue по определению обозначает объект,обозначает любую разыменованную область памяти.Ложь. A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function. (An lvalue is a glvalue that is not an xvalue.)

rdb_deva guestнулевой указатель по определению не указывает ни на какой объект,Не надо путать nullptr и NULL.При преобразовании к типу указателя обе этих сущности породят указатель с null pointer value. Я не путаю, мне лень различать, как получилось null pointer value. ( http://eel.is/c draft/basic.compound#def:value,null_pointer )

rdb_deva guestа результат оператора * это lvalue?не обязательно... Это может быть и prvalue:Опять ложь. http://eel.is/c draft/expr.unary.op#1: The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points.
...
Рейтинг: 0 / 0
virtual methods
    #39652911
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorova guestА можно пример где оно не работает?
Код: sql
1.
Тип переменная = new(буфер) Тип

Тип это примитив или объект, а не указатель на примитив или объект.Стоит пробовать скомпилировать подобное, прежде чем предъявлять.
...
Рейтинг: 0 / 0
virtual methods
    #39652917
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestобозначает любую разыменованную область памяти.Ложь. A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function. (An lvalue is a glvalue that is not an xvalue.)[/quot]И в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта?
Где располагаются объекты, битовые поля или код функций?

a guestrdb_devНе надо путать nullptr и NULL.При преобразовании к типу указателя обе этих сущности породят указатель с null pointer value. Я не путаю, мне лень различать, как получилось null pointer value. ( http://eel.is/c draft/basic.compound#def:value,null_pointer )На nullptr накладывается больше ограничений - его нельзя напрямую привести к целочисленным типам.

a guestrdb_devне обязательно... Это может быть и prvalue:Опять ложь. http://eel.is/c draft/expr.unary.op#1: The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points.Ну так одним из частных случаев prvalue и есть нереферальный результат lvalue-to-rvalue. Как ты стандарт читал? Смотрим в книгу - видим фигу? Или ты считаешь, что в соответствии со стандартом такая запись:
Код: plaintext
1.
*a = *b;

"неправомерна" :)?
...
Рейтинг: 0 / 0
virtual methods
    #39652918
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestОчевидно, в самом-по-себе коде буста UB нет
Что и требовалось доказать.
А то что кто-то обращается к индексу за пределами текущего выделения вектора то это его проблемы, потому что нарушение предусловий вызова функции это и есть UB.
Не надо с больной головы переводить на буст ))
...
Рейтинг: 0 / 0
virtual methods
    #39652920
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_deva guestrdb_devобозначает любую разыменованную область памяти.Ложь. A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function. (An lvalue is a glvalue that is not an xvalue.)И в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта?
Где располагаются объекты, битовые поля или код функций?Давай-ка я перевормулирую поточнее:
lvalue - любая разыменованная область оперативного хранения.
Так сойдёт? Или опять скажешь, что "не соответствует стандарту"? :)
...
Рейтинг: 0 / 0
virtual methods
    #39652921
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devИ в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта?Да. Это раздел про C++. Доморощенным определениям тут вряд ли место. А то так каждый будет выдумывать всё, что ему лично в данный момент удобно.

rdb_deva guestrdb_devНе надо путать nullptr и NULL.При преобразовании к типу указателя обе этих сущности породят указатель с null pointer value. Я не путаю, мне лень различать, как получилось null pointer value. ( http://eel.is/c draft/basic.compound#def:value,null_pointer )На nullptr накладывается больше ограничений - его нельзя напрямую привести к целочисленным типам.Это, безусловно, играет ключевую роль при преобразовании nullptr к указателю.

rdb_devНу так одним из частных случаев prvalue и есть нереферальный результат lvalue-to-rvalueМы обсуждали value category оператора *.
Я как бы в курсе, что результат lvalue-to-rvalue conversion это prvalue.

rdb_devКак ты стандарт читал?А ты? Что в словосочетании "the result is an lvalue" тебе не ясно?
...
Рейтинг: 0 / 0
virtual methods
    #39652922
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskya guestОчевидно, в самом-по-себе коде буста UB нет
Что и требовалось доказать.Ни в каком коде никакой библиотеки UB нет. UB будет в программе, которая её вызовет. Это всё, что я хотел сказать. Очевидная вещь.
Я думаю, ты как-то не так интерпретировал эти мои слова.
Anatoly MoskovskyА то что кто-то обращается к индексу за пределами текущего выделения вектора то это его проблемы, потому что нарушение предусловий вызова функции это и есть UB.
Не надо с больной головы переводить на буст ))Ты вообще ничего не понял... :(
Посмотри хоть в пример "на пальцах" 21455700 Надеюсь, поможет.
...
Рейтинг: 0 / 0
virtual methods
    #39652923
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestrdb_devИ в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта?Да. Это раздел про C++. Доморощенным определениям тут вряд ли место. А то так каждый будет выдумывать всё, что ему лично в данный момент удобно.Это то, что отличает "зубрилок" от вникающих в суть. Зубрилки, порой, дословно цитируют текст, но не могут понять суть того, что они цитируют, а вникающие в суть напротив - не помнят точно текст, но могут своими словами воспроизвести его смысл.
...
Рейтинг: 0 / 0
virtual methods
    #39652924
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devrdb_devпропущено...
И в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта?
Где располагаются объекты, битовые поля или код функций?Давай-ка я перевормулирую поточнееДавай просто возьмём формулировку из стандарта. Это будет самой точной формулировкой, по определению. И мучаться, выдумывать что-то не надо.
...
Рейтинг: 0 / 0
virtual methods
    #39652926
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_deva guestпропущено...
Да. Это раздел про C++. Доморощенным определениям тут вряд ли место. А то так каждый будет выдумывать всё, что ему лично в данный момент удобно.Это то, что отличает "зубрилок" от вникающих в суть. Зубрилки, порой, дословно цитируют текст, но не могут понять суть того, что они цитируют, а вникающие в суть напротив - не помнят точно текст, но могут своими словами воспроизвести его смысл.Я так понял, ты обиделся и перешёл на личности.
...
Рейтинг: 0 / 0
virtual methods
    #39652930
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestТы вообще ничего не понял... :(
Посмотри хоть в пример "на пальцах" 21455700 Надеюсь, поможет.
Зачем мне куда-то смотреть, если было утверждение "пример UB в boost", а в том примере не было UB.
Т.е. приведено ложное утверждение. Все.
...
Рейтинг: 0 / 0
virtual methods
    #39652931
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskya guestТы вообще ничего не понял... :(
Посмотри хоть в пример "на пальцах" 21455700 Надеюсь, поможет.
Зачем мне куда-то смотреть, если было утверждение "пример UB в boost", а в том примере не было UB.
Т.е. приведено ложное утверждение. Все.Ладно, последняя попытка. Я почему-то верю в людей до последнего, хотя обычно оказывается зря.

Даже если в векторе, скажем, 5 элементов, доступ к третьему элементу с таким определением оператора[] как в бусте скорее всего приведёт к UB. (Надо всё же проверить определение m_holder, есть малая вероятность что там возвращают из .start() не голый указатель, а класс-обёртку через который отмывают UB).

UB в boost в том смысле, что даже, казалось бы, не нарушая требования к вызову функции мы получаем UB.

Хотя бы так ясно?
...
Рейтинг: 0 / 0
25 сообщений из 356, страница 7 из 15
Форумы / C++ [игнор отключен] [закрыт для гостей] / virtual methods
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]