Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка указателей на валидность 
:(
    Опции темы
MAKCim
Дата 6.11.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alexeis @  5.11.2007,  23:54 Найти цитируемый пост)
а как тогда объяснить причину ошибки "Data Type Misalignment", которая возникает при попытке обратиться по нечетному адресу и при включении директивы  pragma pack(0) Значит так оптимальнее или еще по чему. Мож гляуть в хелп.

установка AM в CR0 и AC в EFLAGS включает генерацию #AC (Alignment Check) в случае обращения по невыровненным адресам
но это никак не связано с оптимизацией
обработка исключительной ситуации на уровне процессора куда менее эффективное средство для достижения оптимального результата
 
Цитата(Alexeis @  5.11.2007,  23:54 Найти цитируемый пост)
С массивами я же говорил все ок. Видимо так он и делает. Для элементов массивов можно использовать нечетные.

здесь массив не причем
смысл инструкции - прочитать байт в регистр, размер которого превышает 8 разрядов (с нулевым расширением до полного размера)
это к вопросу о дополнительных манипуляциях


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 6.11.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(MAKCim @  6.11.2007,  10:10 Найти цитируемый пост)
установка AM в CR0 и AC в EFLAGS включает генерацию #AC (Alignment Check) в случае обращения по невыровненным адресам
но это никак не связано с оптимизацией
обработка исключительной ситуации на уровне процессора куда менее эффективное средство для достижения оптимального результата

  Почему? Разве эффективнее делать 10 проверок чем одну обработку исключения?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 6.11.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alexeis @  6.11.2007,  10:34 Найти цитируемый пост)
Почему? Разве эффективнее делать 10 проверок чем одну обработку исключения? 

хорошо
а как ты отличишь обращение к элементу массива от, например, обращения к полю структуры?
каждый раз компилятор вынужден будет встявлять куски кода по установке и сбросу AC
это более эффективно?

Это сообщение отредактировал(а) MAKCim - 6.11.2007, 10:58


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 6.11.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



MAKCim, ну мой текущий компилятор это как-то делает, хотя у меня создается впечатление, что для массивов он использует другую схему обращения при этом избегает нечетных адресов. 
Цитата(MAKCim @  6.11.2007,  10:57 Найти цитируемый пост)
хорошо
а как ты отличишь обращение к элементу массива от, например, обращения к полю структуры?

  Думаю он использует для этого разные команды.

  По крайней мере с вероятностью 50/50 можно определить, то что указатель невалидный. Чем раньше об этом узнаешь тем ближе окажешься к источнику ошибки. Так что положительный момент в этом есть. Вот только я не уверен, можно ли организовать такую же схему для i486.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 6.11.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  6.11.2007,  11:21 Найти цитируемый пост)
MAKCim, ну мой текущий компилятор это как-то делает

Дельфи? IIRC, он программно полностью контролирует доступ к памяти(в дебаге).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 6.11.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



archimed7592, я сейчас говорю про eVC.

Добавлено @ 11:46
Мы же в разделе С++. С чего бы тут обсуждать компилятор Делфи...
[оффтоп]У делфей такие проблемы возникают намного реже, так как там строки/массивы/интерфейсы это управляемая память. Зря напомнили  smile , ща как разведу оффтопа[/оффтоп]


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 6.11.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alexeis @  6.11.2007,  11:21 Найти цитируемый пост)
Думаю он использует для этого разные команды.

 smile 
не в команде дело
если у нее есть адресный операнд, то в любом случае существует возможность исключения
если чтение/запись массива выполняется по выровненным адресам, то тогда требуются дополнительные телодвижения для того, чтобы прочитать/записать данные
а ты вроде сам писал
Цитата(Alexeis @  5.11.2007,  23:54 Найти цитируемый пост)
Я имел ввиду, что для того чтобы считать значение нужно производить битовую операцию. Это дольше чем просто обратиться! 

где оптимизация?  smile 



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 6.11.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



MAKCim ну с асмом мне работать не приходиться, тем более с его различными спецификами, потому даж не знаю как. Читал, что выравнивание делается в целях оптимизации. А как тут без понятия. Если хош могу показать кусок асма. Ща попробую. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 6.11.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alexeis @  6.11.2007,  11:57 Найти цитируемый пост)
Если хош могу показать кусок асма. Ща попробую

давай


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  6.11.2007,  11:57 Найти цитируемый пост)
Читал, что выравнивание делается в целях оптимизации.

Не только, особенно, если речь про eVC - многие архитектуры не поддерживают обращение по невыровненому адресу.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 6.11.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Код

596:      byte *b = new byte[50];

1205630A   mov       r0, #50
1205630C   bl        |CreateStaticMapping+18h (1208a930)|
12056310   str       r0, [sp, #0x48]
12056312   ldr       r1, [sp, #0x48]
12056314   str       r1, [sp, #0x20]
12056316   ldr       r0, [sp, #0x20]
12056318   str       r0, [sp, #0x18]

597:      b[1] = 4;

1205631A   ldr       r0, [sp, #0x18]
1205631C   mov       r1, #4
1205631E   strb      r1, [r0, #1]

598:      b[2] = 4;

12056320   ldr       r2, [sp, #0x18]
12056322   mov       r0, #4
12056324   strb      r0, [r2, #2]




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 6.11.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Alexeis
Цитата(Alexeis @  6.11.2007,  12:29 Найти цитируемый пост)
1205630A   mov       r0, #50
1205630C   bl        |CreateStaticMapping+18h (1208a930)|
12056310   str       r0, [sp, #0x48]

неизвестно, какое значение в r0 после bl
поэтому неизвестно, какой адрес получается в этом месте (r0 + 1)
Цитата(Alexeis @  6.11.2007,  12:29 Найти цитируемый пост)
1205631E   strb      r1, [r0, #1]

и в этом
Цитата(Alexeis @  6.11.2007,  12:29 Найти цитируемый пост)
12056324   strb      r0, [r2, #2]

в не зависимости от базового адреса массива x
из двух адресов x + 1 и x + 2 по определению как минимум один из них - не кратен 4-м
Добавлено @ 12:49
Alexeis
ассемблер похож на MIPS
оно?

Это сообщение отредактировал(а) MAKCim - 6.11.2007, 12:54


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
pompei
Дата 6.11.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Как видишь проверка указателя на валидность очень сложная задача. А раз так то постарайтся поступить по простому, постарайся избежать её. Например с помощью такого метода: прими что = 0 (NULL) - это инвалидный указатель, остальные валидные. Тогда получается необходимо всегда писать так:
Код


// Берём ресурсы
MY_STRU *my_pointer = malloc( размер );
if (my_pointer == NULL) { // по спецификации malloc возвращает NULL в случае ошибки
  perror( "А-а-а-а-а-а" );
  exit( 1 );
}

//освобождаем ресурс
if (my_pointer != NULL) {
  free( my_pointer );
  my_pointer = NULL; // чтобы указать что он инвалидный
}

// работаем с указателем
if (my_pointer == NULL) {
  //указатель инвалидный
} else {
  // пользуемся валидным указателем
  my_pointer->...
}



--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
Lazin
Дата 6.11.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(pompei @  6.11.2007,  13:56 Найти цитируемый пост)
прими что = 0 (NULL) - это инвалидный указатель, остальные валидные

это неверно, если указатель не равен 0, это не значит что он валидный, указатель может указывать неизвестно куда, например в адресное пространство другого процесса. Я уже писал, что есть функции для проверки, указывает ли указатель на область памяти в куче или хрен знает куда (IsBadWritePtr IsBadReadPtr, итд, смотри MSDN). Но даже если он указывает на объект в куче, это еще не значит что он правильный, так как может указывать на уже удаленный объект.
Обычно указатели инициализируют 0, и после удаления объекта обнуляют указатель, чтобы по значению указателя можно было узнать указывает ли он на объект или нет.
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 6.11.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



есть решение под Linux (но немного извращенное) 
Код

int is_valid_pointer(void * address) {
    size_t size = (size_t)getpagesize();
    unsigned long pointer = (unsigned long)address;
    void * handle;
    if ((handle = mmap((void*)(pointer - ponter % size), size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS, -1, 0)) == MAP_FAILED)
        return 0;
    munmap(handle, size);
    return 1;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1269 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.