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