Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

IsBadPtr - C++

04.12.2012, 09:03. Просмотров 1223. Ответов 24
Метки нет (Все метки)

Почему то code blocks не знает такой функции, а гугл предлагает объявить такой макрос для проверки на равенство NULL. Эта функция не существует? Если указатель не равен NULL, можно ли под Windows проверить, действительно ли указывает он на выделенную память?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
04.12.2012, 16:39 #16
taras atavin, Вы о чем вообще? ОС не может забрать память, которая уже была выделена программе оператором new, если программа явно не освободила ресурс оператором delete. К примеру, Вы запросили 100 мегабайт, ОС их выделила, и теперь они принадлежат программе, ОС не сможет их забрать просто так обратно. И не важно, используются они в программе или нет.
0
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,669
04.12.2012, 16:40 #17
ссылку на что?
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2012, 16:41  [ТС] #18
Ты ещё и упираешься? Памятью ведает ось.

Добавлено через 17 секунд
Цитата Сообщение от vxg Посмотреть сообщение
ссылку на что?
На "как бы".
0
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,669
04.12.2012, 16:47 #19
вот когда-то столкнувшись с утечками памяти пытался нагородить вот такой велосипед. в памяти не отложилось допилил ли я его до конца. в любом случае он не будет ловить выделение памяти вне компилируемого кода, выделение памяти через alloc, указатели на память не являющуюся динамически выделенной и вызовы с явным указанием родного метода new. плюнул и поставил галочку в настройках проекта напротив CodeGuard - собранный таким образом проект быстро стал меня информировать о том где был лишний delete или доступ по некорректному адресу
0
Вложения
Тип файла: rar mem_tracker.rar (738 байт, 5 просмотров)
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.12.2012, 17:10 #20
Попробовать обратиться к памяти и перехватить SEH-исключение Access Violation?
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2012, 17:17  [ТС] #21
Внутри одной проги это не нужно, достаточно простой аккуратности. А вот если библиотечная функция принимает параметры по указателям, то здесь вызывающую приладу она не контролирует.

Добавлено через 28 секунд
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Попробовать обратиться к памяти и перехватить SEH-исключение Access Violation?
А по-подробней нельзя?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.12.2012, 17:31 #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);
}
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2012, 17:57  [ТС] #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|
.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
04.12.2012, 18:14 #24
Цитата Сообщение от taras atavin Посмотреть сообщение
И даже
C:\tsserver\Projects\cpp\codeblocks\test\test.cpp|15|error: '__except' was not declared in this scope|
если не ошибаюсь, то __except есть только в студии
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.12.2012, 19:07 #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 эту память приложению ещё не выдали. Боюсь, точная проверка требует знания конкретных реализаций аллокаторов.
0
04.12.2012, 19:07
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru