![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Litkevich Yuriy |
![]()
Сообщение
#1
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
написал такой код:
указатель не инициализирован, delete два раза, а прога работает без ошибок ![]() компилер: MinGW |
|
|
![]() |
AD |
![]()
Сообщение
#2
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Tonal |
![]()
Сообщение
#3
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
А какие ошибки ты ожидаешь?
Работа с невалидным указателем и его удаление - это UB. Т.е. программа может вести себя как угодно. Может выкинуть AV, может диск отформатировать, а может и ничего не произойти. ![]() Причём для разных запусков поведение может отличатся. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Tonal |
![]()
Сообщение
#5
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
UB - неопределённое поведение.
AV - access violation - нарушение доступа к памяти. О некоторых конструкциях/случаях, таких как у тебя например, в стандарте написано, что поведение неизвестно. Т.е. поведение программы, с UB не регламентируется стандартом, и может зависеть от каких угодно факторов. Т.к. в твоей программе UB на каждой строчке, то для неё не существует "правильного" или хотя бы предсказуемого с точки зрения С++ поведения. Хорошо зная компилятор и систему иногда можно предсказать её поведение. Но к стандарту С++ оно не имеет никакого отношения. P.S. Собрал на g++-dw2 (GCC) 4.2.1-dw2 (mingw32-2) - получил AV |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
я компилил:
g++ (GCC) 3.4.5 (mingw special) |
|
|
Andrew Selivanov |
![]()
Сообщение
#7
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
А какие ошибки ты ожидаешь? Работа с невалидным указателем и его удаление - это UB. Т.е. программа может вести себя как угодно. Может выкинуть AV, может диск отформатировать, а может и ничего не произойти. ![]() Причём для разных запусков поведение может отличатся. Ну вот насчет диск отформатировать, это ты пожалуй погорячился :-) это нужно выйти на уровень драйверов или хотя-бы вызвать API нужное, да еще и с правильными параметрами ![]() |
|
|
Tonal |
![]()
Сообщение
#8
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Вероятность конечно мала, но всё таки есть.
Возможный сценарий: 1) Вызов delete для неинициализированного указателя портит стек в районе адреса возврата из функции. 2) Новый адрес возврата указывает на вызов system, а слово, котороое адресует параметр, указывает на строку "format c:". Т.е. у тебя в проге естественно такого кода не было. но функция system или аналогичная всяко есть. Да и строка легко могла собраться из мусора даже без ударов по памяти. ![]() Собственно так и работают всяческие эксплоиты. ![]() Сообщение отредактировал Tonal - 7.5.2008, 10:57 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#9
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Tonal |
![]()
Сообщение
#10
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
портит стек в районе адреса возврата из функции. а чё Ось при этом ковыряется в носу? ведь есть всякие MMU и т.д. должно сгенерится "нарушение доступа к памяти" А при чём тут ось то? Стек - вполне легальное место для писания. Где ты думаешь у тебя локальные переменные живут? Ось только следит чтобы стек не переполнился, и нужные страницы в памяти сидели - остальное забота программы. ![]() Сообщение отредактировал Tonal - 7.5.2008, 13:01 |
|
|
![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 14.7.2025, 10:50 |