Analiza kodu C/C++ w VS2015

Analiza kodu C/C++ w VS2015

Autor:Joe Morris i Jim Springfield (MSFT)

Ten blog zawiera odpowiedzi na następujące 2 pytania.

  • Co nowego w analizie kodu C/C++ dla VS2015?
  • Co jest obsługiwane, a co nie jest obsługiwane w analizie kodu C/C++ dla wersji VS2015 CTP6?

Zanim zaczniemy, przyjrzyjmy się tej samej terminologii.

Analiza kodu :Analiza kodu C/C++ jest również znana jako /analyze. Czasami nazywa się ją „statyczną analizą kodu” lub po prostu „analizą kodu”. Wszystkie oznaczają to samo.

Kompilator frontonu i zaplecza :Kompilator Microsoft C/C++ składa się z dwóch części (front-end i back-end). Front-end czyta kod źródłowy, leksy, parsuje, przeprowadza analizę semantyczną i emituje IL. Zaplecze odczytuje IL i wykonuje generowanie kodu oraz optymalizacje. Użycie terminu „kompilator” w odniesieniu do analizy kodu w dalszej części tego postu dotyczy tylko interfejsu.

Teraz, gdy terminologia została usunięta, przyjrzyjmy się, co zmieniło się w analizie kodu w VS2015.

Co nowego w analizie kodu C/C++ dla VS2015?

Zacznijmy od tego, co się nie zmieniło.

  • Analiza kodu jest nadal dostępna we wszystkich wersjach programu Visual Studio, podobnie jak w VS2013.
  • Nie dodano żadnych dodatkowych kontrolerów między VS2013 a VS2015.

To, co się zmieniło, to 2 kluczowe elementy:

Odmłodzenie frontonu :Sposób, w jaki robimy analizę kodu pod osłonami. Jest to zmiana hydrauliczna i nie ma wpływu na użytkownika pod względem przepływu pracy.
Ujednolicone centrum błędów :Okno, w którym przedstawiamy użytkownikowi problemy z analizą kodu. Nie ma już oddzielnego okna analizy kodu, ale zamiast tego zunifikowane centrum błędów, które jest udostępniane przez innych dostawców, takich jak kompilacja, kompilacja, link itp.

Frontowe odmłodzenie

Jest to bardziej zmiana hydrauliczna, która nie ma wpływu na użytkownika pod względem przepływu pracy. Ale czytaj dalej, jeśli chcesz zrozumieć, dlaczego dokonaliśmy zmiany w kanalizacji.

Nasze natywne narzędzia do analizy kodu korzystają z tego samego kodu, co kompilator. W rzeczywistości jest zbudowany z tego samego drzewa źródłowego, chociaż istnieją tysiące bloków preprocesora #if, aby to osiągnąć. Narzędzia do analizy kodu budują abstrakcyjne drzewo składni (AST) dla całej funkcji, przechwytując fragmenty podczas analizowania przez zwykły kompilator. Jednak to przechwycone AST zasadniczo różni się od tego, co prawdziwy kompilator wykorzystuje do swoich struktur danych, co często prowadzi do niespójności.

Ponadto, w miarę dodawania nowych funkcji językowych, większość z nich musi zostać zaimplementowana dwukrotnie:raz dla kompilatora i ponownie dla analizy kodu. W rezultacie powstały 2 różne ścieżki kodu i pliki binarne (c1xx.dll i c1xxast.dll), jeden do generowania kodu i do analizy kodu.

To był dla nas poważny problem i nieco ponad rok temu rozpoczęliśmy projekt, aby w końcu przeprowadzić gruntowną przebudowę naszego kodu kompilatora. Chcieliśmy mieć jedną ścieżkę kodu dla AST zarówno do generowania kodu, jak i do analizy kodu. Więc pozbyliśmy się c1xxast.dll.

Po tej zmianie hydraulicznej /analyze pod przykrywką działa teraz w następujący sposób… kiedy /analyze jest przekazywane do kompilatora, używamy tej samej biblioteki DLL (c1.dll lub c1xx.dll), której używamy do normalnej kompilacji i budujemy te same dane wewnętrzne Struktury. Istnieje kilka dodatkowych informacji, które przechowujemy dłużej w /analyze, ale ogólna struktura jest teraz identyczna. Wcześniej zaczynaliśmy emitować IL (język pośredni) dla zaplecza kompilatora podczas analizowania treści funkcji, ale teraz przechwytujemy wewnętrznie całą treść funkcji przed emisją IL.

Dzięki temu możemy używać tego samego drzewa do analizy, generowania kodu i do implementowania nowych funkcji kompilatora, takich jak dedukcja typu zwracanego i „constexpr”, co wymaga możliwości sprawdzenia całej funkcji i oceny jej w czasie kompilacji. Dzięki tej unifikacji oczekujemy, że nasze możliwości analizy kodu staną się jeszcze lepsze.

Zunifikowane centrum błędów

W VS2013 okno analizy kodu było oddzielnym oknem od okna listy błędów. Błędy/ostrzeżenia niezwiązane z analizą były kierowane do okna listy błędów, a błędy/ostrzeżenia analizy do okna analizy kodu.

W VS2015 pozbywamy się okna analizy kodu i teraz kierujemy wszystkie błędy/ostrzeżenia analizy kodu do listy błędów, jak pokazano na zrzucie ekranu poniżej.

Upewniliśmy się, że cała funkcjonalność funkcji, która istniała w oknie analizy kodu, jest również dostępna w nowym oknie listy błędów, a mianowicie…

  • Sortowanie spraw
  • Kategoryzacja problemów
  • Szczegóły problemu
  • Wstrzymanie problemu
  • Kopiuj problem i wklej w e-mailu

To podsumowuje 2 kluczowe zmiany, które wprowadziliśmy do analizy kodu w VS2015. Jeśli jednak używasz CTP6, pamiętaj, że nie ukończyliśmy w pełni pracy związanej z odmłodzeniem front-endu.

Co jest obsługiwane w analizie kodu C/C++ w wersji VS2015 CTP6?
Do tej pory /analyze było wyłączone w VS2015 CTP dla analizy kodu C i C++. Wraz z wydaniem CTP6 włączyliśmy /analyze dla kodu C.

Obsługiwane w CTP6:

  • Analiza C z większością kontroli analizy kodu

Co nie jest obsługiwane w analizie kodu C++ dla wersji VS2015 CTP6?
Analiza kodu C++ jest nadal wyłączona i pracujemy nad włączeniem jej w nadchodzących wydaniach.

Nieobsługiwane w CTP6:

  • Analiza kodu C++
  • Sprawdzanie współbieżności C i C++
  • Dodatkowe kontrole sterowników za pomocą narzędzi WDK

Nasz zespół ds. funkcji koncentruje się na jak najszybszym dokończeniu nieobsługiwanej funkcjonalności. Bądź na bieżąco!

PS:Ten blog nie dotyczy analizy kodu zarządzanego. Jeśli chcesz wiedzieć, jaka jest na to umowa, zapoznaj się z prezentacjami i blogami napisanymi w tym celu, wymienionymi poniżej.

Rozmowy/blogi dotyczące zarządzanej analizy kodu

  • Popraw jakość kodu za pomocą analizatorów kodu na żywo – https://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014/714
  • Użyj Roslyn do napisania Live Code Analyzer dla swojego interfejsu API — https://msdn.microsoft.com/en-us/magazine/dn879356.aspx