Как проверить, указывает ли указатель void на произвольно низкий адрес? - PullRequest
0 голосов
/ 15 марта 2019

В моей программе установлен сбой, потому что в какой-то момент значение указателя устанавливается на 0x11. Я понятия не имею, почему или как это происходит, и код будет слишком длинным, чтобы публиковать здесь. Итак, я хотел бы проверить и избежать этого случая, когда указатель указывает на 0x11.

Прямо сейчас, у меня есть if (ptr != 0), что хорошо, потому что он проверяет NULL-указатели. Но он не проверяет этот случайный сломанный указатель. Я пробовал if (ptr <= 0x11), а также пробовал приводить ptr к различным типам (long, int и т. Д.), Но он никогда не ловит его.

Есть ли способ перехватить этот указатель, чтобы оператор if возвращал false?

Редактировать: ptr имеет тип void*

1 Ответ

2 голосов
/ 15 марта 2019

Как писал Сергей А в комментариях, ваш подход неверен.Вы не должны искать конкретное значение 0x11.Гораздо более вероятно, что указатель просто имеет это значение.

Я предлагаю вам скомпилировать с gcc -Wall -Wextra -pedantic и обратить внимание на все предупреждения.Я бы особенно искал неинициализированные переменные.Помните, что указатели не будут автоматически инициализироваться нулем.Если они неинициализированы, они (вероятно) будут иметь любое значение, которое ранее было в памяти.Я говорю "возможно" , потому что компилятор может инициализировать их нулевым или даже другим значением, не нарушая стандарт Си.

Кроме того, как написал Евгений в комментарии, обнаружение того, что указатель имеет именно это значение, не решает вашу проблему.Если вам повезет, это может помочь вам найти проблему, но, скорее всего, это пустая трата времени.

Я мог бы упомянуть, что ваши тесты верны.Посмотрите на этот код:

#include <stdio.h>

int main()
{
    void *ptr = (void*)0x11;
    if(ptr == (void*)0x11) printf("ptr == 0x11\n");
    if(ptr <= (void*)0x11) printf("ptr <= 0x11\n");
    if(ptr <= (void*)0x10) printf("ptr <= 0x10\n");
}

Он выводит:

$ ./a.out 
ptr == 0x11
ptr <= 0x11

Как и ожидалось.Это означает, что ваш код имеет неопределенное поведение .

Еще одна вещь, которую вы могли бы сделать, - это сделать явную инициализацию для некоторого значения, которое вы выбираете самостоятельно.Посмотрите на этот код:

int main(int argc, char ** argv) {
    // 42 is 2a in hex, and 42 is a good random value
    char *ptr=(void*)0x2a; 


    // If any arguments are supplied to the program         if(argc > 1) {
        ptr = argv[1];
        printf("The first argument has address %p\n", (void*) ptr);
    }

    if(ptr == (void*) 0x2a)
        printf("Something fishy happened.\n");
}

Вывод:

$ ./a.out 
Something fishy happened.

$ ./a.out foo
The first argument has address 0x7ffca6323ad8

Хотя возможно, что адрес первого аргумента на самом деле равен 0x2a, это маловероятно.Я думаю, что это может быть очень хороший подход, чтобы найти, что не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...