crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Тема закрытаНачать новую тему
> new и delete, похоже я сегодня конкрктно туплю
Litkevich Yuriy
  опции профиля:
сообщение 5.5.2008, 15:47
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


написал такой код:
#include <iostream>
using namespace std;
int main()
{
    int *pb;

    *pb=3;

    cout << *pb;
    delete pb;
    cout << *pb;
    *pb=4;
    cout << *pb;
    delete pb;
    cout << *pb;
  return 0;
}

указатель не инициализирован, delete два раза, а прога работает без ошибок :sad2:
компилер: MinGW
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.5.2008, 15:50
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 5.5.2008, 16:47) *
написал такой код:
    *pb=3;
//
    *pb=4;

указатель не инициализирован, delete два раза, а прога работает без ошибок :sad2:
компилер: MinGW

Ты инициализируешь указатель конкретными адресами: адрес цифры 3, а потом цифры 4! Все и должно работать! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 6.5.2008, 7:22
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


А какие ошибки ты ожидаешь?

Работа с невалидным указателем и его удаление - это UB. Т.е. программа может вести себя как угодно. Может выкинуть AV, может диск отформатировать, а может и ничего не произойти. :)
Причём для разных запусков поведение может отличатся.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.5.2008, 8:44
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Tonal @ 6.5.2008, 11:22) *
UB, AV

Что это значит, у меня программа работает так как еслибы я инициализировал указатель переменной, а разве можно удалить то что уже удалили?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 6.5.2008, 10:24
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


UB - неопределённое поведение.
AV - access violation - нарушение доступа к памяти.

О некоторых конструкциях/случаях, таких как у тебя например, в стандарте написано, что поведение неизвестно.
Т.е. поведение программы, с UB не регламентируется стандартом, и может зависеть от каких угодно факторов.

Т.к. в твоей программе UB на каждой строчке, то для неё не существует "правильного" или хотя бы предсказуемого с точки зрения С++ поведения.

Хорошо зная компилятор и систему иногда можно предсказать её поведение. Но к стандарту С++ оно не имеет никакого отношения.

P.S. Собрал на g++-dw2 (GCC) 4.2.1-dw2 (mingw32-2) - получил AV
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.5.2008, 10:31
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я компилил:
g++ (GCC) 3.4.5 (mingw special)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 6.5.2008, 12:40
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Tonal @ 6.5.2008, 8:22) *
А какие ошибки ты ожидаешь?

Работа с невалидным указателем и его удаление - это UB. Т.е. программа может вести себя как угодно. Может выкинуть AV, может диск отформатировать, а может и ничего не произойти. :)
Причём для разных запусков поведение может отличатся.


Ну вот насчет диск отформатировать, это ты пожалуй погорячился :-) это нужно выйти на уровень драйверов или хотя-бы вызвать API нужное, да еще и с правильными параметрами 8)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 7.5.2008, 10:54
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Вероятность конечно мала, но всё таки есть.
Возможный сценарий:
1) Вызов delete для неинициализированного указателя портит стек в районе адреса возврата из функции.
2) Новый адрес возврата указывает на вызов system, а слово, котороое адресует параметр, указывает на строку "format c:".
Т.е. у тебя в проге естественно такого кода не было. но функция system или аналогичная всяко есть. Да и строка легко могла собраться из мусора даже без ударов по памяти. :)

Собственно так и работают всяческие эксплоиты. :)

Сообщение отредактировал Tonal - 7.5.2008, 10:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.5.2008, 11:14
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Tonal @ 7.5.2008, 14:54) *
портит стек в районе адреса возврата из функции.

а чё Ось при этом ковыряется в носу? ведь есть всякие MMU и т.д. должно сгенерится "нарушение доступа к памяти"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 7.5.2008, 12:59
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 7.5.2008, 15:14) *
Цитата(Tonal @ 7.5.2008, 14:54) *
портит стек в районе адреса возврата из функции.

а чё Ось при этом ковыряется в носу? ведь есть всякие MMU и т.д. должно сгенерится "нарушение доступа к памяти"

А при чём тут ось то? Стек - вполне легальное место для писания.
Где ты думаешь у тебя локальные переменные живут?

Ось только следит чтобы стек не переполнился, и нужные страницы в памяти сидели - остальное забота программы. :)

Сообщение отредактировал Tonal - 7.5.2008, 13:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 22:41