LINUX.ORG.RU

Как проверить указатель на валидность?

 


0

4
        int32_t qid = MimirQuery2(HERE, fileread(cooldown), hall_id);
        int32_t * value;

        MGetValue(qid, 0, 0, (void**)&value, NULL);
        result = *value;

        MFree(qid);

Периодически в value ерунда вместо указателя и система валится по sigsegv. Как определить валидность указателя?

Может, нужно код возврата MGetValue() проверять, и если там ошибка, не пользоваться указателем? И вообще, хер знает, что делает твой код.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

Не важно что конкретно он делает в контексте вопроса - по сути это обертка для mysql

someoneelsenotme
() автор топика

Как определить валидность указателя?

Что такое валидность указателя?

Есть классический способ проверить, может ли процесс писать по этому адресу: http://stackoverflow.com/a/14437277 , но лучше наверное позапускать программу под валгриндом и разобраться что там такое происходит

Deleted
()

Чисто технически, тебе надо получить от ядра page table твоего процесса и проверить, есть ли там твой адрес.

Практически - я бы куда-нибудь в /proc/$pid/maps и /proc/$pid/pagemap заглянул.

Stanson ★★★★★
()

Если у тебя всплывают невалидные указатели - значит ты делаешь что-то wrong

mittorn ★★★★★
()
Ответ на: комментарий от someoneelsenotme

Не важно что конкретно он делает в контексте вопроса - по сути это обертка для mysql

Лол.

В многопоточных приложениях нельзя

Два раза лол.

Судя по всему, твоя галимая обёртка иногда не выделяет память. Если это твоя — сделай так, чтобы она возвращала код ошибки, когда память не выделена. Если не твоя — проверь API, может, она уже так может делать.

Плюс да, есть Valgrind.

Если ты хочешь проверить напрямую, валиден ли указатель, ты что-то делаешь не так. Правильность указателя должна рассматриваться в контексте того кода, который им манипулирует, а не отдельно абстрактно. Не учись писать говнокод смолоду.

post-factum ★★★★★
()
Последнее исправление: post-factum (всего исправлений: 1)
Ответ на: комментарий от Stanson

Чисто технически, тебе надо получить от ядра page table твоего процесса и проверить, есть ли там твой адрес.

Практически - я бы куда-нибудь в /proc/$pid/maps и /proc/$pid/pagemap заглянул.

Тут надо бы добавить, что валидность адреса не гарантирует, что по тому адресу лежит именно то, что ты ожидаешь увидеть.

Deleted
()
Ответ на: комментарий от Deleted

Тут надо бы добавить, что валидность адреса не гарантирует, что по тому адресу лежит именно то, что ты ожидаешь увидеть.

Ну какой вопрос - такой ответ. :)

Можно ли в линуксах проверить указатель на валидность? Можно.

Если ТСу хочется граблей и припарок для лечения мёртвых - их есть у меня. :)

Stanson ★★★★★
()
Ответ на: комментарий от neon1ks
#include <stdio.h>
#include <stdlib.h>
#include <sysexits.h>

int main(int _argc, char** _argv)
{
        int* p1;
        int* p2 = malloc(sizeof(int));
        int* p3 = NULL;

        *p2 = 42;

        free(p2);

        printf("%p\n", (void*)p1);
        printf("%p\n", (void*)p2);
        printf("%p\n", (void*)p3);

        exit(EX_OK);
}
[~]$ ./a.out 
0x4004e0
0x1101010
(nil)

Понимаешь?

post-factum ★★★★★
()

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

Bad_ptr ★★★★★
()

Ты б для начала свой value проинициализировал как NULL.

joy4eg ★★★★★
()

как проверишь на валидность, то не выкладывай на гитхаб - нарушишь лицензию

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.