Форум программистов, компьютерный форум CyberForum.ru

IsBadPtr - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2012, 09:03     IsBadPtr #1
Почему то code blocks не знает такой функции, а гугл предлагает объявить такой макрос для проверки на равенство NULL. Эта функция не существует? Если указатель не равен NULL, можно ли под Windows проверить, действительно ли указывает он на выделенную память?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2012, 17:17  [ТС]     IsBadPtr #21
Внутри одной проги это не нужно, достаточно простой аккуратности. А вот если библиотечная функция принимает параметры по указателям, то здесь вызывающую приладу она не контролирует.

Добавлено через 28 секунд
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Попробовать обратиться к памяти и перехватить SEH-исключение Access Violation?
А по-подробней нельзя?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.12.2012, 17:31     IsBadPtr #22
Цитата Сообщение от taras atavin Посмотреть сообщение
А по-подробней нельзя?
У меня Студии нет, проверить не могу. Не уверен, что это вообще скомпилится.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <windows.h>
 
bool isValid(const void *ptr)
{
    __try {
        char b = *((char*)ptr);
    }
    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? 
             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        return false;
    }
    return true;
}
 
int main()
{
    int *valid = new int;
    int *invalid = valid + 100500;
    std::cout << isValid(valid) << " " << isValid(invalid);
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2012, 17:57  [ТС]     IsBadPtr #23
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
У меня Студии нет,
Ну и что? Я тоже кодаблоками компилю.

Добавлено через 12 минут
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|13|error: expected 'catch' before '__except'|
. А
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool IsBadPtr(int *p)
{
 int t;
 try
 {
  t=*p;
  *p=!t;
  *p=t;
   return false;
 }
 catch (...)
 {
  return true;
 } 
}
вылетает.

Добавлено через 6 минут
И даже
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|15|error: '__except' was not declared in this scope|
.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,915
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 18:14     IsBadPtr #24
Цитата Сообщение от taras atavin Посмотреть сообщение
И даже
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|15|error: '__except' was not declared in this scope|
если не ошибаюсь, то __except есть только в студии
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.12.2012, 19:07     IsBadPtr #25
gcc SEH не умеет. Ещё, по идее, можно так проверить (с WinAPI не дружу, собрано из гугла).
C++
1
2
3
4
5
6
7
8
9
10
bool isValid(const void *ptr)
{
    HANDLE itself = OpenProcess(PROCESS_VM_READ,
                                FALSE,
                                GetCurrentProcessId());
    int data;
    bool result = ReadProcessMemory(itself, ptr, &data, 1, NULL);
    CloseHandle(itself);
    return result;
}
Вот только память процессам выделяется целыми страницами. И malloc()/new() обычно заранее отхапывают себе пул памяти, чтобы потом из него выделять. Естественно, при доступе к памяти из уже выданных страниц никаких ошибок не будет, хоть формально malloc/new эту память приложению ещё не выдали. Боюсь, точная проверка требует знания конкретных реализаций аллокаторов.
Yandex
Объявления
04.12.2012, 19:07     IsBadPtr
Ответ Создать тему
Опции темы

Текущее время: 16:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru