Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

IsBadPtr

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

Студворк — интернет-сервис помощи студентам
Почему то code blocks не знает такой функции, а гугл предлагает объявить такой макрос для проверки на равенство NULL. Эта функция не существует? Если указатель не равен NULL, можно ли под Windows проверить, действительно ли указывает он на выделенную память?
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.12.2012, 17:17  [ТС]
Студворк — интернет-сервис помощи студентам
Внутри одной проги это не нужно, достаточно простой аккуратности. А вот если библиотечная функция принимает параметры по указателям, то здесь вызывающую приладу она не контролирует.

Добавлено через 28 секунд
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Попробовать обратиться к памяти и перехватить SEH-исключение Access Violation?
А по-подробней нельзя?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
04.12.2012, 17:31
Цитата Сообщение от 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
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.12.2012, 17:57  [ТС]
Цитата Сообщение от ~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
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
04.12.2012, 18:14
Цитата Сообщение от taras atavin Посмотреть сообщение
И даже
C:\tsserver\Projects\cpp\codeblocks\test \test.cpp|15|error: '__except' was not declared in this scope|
если не ошибаюсь, то __except есть только в студии
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
04.12.2012, 19:07
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru