|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Не понимаю, к чему это.К тому, что некоторые из присутствующих считают это Код: plaintext 1.
самостоятельной частью выражения, которое таковым, на самом деле, не является, а всё выражение будет оценено как взятие адреса с приведением к size_t. И никакого доступа, приводящего к UB от слова "совсем"!Т.е. UB может возникать только в полных выражениях, а в подвыражениях UB не бывает? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:42 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovЯ повторю, что? насколько мне известно, placement new вообще ничего не делает с переданным ему буфером.А зачем он нужен, если ничего не делает? Можно не вызвать его тогда... Basil A. SidorovПоэтому ответ на ваш вопрос зависит от того, что происходит с буфером, а это, в любом случае, происходит вне placement new.Я рассчитывал на код, который создаёт массив из трёх элементов поверх массива из двух, при этом первые 2 элемента будут содержать те же значение, что и первые 2 элемента старого массива. И это без копирования (иначе откуда возьмётся amortized constant, если мы будем всё копировать?). Было бы забавно увидеть попытки написать такой код. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:45 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestА зачем он нужен, если ничего не делает?Вроде, должно быть очевидно, что placement new позволяет превратить указатель на массив байт в типированный указатель. Цена вопроса - внешнее управление существованием буфера и ручная работа с конструкторами и деструкторами типа. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovВроде, должно быть очевидно, что placement new позволяет превратить указатель на массив байт в типированный указатель.Чем он тогда отличается от каста? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestсамостоятельной частью выражения, которое таковым, на самом деле, не является, а всё выражение будет оценено как взятие адреса с приведением к size_t. И никакого доступа, приводящего к UB от слова "совсем"!Т.е. UB может возникать только в полных выражениях, а в подвыражениях UB не бывает?[/quot]Я же, вроде, до этого ясно написал, про подвыражения... Конечно, UB по нулевому указателю может быть и в подвыражении. Простой пример: Код: plaintext 1. 2. 3.
Неопределенное поведение выделено и является подвыражением rvalue выражения. Кстати, еще хотелось бы ответить, что по своей сути, доступ по указателю (void*)0 не является ошибкой, так как в нулевом адресе адресного пространства процессора нет ничего неопределенного и в данном случае UB лишь условность стандарта и компилятора на его основе. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 22:58 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devеще хотелось бы ответить,...отметить :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_dev, ок. Так в конце-концов что делать с тем, что lvalue по определению обозначает объект, нулевой указатель по определению не указывает ни на какой объект, а результат оператора * это lvalue? Какой объект обозначает это lvalue, если оно применено к нулевому указателю? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestЧем он тогда отличается от каста?Тем, что это частный случай переопределения оператора "operator new", который работает там, где не работает преобразование void* к нужному типу. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:25 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov где не работает преобразование void* к нужному типу.А можно пример где оно не работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
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.
a guestКакой объект обозначает это lvalue, если оно применено к нулевому указателю?Какой тип указателя используешь, такой объект там и будет подразумеваться компилятором. Что у нас там в далёком прошлом под DOS'ом располагалось в самом начале адресного пространства процессора Intel 8086? Таблица векторов прерываний (функций BIOS и DOS вызываемых машинной командой int)? А что располагается сейчас в адресном пространстве пользовательского процесса Windows? 64кБ read-only памяти, каждый байт, которой, проинициализирован значением 0x00? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestВ boost есть некий вектор (boost/container/vector.hpp), видимо, типа STL-вектора. Вот его оператор доступа по индексу: Код: plaintext 1. 2. 3. 4. 5.
В реализацию m_holder не смотрел, думаю, в этом нет необходимости. В описании complexity для push_back написано "Amortized constant time", а значит в векторе выделяется (и экспоненциально расширяется) кусок нетипизированной памяти, в котором по мере надобности создаются объекты. А что это значит? Это значит, что массива объектов в этом куске памяти нет, а в операторе [] вектора мы видим обращение по индексу, т.е. арифметику указателей. А она, упрощённо говоря, вне массива приводит к UB: http://eel.is/c draft/expr.add#4 Вот, пример UB в boost. Нет там никакого UB в этом коде. UB будет если юзер обратится к индексу за пределами массива. Это будут проблемы юзера, потому что в доке по вектору прямо написано при каких условиях можно []. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:34 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestА можно пример где оно не работает? Код: sql 1.
Тип это примитив или объект, а не указатель на примитив или объект. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:38 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyНет там никакого UB в этом коде.Очевидно, в самом-по-себе коде буста UB нет, ведь это библиотека. UB будет когда юзер вызовет код из буста. Anatoly MoskovskyUB будет если юзер обратится к индексу за пределами массива.Там нет массива, а обращаются памятью так, как будто он там есть. Anatoly MoskovskyЭто будут проблемы юзера, потому что в доке по вектору прямо написано при каких условиях можно [].А из того, что написано в стандарте следует, что больше, чем с n == 0 оператор[] вызывать нельзя, даже если size > 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:46 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorova guestА можно пример где оно не работает? Код: sql 1.
Тип это примитив или объект, а не указатель на примитив или объект.Стоит пробовать скомпилировать подобное, прежде чем предъявлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2018, 23:49 |
|
virtual methods
|
|||
---|---|---|---|
#18+
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.
"неправомерна" :)? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:09 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestОчевидно, в самом-по-себе коде буста UB нет Что и требовалось доказать. А то что кто-то обращается к индексу за пределами текущего выделения вектора то это его проблемы, потому что нарушение предусловий вызова функции это и есть UB. Не надо с больной головы переводить на буст )) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
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 - любая разыменованная область оперативного хранения. Так сойдёт? Или опять скажешь, что "не соответствует стандарту"? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
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" тебе не ясно? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:18 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestОчевидно, в самом-по-себе коде буста UB нет Что и требовалось доказать.Ни в каком коде никакой библиотеки UB нет. UB будет в программе, которая её вызовет. Это всё, что я хотел сказать. Очевидная вещь. Я думаю, ты как-то не так интерпретировал эти мои слова. Anatoly MoskovskyА то что кто-то обращается к индексу за пределами текущего выделения вектора то это его проблемы, потому что нарушение предусловий вызова функции это и есть UB. Не надо с больной головы переводить на буст ))Ты вообще ничего не понял... :( Посмотри хоть в пример "на пальцах" 21455700 Надеюсь, поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestrdb_devИ в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта?Да. Это раздел про C++. Доморощенным определениям тут вряд ли место. А то так каждый будет выдумывать всё, что ему лично в данный момент удобно.Это то, что отличает "зубрилок" от вникающих в суть. Зубрилки, порой, дословно цитируют текст, но не могут понять суть того, что они цитируют, а вникающие в суть напротив - не помнят точно текст, но могут своими словами воспроизвести его смысл. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:21 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devrdb_devпропущено... И в чем же ложь? В том, что моё определение не соответствует дословно определению стандарта? Где располагаются объекты, битовые поля или код функций?Давай-ка я перевормулирую поточнееДавай просто возьмём формулировку из стандарта. Это будет самой точной формулировкой, по определению. И мучаться, выдумывать что-то не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_deva guestпропущено... Да. Это раздел про C++. Доморощенным определениям тут вряд ли место. А то так каждый будет выдумывать всё, что ему лично в данный момент удобно.Это то, что отличает "зубрилок" от вникающих в суть. Зубрилки, порой, дословно цитируют текст, но не могут понять суть того, что они цитируют, а вникающие в суть напротив - не помнят точно текст, но могут своими словами воспроизвести его смысл.Я так понял, ты обиделся и перешёл на личности. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:26 |
|
virtual methods
|
|||
---|---|---|---|
#18+
a guestТы вообще ничего не понял... :( Посмотри хоть в пример "на пальцах" 21455700 Надеюсь, поможет. Зачем мне куда-то смотреть, если было утверждение "пример UB в boost", а в том примере не было UB. Т.е. приведено ложное утверждение. Все. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:45 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestТы вообще ничего не понял... :( Посмотри хоть в пример "на пальцах" 21455700 Надеюсь, поможет. Зачем мне куда-то смотреть, если было утверждение "пример UB в boost", а в том примере не было UB. Т.е. приведено ложное утверждение. Все.Ладно, последняя попытка. Я почему-то верю в людей до последнего, хотя обычно оказывается зря. Даже если в векторе, скажем, 5 элементов, доступ к третьему элементу с таким определением оператора[] как в бусте скорее всего приведёт к UB. (Надо всё же проверить определение m_holder, есть малая вероятность что там возвращают из .start() не голый указатель, а класс-обёртку через который отмывают UB). UB в boost в том смысле, что даже, казалось бы, не нарушая требования к вызову функции мы получаем UB. Хотя бы так ясно? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2018, 00:52 |
|
|
start [/forum/topic.php?fid=57&msg=39652926&tid=2017692]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 150ms |
0 / 0 |