2012-12-05 8 views
5

Szybkie pytanie - czy istnieje dobry sposób na znalezienie zastosowań == z obiektami zamiast isEqual:?Jak znaleźć nieumyślne porównania wskaźnika obiektu?

Pełna historia:

miałem kilka kodu rodzaju jak ten:

typedef long DataKey; 

DataKey x; 
DataKey y; 

if (x == y) { 
    // do stuff 
} 

Mam teraz potrzebę zastąpienia używając long dla mojego DataKey z obiektem. Po utworzeniu klasy i robi kilka globalnego wyszukiwania i zastąpić mój kod teraz jest trochę tak:

@interface DataKey : NSObject 

DataKey *x; 
DataKey *y; 

if (x == y) { // uh-oh - this is now bad 
    // do stuff 
} 

Czy istnieje ostrzeżenie mogę włączyć w kompilator, który ostrzega o użyciu skalarnych operatorów w wskaźnikami? Używam Xcode 4.5.2 z kompilatorem LLVM 4.1. Nie byłem w stanie go znaleźć.

Jakieś inne sugestie, które pomogą naprawić ten kod? To nie jest trywialna podstawa kodu. Istnieją setki plików źródłowych do rozwiązania. Jest to główny wysiłek związany z refaktoryzacją.

Edit:

Byłoby wspaniale, gdyby nie było ostrzeżenie podobnie jak podczas korzystania zadanie w if stanie zamiast porównania. Możesz otrzymać ostrzeżenie i użyć nawiasów, aby zatrzymać ostrzeżenie.

Aktualizacja:

oparciu o sugestie w komentarzach, dodałem opcję -Weverything kompilator projektu badawczego. Nie przyniosło to pożądanego rezultatu przy porównywaniu dwóch wskaźników obiektów z ==.

Możliwe, że można uzyskać połączenie C++, przeciążenie metody operator== i uzyskanie ostrzeżenia/błędu kompilatora podczas próby użycia tego operatora. Mogę opublikować kolejne pytanie dotyczące tej opcji.

+0

Dobre pytanie. Jak o [sprawdzanie, czy jest to prawidłowy wskaźnik] (http://www.cocoawithlove.com/2010/10/testing-if-arbitrary-pointer-is-valid.html), a następnie dodanie niestandardowego ostrzeżenia kompilatora jako '# ostrzeżenie niektórych tekstu ". Nie masz pewności, że tego właśnie szukasz. – iDev

+0

@ACB Nie jestem pewien, w jaki sposób informacje z tego łącza mogą być stosowane tutaj. Szukam (najlepiej) sprawdzenia czasu kompilacji. Ten link służy do sprawdzania czasu wykonywania. – rmaddy

+0

Byłoby to rozsądną opcją kompilatora, ale nigdy takiego nie widziałem i nie mogę od razu pomyśleć o jakiejkolwiek makrowej sztuczce lub czymkolwiek, by wymusić błędy. –

Odpowiedz

2

Jestem prawie pewien, że nie ma takiego ostrzeżenia, ponieważ porównywanie wskaźników dla równości jest dość powszechne i nie wszystko, co zwykle robi się błędnie. Najlepszym rozwiązaniem będzie niestety przejście w dowolne miejsce, w której mogą być używane funkcje DataKeys i wyszukiwanie ==. Niezbyt fajnie, wiem.

+3

Na podstawie liczby pytań dla początkujących na SO, gdzie próbują porównać dwa obiekty 'NSString' używając' == ', musiałem się nie zgodzić, że używanie' == 'przez pomyłkę nie jest powszechne. Założę się, że jest tak powszechne, jak przypadkowe użycie przypisania w warunku zamiast porównania i istnieje wsparcie kompilatora dla tego problemu. – rmaddy

+2

@rmaddy: Przypuszczam, że Chuck oznacza, że ​​porównywanie wskaźników dla równości jest również bardzo powszechne; mając na uwadze, że przypisanie w oświadczeniu warunkowym jest zwykle błędem. – mipadi

+0

@mipadi I mówię, że nie zgadzam się, że porównywanie wskaźników dla równości jest powszechne. Przynajmniej w moim własnym kodzie jest to bardzo rzadkie. Zawsze dodajemy komentarz, aby było jasne, że naprawdę chcę porównać przy użyciu '=='. W rzeczywistości, w prawie 200k lini kodu, robię to raz. Nie mam wątpliwości, że inni robią to częściej. – rmaddy

Powiązane problemy