powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / В какой указатель запись будет произведена первой?
41 сообщений из 41, показаны все 2 страниц
В какой указатель запись будет произведена первой?
    #39881942
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый тест на знание C++ sql.ru (ожидаемо) провалил. Когда я подумал что дно уже достигнуто, снизу постучался некто MasterZiv, утверждая, что `int* const ptr = new int{};` это динамическое создание константного объекта ( 21998710 ). Ладно, вопрос попроще.

Есть код
Код: plaintext
1.
2.
3.
4.
5.
6.
int main()
{
  int* p1 = new int{};
  int* p2 = p1;
  delete p1;
}


Сказано, что при освобождении памяти значения всех указателей (которые попадают под определённое условие) становятся invalid pointer values.
basic.stc/4When the end of the duration of a region of storage is reached, the values of all pointers representing the address of any part of that region of storage become invalid pointer values.
Также про объекты с automatic storage duration известно что они сохраняют последнее записанное в них значение .
intro.execution/6An instance of each object with automatic storage duration is associated with each entry into its block. Such an object exists and retains its last-stored value during the execution of the block and while the block is suspended ...

Если значение стало другим (invalid pointer value), значит это изменение значения было записью (иначе бы сохранилось последнее записанное, которое, очевидно, не invalid pointer value).

В каком порядке в указатели записывается invalid pointer value? Сначала в p1 или в p2?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881948
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisЕсли значение стало другим (invalid pointer value), значит это изменение значения было записью (иначе бы сохранилось последнее записанное, которое, очевидно, не invalid pointer value).invalid pointer value - не означает что значение стало другим.

Ладно, давай так попробуем:

- У тебя есть книжный стеллаж с полками. Пустой. И тетрадка чистая.
- Ты кладешь на самую нижнюю полку книжку а в тетрадку пишешь: "книжка на нижней полке".
- Открываешь другую страницу в тетрадке и пишешь тоже самое "книжка на нижней полке".
- Кладешь тетрадку на стол, подходишь к стеллажу и забираешь книжку.
СТОП!
Какой текст сейчас записан на страницах тетрадки?
Стали ли записи в тетрадке правильными или стали неправильными?

Ответь на эти два вопроса.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881950
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня - тягостное дежа-вю. Мне кажется мы уже обсуждали этот вопрос.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881954
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlZ axisЕсли значение стало другим (invalid pointer value), значит это изменение значения было записью (иначе бы сохранилось последнее записанное, которое, очевидно, не invalid pointer value).invalid pointer value - не означает что значение стало другим.Почему?
White OwlЛадно, давай так попробуем:

- У тебя есть книжный стеллаж с полками. Пустой. И тетрадка чистая.
- Ты кладешь на самую нижнюю полку книжку а в тетрадку пишешь: "книжка на нижней полке".
- Открываешь другую страницу в тетрадке и пишешь тоже самое "книжка на нижней полке".
- Кладешь тетрадку на стол, подходишь к стеллажу и забираешь книжку.
СТОП!
Какой текст сейчас записан на страницах тетрадки?
Стали ли записи в тетрадке правильными или стали неправильными?

Ответь на эти два вопроса.Можно я отвечу цитатой?
Рибо «Эволюция общих идей»Рассуждение по аналогии представляет собою рассуждение уже гораздо более высокого порядка. Оно является главным логическим орудием ребёнка и первобытного человека.
Я предпочитаю более убедительные методы рассуждений, чем аналогии.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881957
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisМожно я отвечу цитатой?Нельзя. Подумай над моим вопросом и ответь сам.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881958
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До и после delete значения указателя не меняются.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$ cat probe.cpp 
#include <stdio.h>

int main()
{
  int* p1 = new int{};
  int* p2 = p1;
  printf("Sizeof pointer = %lu bytes\n", sizeof(p1));
  printf("Physicall value of pointers before 'delete' = %016lx\n", p1);
  delete p1;
  printf("Physicall value of pointers after 'delete' = %016lx\n", p1);
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$ uname -a
Linux ryzen-ssd 5.0.0-32-generic #34~18.04.2-Ubuntu SMP Thu Oct 10 10:36:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ 
$ c++ --version
c++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ c++ probe.cpp && ./a.out
                                                                     ^
Sizeof pointer = 8 bytes
Physicall value of pointers before 'delete' = 000055e364b7ee70
Physicall value of pointers after 'delete' = 000055e364b7ee70
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881959
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДо и после delete значения указателя не меняются.А о чём говорится в [basic.stc]/4 тогда?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881960
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axismaytonДо и после delete значения указателя не меняются.А о чём говорится в [basic.stc]/4 тогда?о том, что пользоваться p2 после удаления p1 ты можешь только на свой страх и риск, более того, язык гарантирует, что у тебя в программе будет ошибка, если ты им будешь пользоваться особенно умело)
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881961
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axismaytonДо и после delete значения указателя не меняются.А о чём говорится в [basic.stc]/4 тогда?
Подожди. Ты в топике - ученик. Падаван. И не влючай менторский тон. Ты пришел
с незнанием. Ты пришел с вопросом. И будь добр. Держи лицо таким чтобы все
видели что ты внимаешь и слушаешь опытных ОК?

А теперь если ок тогда вопрос.

Ты согласен что указатель - это целое число которое указывает на ячейку памяти?

Я об этом писал в закрытом топике. И ты тогда ответил - нет. Очевидно у тебя были
какие-то другие соображения.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881962
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlZ axisМожно я отвечу цитатой?Нельзя. Подумай над моим вопросом и ответь сам.Да я думаю можно. Ответ ванильной цитаткой это вполне на уровне рассуждений аналогиями.
Ну да ладно. Текст записан тот же, но записи — неправильны. Я это должен был ответить?

Только проблема в том, что эта аналогия не соответствует моему вопросу. В этом проблема рассуждений аналогиями. Трудно (если возможно) подобрать корректную.
Я знаю вопрос соответствующий аналогии, но говорить (пока) не буду.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881963
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZ axisпропущено...
А о чём говорится в [basic.stc]/4 тогда?
Подожди. Ты в топике - ученик. Падаван. И не влючай менторский тон. Ты пришел
с незнанием. Ты пришел с вопросом. И будь добр. Держи лицо таким чтобы все
видели что ты внимаешь и слушаешь опытных ОК?А где менторский тон? Я и задал вопрос: о чём говорится в [basic.stc]/4.

maytonА теперь если ок тогда вопрос.

Ты согласен что указатель - это целое число которое указывает на ячейку памяти?Не знаю. Что стандарт говорит?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881964
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС болен, а вы не врачи, забаньте его и всё, зачем издеваться, все равно этим закончится.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881965
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisWhite Owlпропущено...
Нельзя. Подумай над моим вопросом и ответь сам.Да я думаю можно. Ответ ванильной цитаткой это вполне на уровне рассуждений аналогиями.
Ну да ладно. Текст записан тот же, но записи — неправильны. Я это должен был ответить?Да. Верно.
Так вот в данной ситуации - указатели это странички в тетрадке. Текст на страничках не изменяется, но он становится неверным.
Точно так же и с указателями - они сами не изменяются, но становятся неверными.


Z axisВ этом проблема рассуждений аналогиями. Трудно (если возможно) подобрать корректную.Трудно, не означает невозможно.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881966
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axismaytonпропущено...

Подожди. Ты в топике - ученик. Падаван. И не влючай менторский тон. Ты пришел
с незнанием. Ты пришел с вопросом. И будь добр. Держи лицо таким чтобы все
видели что ты внимаешь и слушаешь опытных ОК?А где менторский тон? Я и задал вопрос: о чём говорится в [basic.stc]/4.

maytonА теперь если ок тогда вопрос.

Ты согласен что указатель - это целое число которое указывает на ячейку памяти?Не знаю. Что стандарт говорит?
Я не помню стандарт наизусть.

Ты согласен что ты видел своими глазами что указатель хранит просто целое число?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881967
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ не помню стандарт наизусть.А зачем помнить? Можно взять последний перед стандартизацией драфт и посмотреть https://timsong-cpp.github.io/cppwp/n4659/
maytonТы согласен что ты видел своими глазами что указатель хранит просто целое число?Это ты про код свой?
Не согласен. Код полон UB из-за некорректной форматной строки, а ещё там небольшая кучка implementation-defined behavior и вообще как кто-то сказал в прошлом треде: компилятор не обязательно на 100% соответствует стандарту.
Если возможно, что код выполняется не так, как требует стандарт, то такой способ рассуждений так же неубедителен, как рассуждения аналогиями.
Проще опираться чисто на стандарт.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881968
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axismaytonЯ не помню стандарт наизусть.А зачем помнить? Можно взять последний перед стандартизацией драфт и посмотреть https://timsong-cpp.github.io/cppwp/n4659/
А что перед тем как умножать числа я должен каждый раз перечитывать таблицу Пифагора?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisПроще опираться чисто на стандарт.

Для теоретиков - да. Те, кто пишут реальные программы для реальных компьютеров, учитывают
их работу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881971
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisЭто ты про код свой?
Не согласен. Код полон UB из-за некорректной форматной строки, а ещё там небольшая кучка implementation-defined behavior и вообще как кто-то сказал в прошлом треде: компилятор не обязательно на 100% соответствует стандарту.
Если возможно, что код выполняется не так, как требует стандарт, то такой способ рассуждений так же неубедителен, как рассуждения аналогиями.
Проще опираться чисто на стандарт.
Отлично. Ты опирался на стандарт. Опирался 3 раза. Создал 3 топика. У тебя от чтения стандарта
стало ясно в голове?

Да в коде бывают UB. Я тебе показал частный случай чтобы ты понял что указатель это целое число
которое указывает на ячейку памяти. И никакого признака invalid pointer value оно внутри себя
не хранит потому что хренить этот признак негде. Это простая логика для которой не нужно
читать стандарты.

Хотя есть еще и значение NULL. Но в данном частном примере мы наблюдали забавное поведение
когда компиллятор GCC в дефолтном режиме настроек ничего не обнулял и не инвалидировал.

Блоки выделенной памяти кстати существуют отдельно от твоих указателей. Ими ведает операционная
система. Вот и думай дальше как эти факты увязать в голове.

Стандарты читай. Читай и проверяй.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881972
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axis,

тебе уже объяснили, что invalid pointer value это не "значение", а "состояние".

никто ничего не меняет в самих указателях, когда ты делаешь delete.
изменяется состояние памяти, на которую они указывают: была чья-то, стала - свободна.

Поскольку память освободили, то все указатели, которые смотрели в эту точку теперь смотрят на освобожденный кусок памяти, работать с которым им запрещают законы языка/ОС и здравого смысла.

Возможно, я знаю откуда проистекает твое непонимание этого вопроса.
По всей видимости, ты считаешь, что указатель - это такая сущность, которая всегда разделяет свое состояние с другими указателями, если они смотрят совместно в одну и ту же область памяти.

Но это не так!

Указатель - это, прежде всего, переменная! Иначе где и как бы он хранил свой адрес?
Если ты создал экземпляр второго указателя p2, значит ты потратил память стека на хранение его значения, а не создал 2-ой указатель, который разделяет память первого!

Если ты согласен с этим утверждением, то ты поймешь, что значение 2 или более переменных, пусть даже это одинаковые значения, не получится изменить сразу, как только мы поменяли значение первой из них.

Если переформулировать твой пример, с учетом вышесказанного, то
Код: plaintext
1.
2.
3.
int n = 3;
int x = n;
n = 0;

когда x станет 0?

никогда!
потому что x - это копия n, а не n

p2 является копией p1, также как и x является копией n, поэтому, когда менеджер памяти тебе возвращает указатель, он не может знать что ты с ним делаешь. Потому что у тебя своя копия, а у него - его личная.

Чтобы изменились все указатели сразу, как только ты делаешь delete, нужно чтобы они разделяли свое состояние, а не были копиями. Единственное что разделяют эти указатели - это адрес памяти, куда они смотрят.

Сдвинь p1 на 1 байт, p2 при этом никак не изменит своего значения!
Он по-прежнему будет смотреть туда же, куда и смотрел до этого.

Сдвиг изменяет значение того указателя, к которму он применен, а delete изменяет "значение" памяти, на которую указатели смотрят. Но поскольку "изменение памяти" при delete носит скорее логический смысл чем физический (ячейки же на плате не сгорают), то invalid pointer value, следует интерпретировать как состояние указателей, которые стали смотреть на освобожденную память, но их фактические адреса никак не пострадали от этого - они по преженему смотрят туда же, куда смотрели до вызова delete.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881973
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа в коде бывают UB. Я тебе показал частный случай чтобы ты понял что указатель это целое число
которое указывает на ячейку памяти. И никакого признака invalid pointer value оно внутри себя
не хранит потому что хренить этот признак негде. Это простая логика для которой не нужно
читать стандарты.Насколько мне известно, разным значениям не обязано соответствовать разное представление этих значений. (Т.е. 2 объекта, хранящие 2 различных значения не обязаны побитово различаться).
maytonХотя есть еще и значение NULL. Но в данном частном примере мы наблюдали забавное поведение
когда компиллятор GCC в дефолтном режиме настроек ничего не обнулял и не инвалидировал.Как ты сам сказал, признака invalid pointer value может и не храниться "внутри". Как ты тогда определил, инвалидировал он или не инвалидировал?
maytonСтандарты читай. Читай и проверяй.Относительно чего проверять стандарт?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881974
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisОтносительно чего проверять стандарт?

Относительно реальности, данной нам в ощущениях.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881975
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumтебе уже объяснили, что invalid pointer value это не "значение", а "состояние".Правда, не сказали, откуда это взято. Где в стандарте это написано.
А я, в отличие от, указал, где сказано, что это "значение". В [basic.compound]/3. Прилагаю релевантный скрин
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881976
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisinvalid pointer value может и не храниться "внутри". Как ты тогда определил, инвалидировал он или не инвалидировал?

Я распечатал длину указателя 8 байтов. И его содержимое. Целое. Гребаное целое число из 8 байтов.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881977
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisне сказали, откуда это взято. Где в стандарте это написано.

Там, где даётся определение понятию "invalid pointe value".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881978
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZ axisinvalid pointer value может и не храниться "внутри". Как ты тогда определил, инвалидировал он или не инвалидировал?

Я распечатал длину указателя 8 байтов. И его содержимое. Целое. Гребаное целое число из 8 байтов.Это не значит что значение указателя это число.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881979
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisПравда, не сказали, откуда это взято. Где в стандарте это написано.
А я, в отличие от, указал, где сказано, что это "значение". В [basic.compound]/3. Прилагаю релевантный скрин
и чему же равно invalid pointer value согласно горячо любимому стандарту?
я тебе открою тайну: документацию далеко не всегда пишет тот же, кто каждый день пишет программы, поэтому оставим на совести тех, кто выдумал этот термин и его необъяснимое значение, о котором все столько говорят, но никто его не видел.

Если бы все в стандарте было гладко, то некоторые конференции и доклады не строились на том, что в стандарте полно неточностей и разночтений, другими словами частично стандарт уже не торт:

YouTube Video
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881980
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisЭто не значит что значение указателя это число.

В подавляющем большинстве современных компьютеров - значит. Исключением являются только
астрально-квантовые компьютеры, существующие исключительно в теоретических в лабораториях
и аналоговые, доживающие свой век на помойках.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881981
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovZ axisне сказали, откуда это взято. Где в стандарте это написано.

Там, где даётся определение понятию "invalid pointe value".
А оно должно где-то даваться? Это базовое понятие.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881982
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumZ axisПравда, не сказали, откуда это взято. Где в стандарте это написано.
А я, в отличие от, указал, где сказано, что это "значение". В [basic.compound]/3. Прилагаю релевантный скрин
и чему же равно invalid pointer value согласно горячо любимому стандарту?Что значит "чему равно"?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881983
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisА оно должно где-то даваться?

Да.

Z axisЭто базовое понятие.

Нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881984
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisЧто значит "чему равно"?
как я могу обнаружить что один указатель invalid pointer, а другой, скажем, nullptr или 0x12345678?

Как компилятор должен изменить указатель, чтобы было понятно что он стал invalid, если invalid pointer носит семантику value
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881985
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumкак я могу обнаружить что один указатель invalid pointer, а другой, скажем, nullptr или 0x12345678?

Как компилятор должен изменить указатель, чтобы было понятно что он стал invalid, если invalid pointer носит семантику value
Код, создаваемый компилятором MSVS, после delete сбрасывает значение указателя куда-то в адреса до 2^16, дабы попытка повторного обращения обращение по этому указателю вызывала предсказуемую ошибку... :), но сие, кмк, тоже не особо документировано.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881986
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёКод, создаваемый компилятором MSVS, после delete сбрасывает значение указателя куда-то в
адреса до 2^16, дабы попытка повторного обращения обращение по этому указателю вызывала
предсказуемую ошибку... :)

А почему не в nullptr? Скорее это выглядит как побочный эффект оптимизации при
использовании регистровых переменных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881988
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovёёёёёКод, создаваемый компилятором MSVS, после delete сбрасывает значение указателя куда-то в
адреса до 2^16, дабы попытка повторного обращения обращение по этому указателю вызывала
предсказуемую ошибку... :)

А почему не в nullptr? Скорее это выглядит как побочный эффект оптимизации при
использовании регистровых переменных.

Может, какое-то волшебное значение?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881989
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С опциями компиллятора -fsanitize=null -fsanitize=address

Адрес указателя по прежнему не меняется. Но появляется некий дополнительный механизм
контроля в рантайме.

Пока никак не комментирую.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <stdio.h>

int main()
{
  int* p1 = new int{};
  int* p2 = p1;
  printf("Sizeof pointer = %lu bytes\n", sizeof(p1));
  printf("Physicall value of pointers before 'delete' = %016lx\n", p1);
  delete p1;
  printf("Physicall value of pointers after 'delete' = %016lx\n", p1);
  printf("Trying to de-reference of the pointer. int value = %i\n", *p1);
}



Код: plaintext
1.
$ c++ -fsanitize=null -fsanitize=address probe.cpp -o probe-fsanitize.exe




Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
$ ./probe-fsanitize.exe 
Sizeof pointer = 8 bytes
Physicall value of pointers before 'delete' = 0000602000000010
Physicall value of pointers after 'delete' = 0000602000000010
=================================================================
==17742==ERROR: AddressSanitizer: heap-use-after-free on address 0x602000000010 at pc 0x561f8f39be04 bp 0x7ffda69603f0 sp 0x7ffda69603e0
READ of size 4 at 0x602000000010 thread T0
    #0 0x561f8f39be03 in main (/home/mayton/sql.ru/zakis/probe-fsanitize.exe+0xe03)
    #1 0x7f21a1352b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
    #2 0x561f8f39bc09 in _start (/home/mayton/sql.ru/zakis/probe-fsanitize.exe+0xc09)

0x602000000010 is located 0 bytes inside of 4-byte region [0x602000000010,0x602000000014)
freed by thread T0 here:
    #0 0x7f21a25249d8 in operator delete(void*, unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xe19d8)
    #1 0x561f8f39bd9c in main (/home/mayton/sql.ru/zakis/probe-fsanitize.exe+0xd9c)
    #2 0x7f21a1352b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)

previously allocated by thread T0 here:
    #0 0x7f21a2523458 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xe0458)
    #1 0x561f8f39bcfc in main (/home/mayton/sql.ru/zakis/probe-fsanitize.exe+0xcfc)
    #2 0x7f21a1352b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)

SUMMARY: AddressSanitizer: heap-use-after-free (/home/mayton/sql.ru/zakis/probe-fsanitize.exe+0xe03) in main
Shadow bytes around the buggy address:
  0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c047fff8000: fa fa[fd]fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==17742==ABORTING

...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881992
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реакция на де-референс со стороны кода собранного Clang++ (опции -O1 -g -fsanitize=address -fno-omit-frame-pointer)

Тоже самое.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881993
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОМГ, кто то решил без подготовки читать Стандарт =)
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881994
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли значение стало другим (invalid pointer value)Оно не стало другим, просто то место, куда они указывали, стало невалидным.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881995
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglавторЕсли значение стало другим (invalid pointer value)Оно не стало другим, просто то место, куда они указывали, стало невалидным.
Уже шестой круг.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881997
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День сурка пора закрыть.

Кто за?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39882000
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДень сурка пора закрыть.

Кто за?Абсолютно за.
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / В какой указатель запись будет произведена первой?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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