Co próbuję zrobić, to znaleźć wszystkie jawne odlewy z typu double lub float do dowolnego innego typu w niektórych plikach źródłowych, które posiadam. Czy jest to wbudowany sposób GCC, aby to zrobić? Język to C. Dzięki!Czy istnieje sposób na uzyskanie gcc lub clang, aby ostrzec na wyraźnych rzutów?
Odpowiedz
Ponieważ odlewy są wyraźnie prawny i we właściwy sposób wykonywać dziwne konwersji, to jest wysoce prawdopodobne, że gcc będzie zawierać opcję, aby ostrzec o nich
Zamiast tego, w zależności od tego, jak ogromne źródło jest, może być w stanie aby uciec:
grep '\(double|float\) ' *
aby podać wszystkie zmienne podwójne lub zmiennoprzecinkowe. Ponieważ c nie jest zwykłym językiem, nie jest trywialne (z narzędziami powłoki), aby przeanalizować to na liście zmiennych podwójnych lub zmiennoprzecinkowych, ale jeśli twoje źródło jest wystarczająco małe, zrobienie tego ręcznie jest łatwe.
grep '([^()]*)[()]*\(your list of variable names\)' *
Stamtąd pokażę ci wiele swoich odlewów.
-Wconversion
ostrzec za konwersje niejawne, które mogą zmienić wartość (double
są duże rodzaju) oraz -Wno-sign-conversion
wyłączyć ostrzeżenia o konwersjach między podpisanych i niepodpisanych liczb całkowitych (tak byłoby mniej niepotrzebnych ostrzeżeń). Jeszcze nie widzę żadnej alternatywy standardowego ...
najgorszym przypadku można szuka tych słów kluczowych bezpośrednio do plików źródłowych ...
Z tego co rozumiem, jawne konwersje nie zostaną przechwycone przez -Wkonwersję, w rzeczywistości są sposobem na pozbycie się ostrzeżeń. Zrobiłem kilka testów i okazało się, że jest to prawdą, więc muszę znaleźć inny sposób, aby to zrobić. – Chris
Pechowo, są pokazywane (przynajmniej wtedy, gdy próbowałem kilka miesięcy temu). Włączyłem funkcję "-Wconversion", aby przechwytywać konwersje _accidential__, a ilość szumów generowanych przez jawne (i zamierzone) konwersje była nie do zniesienia. – Damon
Dobrze myślę, że nie ma takiej opcji. W końcu ostrzeżenie jest wydawane przez kompilator, aby ostrzec cię przed tym, co zrobiłbyś nieumyślnie. Jednak wyraźna obsada jest w zasadzie sposobem na powiedzenie kompilatorowi "zamknij się, wiem, co robię".
Nie chodzi o to, żeby się unosić, ani dubluć, o co się martwię, to jest z pływającego i podwójnego do czegoś innego. Stworzyłem listę dla wszystkich rzutów, ale muszę wyodrębnić nazwy zmiennych z tej listy, które są tylko zmiennymi lub podwójnymi, co jest bardzo trudne do zrobienia. – Chris
Który typ obsady jest w ogóle problematyczny? Jeśli są problematyczne, dlaczego znaleźli się w kodzie na pierwszym miejscu? –
@cli_hlt: Istnieje zły kod, który musisz naprawić, aby poprawić :) –
Jeśli Twój kod C można również skompilować w trybie C++, można użyć flagi ostrzegawczej g ++ 's -Wold-style-cast
, aby wyzwolić ostrzeżenie we wszystkich takich rzutach.
Możesz określić, czy Clang ma jakieś ostrzeżenia, które będą powodować określony wzór kodowania przy użyciu jego przełącznika -Weverything
(ale pamiętaj, że to nie jest przydatne w prawie każdym innym celu - klang ma wyłączone domyślne ostrzeżenia, które wyzwalają w sprawie różnych form legalnego kodu). Jednak w tym przypadku, klang nie ma żadnych ostrzeżeń, które wyzwalają takie rzuty.
Podczas kompilatory wiem nie ma możliwości, że Gimpel za FlexeLint może robić to, co chcesz:
$ cat tst.c
int main (void)
{
int i = 0, j = 0;
float f = 0.0;
double d = 0.0;
i = (int) f;
j = (int) d;
d = (double) f;
f = (float) d;
i = (int)j;
j = (unsigned) i;
return (int) j;
}
$ flexelint -w1 +e922 tst.c
FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012
--- Module: tst.c (C)
_
i = (int) f;
tst.c 7 Note 922: cast from float to int
_
j = (int) d;
tst.c 8 Note 922: cast from double to int
_
d = (double) f;
tst.c 9 Note 922: cast from float to double
_
f = (float) d;
tst.c 10 Note 922: cast from double to float
shell returned 4
- 1. Czy istnieje sposób na uzyskanie danych pikseli z Internet Explorera?
- 2. Czy istnieje sposób na uzyskanie wszystkich zarządzanych jednostek z EntityManager
- 3. Czy istnieje sposób na uzyskanie ruchów obiektów całkowitych w vim?
- 4. Czy istnieje sprytny sposób na uzyskanie sortable target w jQueryUI
- 5. Czy istnieje prosty sposób na uzyskanie wymiarów obrazu w Ruby?
- 6. Czy istnieje sposób na uzyskanie identyfikatora pakietu w czasie wykonywania?
- 7. Czy istnieje prosty sposób na uzyskanie rozmiaru obiektu java?
- 8. Czy istnieje sposób na uzyskanie różnych partion Keys z tabeli
- 9. Czy istnieje sposób na uzyskanie obwiedni (w pikselach) elementu DOM?
- 10. Czy istnieje sposób na uzyskanie IEqualityComparer od programu IComparer?
- 11. Czy istnieje sposób na uzyskanie danych wyjściowych jQuery * rzeczywisty znacznik *?
- 12. Czy istnieje sposób na uzyskanie wszystkich wartości w NSUserDefaults?
- 13. Czy istnieje sposób na uzyskanie domyślnego obiektu $ .ajax?
- 14. Czy istnieje łatwy sposób na uzyskanie nazwy ServerName w Symfony?
- 15. Czy istnieje sposób na uzyskanie REPL w pydev?
- 16. Czy istnieje sposób na uzyskanie "nazwanych" komórek za pomocą EPPlus?
- 17. Czy istnieje sposób na uzyskanie postępu przesyłania jQuery ajax?
- 18. Czy istnieje sposób na uzyskanie typu "bieżącej funkcji"?
- 19. Czy istnieje sposób na uzyskanie wyjątku w Haskell?
- 20. Czy istnieje sposób na uzyskanie zlokalizowanych nazw popularnych przycisków dialogowych?
- 21. Czy istnieje sposób na uzyskanie XML dla produktów Amazon?
- 22. Czy istnieje sposób na uzyskanie ograniczeń tabeli w SQLite?
- 23. Czy istnieje sposób na uzyskanie pi w arkuszu kalkulacyjnym CSS?
- 24. Czy istnieje sposób na uzyskanie narzędzia javadoc do dokumentowania adnotacji?
- 25. Czy istnieje sposób na uzyskanie aliasu typu poprzez odbicie?
- 26. Czy istnieje sposób na uzyskanie SQL utworzony przez kwerendę LINQ?
- 27. Czy istnieje sposób na uzyskanie CSS XSS w nowoczesnych przeglądarkach?
- 28. Czy istnieje sposób, aby ostrzec mnie o globalnych splinach dotyczących przestrzeni nazw?
- 29. GCC braku ostrzec niezainicjowanego zmiennej
- 30. Czy istnieje sposób na zmianę opcji kompilacji gcc dla klejnotów?
Może jestem po prostu proste, ale nie można po prostu wyszukać '(podwójna) 'lub' (float) 'w twoim źródle? –
@RobertHarvey Przepraszam, zmieniłem jego brzmienie, aby miało więcej sensu. Chcę przechwycić wszystkie jawne odlewy, które są od typu float/double do czegokolwiek innego, więc mogę wyszukać (int), itp., Ale nie byłbym w stanie stwierdzić, czy są one zmienne czy podwójne. – Chris
Po prostu myśl (nie wiem, C++ lub jeśli jest to nawet możliwe): przesłonę operatora obsady dla podwójnego i zmiennoprzecinkowego, aby wyemitować kompilację i skompiluj jako C++ :) – pmg