13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607

Есть ли тут UB ?

09.03.2020, 12:27. Показов 3146. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, не могу разобрать вот такую ситуацию:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
class A
{
public:
    A() { std::cout << "Adef" << std::endl; x = 4; }
    A(const A& _a) { std::cout << "cA&" << std::endl; x = 7; }
    unsigned x;
};
 
class B : public A
{
public:
    unsigned y;
    B()
    {std::cout << "Bdef" << std::endl; x = 3; y = 8; }
    B(const B& _b)
    { std::cout << "cB&" << std::endl; x = 7; }
    B& operator =(const B&)
    { std::cout << "B=&" << std::endl; x = 7; return *this; }
    int foo() const volatile { std::cout << "foo" << std::endl; return 555; }
};
 
int main()
{
    using std::cout;
    using std::endl;
    cout << "-----------" << endl;
    // class B : public A
    A * pa = new A; 
    A & ra = *pa;
    cout << "-----------" << endl;
    B & rb = static_cast<B&>(ra);
    rb.foo();
    rb.y = 55;
    cout << "-----------" << endl;
    return 0;
}
С одной стороны идёт обращение к полям и методам класса B, а с другой его конструктор нигде не вызывается.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.03.2020, 12:27
Ответы с готовыми решениями:

Есть ли тут такие, у кого есть свои идеи ,касающиеся компьютерной безопасности,например, по защите от вирусов?
Есть ли тут такие, у кого есть свои идеи ,касающиеся компьютерной безопасности,например, по защите от вирусов?

Есть ли тут утечка памяти?
Добрый вечер. Случайно возник такой вопрос: а вызывается ли деструктор для уже перемещенного объекта, если на его место перемещают другой? ...

И есть ли тут вообще список?
Есть программа. Скажите, какой это вид списка? И есть ли тут вообще список? struct car{ char name; // название марки машины int...

55
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.03.2020, 12:35
Цитата Сообщение от squareroot Посмотреть сообщение
B & rb = static_cast<B&>(ra);
после этого использование rb как B - UB
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.03.2020, 13:06
squareroot,
C++
1
2
B & rb = static_cast<B&>(ra); //<--- некорректный каст
rb.foo(); // <--- UB
сам по себе неправомерный каст ещё не UB
а вот доступ по нелегальной ссылке - это уже UB
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
09.03.2020, 15:38
Цитата Сообщение от zayats80888 Посмотреть сообщение
после этого использование rb как B
Что такое "использование как B"?
0
09.03.2020, 15:48

Не по теме:

Цитата Сообщение от argcargv Посмотреть сообщение
Что такое "использование как B"?
догадайся :) (на кошках тренируйся)

0
09.03.2020, 15:50

Не по теме:

Цитата Сообщение от zayats80888 Посмотреть сообщение
догадайся :) (на кошках тренируйся)
а я немножко понимаю как машина работает

0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
10.03.2020, 00:18  [ТС]
Яж могу тут совсем не детский вопрос задать, если кому скучно.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
10.03.2020, 02:28
Цитата Сообщение от _stanislav Посмотреть сообщение

Не по теме:


а я немножко понимаю как машина работает

Поведение С++ программы не имеет никакого отношения к тому "как машина работает". Поведение С++ программы определяется тем кодом, который нагенерировал компилятор. А это, в свою очередь, определяется спецификацией языка. В ситуациях с UB, как уже бесчисленное количество раз показывала практика, современные компиляторы зачастую генерируют совершенно непредсказуемый, "бессмысленный" и "неправильный" код. Причем иногда они делают это умышленно, именно с целью дать по рукам тем, кто думает, что знает "как машина работает".

Цитата Сообщение от hoggy Посмотреть сообщение
squareroot,
C++
1
2
B & rb = static_cast<B&>(ra); //<--- некорректный каст
rb.foo(); // <--- UB
сам по себе неправомерный каст ещё не UB
а вот доступ по нелегальной ссылке - это уже UB
Неверно. Сам по себе каст - уже UB. (http://eel.is/c++draft/expr.static.cast#2) И так было всегда.

Цитата Сообщение от squareroot Посмотреть сообщение
С одной стороны идёт обращение к полям и методам класса B, а с другой его конструктор нигде не вызывается.
Это неважно. Уже сама попытка сделать static_cast<B&>(ra); - сразу же неопределенное поведение.
3
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
10.03.2020, 02:32  [ТС]
TheCalligrapher, Я думаю тут имели ввиду что сам по себе каст не UB, и в определённом контексте быть вполне "законным" выражением.
Но в моём контексте некорректный код начинается с этого каста.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
10.03.2020, 02:41
Цитата Сообщение от squareroot Посмотреть сообщение
Я думаю тут имели ввиду что сам по себе каст не UB,
Имели в виду неправильно. Именно тут, в вашем конкретном примере сам по себе каст - UB.

Цитата Сообщение от squareroot Посмотреть сообщение
и в определённом контексте быть вполне "законным" выражением.
"В определённом контексте" он разумеется может быть вполне законным. static_cast в языке С++, разумеется, существует отнюдь не для создания безусловного UB. Но в данном случае речь идет именно о вашем примере.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.03.2020, 03:28
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Уже сама попытка сделать static_cast<B&>(ra); - сразу же неопределенное поведение.
TheCalligrapher, я не смог понять. В ссылке говорится о том, что если есть нарушение квалификаторов то программа плохо (уродливо) написана. Но сам по себе статик каст ссылки родителя к потомку там разрешен, ведь:
An lvalue of type “cv1 B”, where B is a class type, can be cast to type “reference to cv2 D”, where D is a class derived from B,
с рядом ограничений, но я не увидел их в примере ТС. Что именно относится к к данной цитате в коде ТС из перечисленных ограничений?
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
10.03.2020, 03:35
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что именно относится к к данной цитате в коде ТС из перечисленных ограничений?
Ну так читайте абзац до конца. В стандарте по ссылке, при описании этого варианта static_cast ясно написано

If the object of type “cv1 B” is actually a base class subobject of an object of type D, the result refers to the enclosing object of type D. Otherwise, the behavior is undefined.
3
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
10.03.2020, 09:10
squareroot, надо было использовать reinterpret_cast. Тогда вопрос получился бы поинтереснее, особенно про то, является ли rb.y = 55; UB.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.03.2020, 10:46
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ну так читайте абзац до конца. В стандарте по ссылке, при описании этого варианта static_cast ясно написано
Но это же говорит о том, что UB порождается именно попыткой неверной интерпретации результата пре6образования - то есть попыткой обращения к родителю как к наследнику, но не самим кастингом. Это привычная истина и тут я согласен. Но вопрос же был о том, что само преобразование в коде ТС это UB. В тексте сказано, что программа содержащая такое преобразование (с нарушением ряда ограничений и в частности строгости CV) является ярко некорректной/illformed (тоже не UB кстати). Мой вопрос о том, какое из перечисленных ограничений нарушено, для трактовки его кода как illformed с точки зрения приведенного фрагмента черновика стандарта.

Добавлено через 2 минуты
Цитата Сообщение от argcargv Посмотреть сообщение
squareroot, надо было использовать reinterpret_cast. Тогда вопрос получился бы поинтереснее, особенно про то, является ли rb.y = 55; UB.
Вопрос интерсности - глубоко интимный вопрос. Мне, например, не интересно. Статик каст вполне достаточео. А попытка обращение по невалидной ссылке - UB.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
10.03.2020, 10:55
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но это же говорит о том, что UB порождается именно попыткой неверной интерпретации результата пре6образования - то есть попыткой обращения к родителю как к наследнику, но не самим кастингом.
Вы что-то выдумываете. Это где это вы увидели там хоть какое-то упоминание "попытки обращения"? Ничего подобного там нет и ни о какой "попытке обращения" там нет ни слова. Все, что написано в абзаце по ссылке относится к самому касту и только к самому касту.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Но вопрос же был о том, что само преобразование в коде ТС это UB.
Именно так. Само преобразование в коде ТС это UB, как ясно написано в стандарте по ссылке.

Цитата Сообщение от IGPIGP Посмотреть сообщение
В тексте сказано, что программа содержащая такое преобразование (с нарушением ряда ограничений и в частности строгости CV) является ярко некорректной/illformed (тоже не UB кстати).
Ым... Об "ill-formed" там идет речь только в случаях, когда "нормальное" преобразование (upcast от D к B) не валидно (отсутствие прав доступа и т.п). В такой ситуации и downcast через static_cast от B к D по определению является ill-formed. Но к нашему примеру это никак не относится. Зачем вы это сюда приплели?

Цитата Сообщение от IGPIGP Посмотреть сообщение
Мой вопрос о том, какое из перечисленных ограничений нарушено, для трактовки его кода как illformed с точки зрения приведенного фрагмента черновика стандарта.
Ничего ill-formed в этом коде нет. Никто этот код не трактует как ill-formed. Еще раз: зачем вы сюда приплели ill-formed?
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
10.03.2020, 11:00
Цитата Сообщение от IGPIGP Посмотреть сообщение
А попытка обращение по невалидной ссылке - UB.
C++
1
2
    B & rb = reinterpret_cast<B&>(ra);
    rb.y = 55;
Сможешь показать в стандарте откуда следует что тут UB?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.03.2020, 11:07
Цитата Сообщение от argcargv Посмотреть сообщение
Сможешь показать в стандарте откуда следует что тут UB?
Не уверен, что в стандарте надо писать о том, что обращение по невалидной ссылке это UB, хотя они ребята не менее весёлые. Я не могу доказать, того что в каком то случае на какой то из систем код не запишет а потом не прочтёт того, что подразумевал пользователь и внешне будет всё ок.
argcargv, я же не спорю. Я говорю, что мне не интересно и объясняю почему. Это позволяет вам оставаться в очаровании своих мыслей.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
10.03.2020, 11:08
TheCalligrapher, IGPIGP, я с вами обоими котегорически не согласен.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.03.2020, 11:11
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ым... Об "ill-formed" там идет речь только в случаях, когда "нормальное" преобразование (upcast от D к B) не валидно (отсутствие прав доступа и т.п). В такой ситуации и downcast через static_cast от B к D по определению является ill-formed. Но к нашему примеру это никак не относится. Зачем вы это сюда приплели?
Я не приплетал. Этот юридический термин связан с формированием заведомо ложных улик и обстоятельств дела. Давайте я не буду говорить вам о русском языке и о манерах? Вы подали ссылку размером с простыню. Я прочёл выделенный фрагмент и там:
An lvalue of type “cv1 B”, where B is a class type, can be cast to type “reference to cv2 D”, where D is a class derived from B,
Задавая свой вопрос, я привёл данный фрагмент с пояснением своего понимания и не понимания вашего понимания. Привожу ещё раз. Объяснения не стану повторять.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
10.03.2020, 11:13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
TheCalligrapher, IGPIGP, я с вами обоими котегорически не согласен.
Вы, похоже, находитесь в плену заблуждения, полагая, что я высказываю некое "свое мнение", с которым можно не соглашаться.

Это не так. Я лишь привожу факты из стандарта языка, где по этому вопросу все написано четко, понятно и однозначно. Ни о каком "не согласен" в данном случае речи быть не может.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2020, 11:13
Помогаю со студенческими работами здесь

Есть ли тут ошибки? У меня С++ виснет и ничего не выдает
#include &quot;stdafx.h&quot; #include &lt;cstring&gt; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cstdlib&gt; using namespace std; ...

Есть тут кто работает с++ + intel xeon phi 5110p ?
Добрый день, хотел бы пообщаться на эту тему, кто пишет на с++ уже софт и занимается отладной используя intel xeon phi 5110p.

Даны натуральные числа n, k. Проверить, есть ли в записи числа nk цифра m. тут число n в степени k, то есть k
Даны натуральные числа n, k. Проверить, есть ли в записи числа nk цифра m. Надо оформить данный код в HTML документ. var n =...

Тут есть профессионалы по JS
Ищу профессионала для создания очень простого скрипта,в JavaScript

Тут есть Ошибка?
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru