Re[11]: Члены класса и aliasing
От: σ  
Дата: 06.05.20 14:52
Оценка:
σ>>Почему, например, вызываемая функция не могла угадать адрес аргумента или локальной переменной вызывающей функции, без прямой передачи ей указателя на них или без записи такого указателя в глобальную переменную и т.п.? Вроде этот пассаж разрешает. Хоть из /dev/random считать биты и слепить из них значение указателя.

A>Почему ж не могла? Могла. Только вот компилятор не обязан на такое не закладываться, когда код функции генерит. И правильно делает имхо, предположение о том, что в функцию приходит указатель на объект, а не хитро сконструированный мусор, достаточно разумно.


Не знаю, откуда взялись функции в которые что-то "приходит".
Ладно, попробую ещё раз объяснить.
Есть код
int f() { int i = 0; g(); return i; }

Может ли компилятор соптимизировать тело до `g(); return 0;` и почему? Вроде как тот пассаж из стандарта говорит, что `g()` может угадать адрес `i` (и, следовательно, изменить значение).
Re[7]: Члены класса и aliasing
От: Alexander G Украина  
Дата: 06.05.20 15:21
Оценка:
Здравствуйте, σ, Вы писали:

σ>А для легальности арифметики с полученным указателем `sizeof(Count) == sizeof (int)` значения не имеет. Она нелегальна в любом случае.


Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру?
Или такую функцию реализовать средствами С++ невозможно?
Русский военный корабль идёт ко дну!
Re[8]: Члены класса и aliasing
От: andrey.desman  
Дата: 06.05.20 15:26
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Aliasing объекта и его члена легален.


Да, уже разобрался. Тут не алиасинг легален, а его просто нет. Для SLT указатели на первый член и структуру interconvertible, поэтому там object accessed получается не структура, а именно первый член и тогда dynamic type == aliased type.
Re[12]: Члены класса и aliasing
От: andyp  
Дата: 06.05.20 15:30
Оценка:
Здравствуйте, σ, Вы писали:



σ>Не знаю, откуда взялись функции в которые что-то "приходит".


В данном случае про аргумент речь шла, так что ты не можешь получить адрес объекта, который еще не появился в стеке, и передать его в функцию. Сначала должен быть объект, а уж указатель на него ты можешь out of thin air получить. То, что ты получишь из /dev/random, указателем на объект не является, так как объекта еще нет.

σ>Ладно, попробую ещё раз объяснить.

σ>Есть код
σ>
σ>int f() { int i = 0; g(); return i; }
σ>

σ>Может ли компилятор соптимизировать тело до `g(); return 0;` и почему? Вроде как тот пассаж из стандарта говорит, что `g()` может угадать адрес `i` (и, следовательно, изменить значение).

Здесь обратная ситуация, объект уже есть.

Имхо может, хоть я и не бог весть какой законник. По "as_if rule". Твой int не volatile, так что прога может и не посчитать запись в него в g() "observable behavior". Здесь стандарт много на волю реализации отдает. Если возможностей судить о g() у компилятора нет, то он оставит все как есть.
Re[13]: Члены класса и aliasing
От: σ  
Дата: 06.05.20 15:45
Оценка:
A>В данном случае про аргумент речь шла, так что ты не можешь получить адрес объекта, который еще не появился в стеке, и передать его в функцию.
Перечитай ещё раз то моё сообщение. Словесное описание совпадает с кодом, который я запостил позже.

A> Сначала должен быть объект, а уж указатель на него ты можешь out of thin air получить.

Не можешь. Это был бы кошмар для оптимизаций.

σ>>Ладно, попробую ещё раз объяснить.

σ>>Есть код
σ>>
σ>>int f() { int i = 0; g(); return i; }
σ>>

σ>>Может ли компилятор соптимизировать тело до `g(); return 0;` и почему? Вроде как тот пассаж из стандарта говорит, что `g()` может угадать адрес `i` (и, следовательно, изменить значение).

A>Здесь обратная ситуация, объект уже есть.

Это код, который я описывал словами.

A>Имхо может, хоть я и не бог весть какой законник. По "as_if rule". Твой int не volatile, так что прога может и не посчитать запись в него в g() "observable behavior".

Какая-то странная логика. Так и `int i = 0; i = 2; return i;` можно соптимизировать до `return 0;`, а чо, запись двойки это не "observable behavior".

A> Здесь стандарт много на волю реализации отдает. Если возможностей судить о g() у компилятора нет, то он оставит все как есть.

Так ведь не оставляет, а оптимизирует
Re[14]: Члены класса и aliasing
От: andyp  
Дата: 06.05.20 16:10
Оценка:
Здравствуйте, σ, Вы писали:

A>>В данном случае про аргумент речь шла, так что ты не можешь получить адрес объекта, который еще не появился в стеке, и передать его в функцию.

σ>Перечитай ещё раз то моё сообщение. Словесное описание совпадает с кодом, который я запостил позже.

Понял, ты изначально говорил о ситуации, про которую потом код привел. Невнимателен, виноват, думал что разговор всё еще про то, что аргумент функции не может алиасить на локальную переменную.

A>> Сначала должен быть объект, а уж указатель на него ты можешь out of thin air получить.

σ>Не можешь. Это был бы кошмар для оптимизаций.

Так вроде твоя ж была цитата как раз про то, что указатель на валидный объект может быть ЛЮБЫМ способом рассчитан Абы б он указывал действительно на валидный существующий объект.

A>>Имхо может, хоть я и не бог весть какой законник. По "as_if rule". Твой int не volatile, так что прога может и не посчитать запись в него в g() "observable behavior".

σ>Какая-то странная логика. Так и `int i = 0; i = 2; return i;` можно соптимизировать до `return 0;`, а чо, запись двойки это не "observable behavior".
A>> Здесь стандарт много на волю реализации отдает. Если возможностей судить о g() у компилятора нет, то он оставит все как есть.
σ>Так ведь не оставляет, а оптимизирует

Говорю ж, не знаю что точно подразумевается под observable behavior. В стандарте так написано, что фактически надо сравнить выполнение оптимизированной и неоптимизированной проги на абстрактной машине, что само по себе смехотворно.
Re[2]: Члены класса и aliasing
От: Шахтер Интернет  
Дата: 07.05.20 10:42
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>А в локальную переменную.


AG>Осталась привычка со времён, когда до изобретения атомиков думали, что int мембер тоже атомик.


AG>И продолжает помогать.


AG>
AG>struct Count
AG> {
AG>  int val;


AG>  void sum(PtrLen<const int> r)
AG>   {
AG>    int tmp_val=0;

AG>    for(int v : r ) tmp_val+=v;
AG>    val = tmp_val;
AG>   }
AG> }
AG>


Я тоже так делаю, когда сильно озабочен производительностью.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[8]: Члены класса и aliasing
От: σ  
Дата: 07.05.20 10:57
Оценка: 5 (1)
σ>>А для легальности арифметики с полученным указателем `sizeof(Count) == sizeof (int)` значения не имеет. Она нелегальна в любом случае.

AG>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру?

AG>Или такую функцию реализовать средствами С++ невозможно?

Да, невозможно.
Re[9]: Члены класса и aliasing
От: andrey.desman  
Дата: 07.05.20 11:02
Оценка:
Здравствуйте, σ, Вы писали:

AG>>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру?

AG>>Или такую функцию реализовать средствами С++ невозможно?
σ>Да, невозможно.

Это почему?
Re[10]: Члены класса и aliasing
От: σ  
Дата: 07.05.20 11:04
Оценка: -1 :)
AG>>>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру?
AG>>>Или такую функцию реализовать средствами С++ невозможно?
σ>>Да, невозможно.
AD>Это почему?
Недостаточно C++-средств для реализации memcpy.
Re[11]: Члены класса и aliasing
От: andrey.desman  
Дата: 07.05.20 11:05
Оценка:
Здравствуйте, σ, Вы писали:

AG>>>>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру?

AG>>>>Или такую функцию реализовать средствами С++ невозможно?
σ>>>Да, невозможно.
AD>>Это почему?
σ>Недостаточно C++-средств для реализации memcpy.

Вот я и спрашиваю, чего именно не хватает?
Re[12]: Члены класса и aliasing
От: σ  
Дата: 07.05.20 11:09
Оценка: 5 (1)
AG>>>>>Как могла бы работать функция memcpy, которая копирует структуру через нетипизированный указатель и размер в другую структуру?
AG>>>>>Или такую функцию реализовать средствами С++ невозможно?
σ>>>>Да, невозможно.
AD>>>Это почему?
σ>>Недостаточно C++-средств для реализации memcpy.
AD>Вот я и спрашиваю, чего именно не хватает?
См. это. (Правда, там вроде wording протух, а новая ревизия пока не в открытом доступе).
Ну или https://rsdn.org/forum/cpp/7312471?tree=tree
Автор: σ
Дата: 29.11.18
и далее по треду
Отредактировано 07.05.2020 11:37 σ . Предыдущая версия .
Re[8]: Члены класса и aliasing
От: Erop Россия  
Дата: 15.05.20 17:55
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>

Ш>struct Alpha
Ш> {
Ш>  [private:]

Ш>  int val;
Ш> }; 

Ш>Alpha obj{};

Ш>int *ptr=(int *)&obj; // ptr == &obj.val

Ш>


Ш>Таким способом можно пробить защиту (сюрприз!).


Для private полей, вроде как таких гарантий нет. И структура с private вроде бы не POD же?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Члены класса и aliasing
От: σ  
Дата: 15.05.20 18:09
Оценка: 5 (1)
E>Для private полей, вроде как таких гарантий нет. И структура с private вроде бы не POD же?
https://timsong-cpp.github.io/cppwp/n4659/basic.compound#4.3
https://timsong-cpp.github.io/cppwp/n4659/class#7.3
Re[10]: Члены класса и aliasing
От: Erop Россия  
Дата: 16.05.20 11:16
Оценка:
Здравствуйте, σ, Вы писали:

σ>https://timsong-cpp.github.io/cppwp/n4659/basic.compound#4.3

σ>https://timsong-cpp.github.io/cppwp/n4659/class#7.3

Типа, если вообще все нестатические поля private, то можно?
Прикольное правило
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.