Предупреждение gcc/g++ при сравнении адресов двух указателей вместо содержимого?

Предположим, у меня есть функция с вводом указателя

void f(int *a, int *b) {
    if (*a < *b) {
        printf("hello!\n");
    }
}

где *a < *b — правильное поведение.

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

a < b

когда a, b равны int *, компилятор предупредит меня?


person Tianyang Li    schedule 24.10.2015    source источник


Ответы (1)


Таких предупреждений быть не может, потому что a < b, где a и b являются указателями на int, является законным тестом, который ваш код мог бы выполнить в другом месте.

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

Вы можете рассмотреть возможность настройки GCC с помощью MELT, например. добавление #pragma для включения такого предупреждения (в некоторых выбранных местах), но вам потребуется некоторое время, чтобы реализовать само предупреждение. Я не уверен, что стоит тратить неделю своего времени на настройку GCC таким образом.

Технически стандарт C требует, чтобы a и b указывали внутри одного и того же агрегата (в противном случае это неопределенное поведение или, по крайней мере, неопределенное), но в большинстве систем вы можете сравнивать любые указатели одного и того же типа.

person Basile Starynkevitch    schedule 24.10.2015