Phân tích tĩnh - từ giới thiệu đến tích hợp

Mệt mỏi vì phải xem xét hoặc sửa lỗi mã liên tục, đôi khi bạn nghĩ về cách đơn giản hóa cuộc sống của mình. Và sau khi tìm kiếm một chút hoặc vô tình bắt gặp nó, bạn có thể thấy cụm từ kỳ diệu: “Phân tích tĩnh”. Hãy xem nó là gì và nó có thể tương tác với dự án của bạn như thế nào.

Phân tích tĩnh - từ giới thiệu đến tích hợp
Trên thực tế, nếu bạn viết bằng bất kỳ ngôn ngữ hiện đại nào, thì bạn đã chạy nó thông qua một máy phân tích tĩnh mà thậm chí không hề nhận ra. Thực tế là bất kỳ trình biên dịch hiện đại nào cũng cung cấp, dù rất nhỏ, các cảnh báo về các vấn đề tiềm ẩn trong mã. Ví dụ: khi biên dịch mã C++ trong Visual Studio, bạn có thể thấy như sau:

Phân tích tĩnh - từ giới thiệu đến tích hợp
Trong đầu ra này, chúng ta thấy rằng biến chưa bao giờ được sử dụng ở bất kỳ đâu trong hàm. Vì vậy, trong thực tế, bạn hầu như luôn sử dụng một bộ phân tích mã tĩnh đơn giản. Tuy nhiên, không giống như các máy phân tích chuyên nghiệp như Coverity, Klocwork hay PVS-Studio, các cảnh báo do trình biên dịch cung cấp chỉ có thể chỉ ra một phạm vi vấn đề nhỏ.

Nếu bạn không biết chắc chắn phân tích tĩnh là gì và cách triển khai nó, đọc bài viết nàyđể tìm hiểu thêm về phương pháp này.

Tại sao bạn cần phân tích tĩnh?

Tóm lại: tăng tốc và đơn giản hóa.

Phân tích tĩnh cho phép bạn tìm thấy nhiều vấn đề khác nhau trong mã: từ việc sử dụng cấu trúc ngôn ngữ không chính xác đến lỗi chính tả. Ví dụ, thay vì

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Bạn đã viết đoạn mã sau:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

Như bạn có thể thấy, có một lỗi đánh máy ở dòng cuối cùng. Ví dụ: PVS-Studio đưa ra cảnh báo sau:

V537 Hãy xem xét việc xem xét tính đúng đắn của việc sử dụng mục 'y'.

Nếu bạn muốn nhúng tay vào lỗi này, hãy thử một ví dụ làm sẵn trong Compiler Explorer: *khóc*.

Và như bạn hiểu, không phải lúc nào bạn cũng có thể chú ý đến những phần mã như vậy ngay lập tức và vì điều này, bạn có thể ngồi gỡ lỗi hàng giờ đồng hồ và tự hỏi tại sao mọi thứ lại hoạt động kỳ lạ như vậy.

Tuy nhiên, đây rõ ràng là một sai lầm. Điều gì sẽ xảy ra nếu nhà phát triển viết mã dưới mức tối ưu vì anh ta quên mất một số chi tiết của ngôn ngữ? Hoặc thậm chí cho phép nó trong mã hành vi không xác định? Thật không may, những trường hợp như vậy là hoàn toàn phổ biến và phần lớn thời gian được dành để gỡ lỗi mã làm việc cụ thể có lỗi chính tả, lỗi điển hình hoặc hành vi không xác định.

Chính vì những tình huống này mà phân tích tĩnh đã xuất hiện. Đây là một trợ lý dành cho nhà phát triển, người sẽ chỉ ra các vấn đề khác nhau trong mã và giải thích trong tài liệu tại sao không cần thiết phải viết theo cách này, nó có thể dẫn đến điều gì và cách khắc phục. Đây là một ví dụ về giao diện của nó: *khóc*.

Bạn có thể tìm thấy nhiều lỗi thú vị hơn mà máy phân tích có thể phát hiện trong các bài viết:

Bây giờ bạn đã đọc tài liệu này và bị thuyết phục về lợi ích của phân tích tĩnh, bạn có thể muốn dùng thử. Nhưng bắt đầu từ đâu? Làm cách nào để tích hợp một công cụ mới vào dự án hiện tại của bạn? Và làm thế nào để giới thiệu đội với anh ấy? Bạn sẽ tìm thấy câu trả lời cho những câu hỏi này dưới đây.

Lưu ý. Phân tích tĩnh không thay thế hoặc hủy bỏ một việc hữu ích như đánh giá mã. Nó bổ sung cho quá trình này, giúp nhận biết và sửa trước các lỗi chính tả, điểm không chính xác và các thiết kế nguy hiểm. Sẽ hiệu quả hơn nhiều khi tập trung vào đánh giá mã về thuật toán và độ rõ ràng của mã, thay vì tìm kiếm dấu ngoặc đơn hoặc dấu ngoặc đơn bị đặt sai vị trí. đọc chức năng so sánh nhàm chán.

0. Làm quen với công cụ

Tất cả bắt đầu với một phiên bản dùng thử. Thật vậy, rất khó để quyết định đưa thứ gì đó vào quá trình phát triển nếu bạn chưa từng thấy công cụ này hoạt động trước đây. Vì vậy, điều đầu tiên bạn nên làm là tải xuống phiên bản dùng thử.

Những gì bạn sẽ học được ở giai đoạn này:

  • Các cách để tương tác với máy phân tích là gì;
  • Máy phân tích có tương thích với môi trường phát triển của bạn không?
  • Hiện tại dự án của bạn đang có những vấn đề gì?

Sau khi cài đặt mọi thứ bạn cần, điều đầu tiên bạn nên làm là chạy phân tích toàn bộ dự án (Windows, Linux, macOS). Trong trường hợp PVS-Studio trong Visual Studio, bạn sẽ thấy một hình ảnh tương tự (có thể nhấp vào):

Phân tích tĩnh - từ giới thiệu đến tích hợp
Thực tế là các máy phân tích tĩnh thường đưa ra một số lượng lớn cảnh báo cho các dự án có cơ sở mã lớn. Không cần phải sửa tất cả vì dự án của bạn đã hoạt động, điều đó có nghĩa là những vấn đề này không nghiêm trọng. Tuy nhiên bạn bạn có thể xem những cảnh báo thú vị nhất và sửa chúng nếu cần thiết. Để làm điều này, bạn cần lọc đầu ra và chỉ để lại những tin nhắn đáng tin cậy nhất. Trong plugin PVS-Studio dành cho Visual Studio, việc này được thực hiện bằng cách lọc theo mức độ và danh mục lỗi. Để có kết quả đầu ra chính xác nhất, chỉ để lại Cao и Tổng Quát (cũng có thể nhấp vào):

Phân tích tĩnh - từ giới thiệu đến tích hợp
Quả thực, 178 cảnh báo dễ xem hơn nhiều so với hàng nghìn...

Trong các tab Trung bình и Thấp Thường có những cảnh báo tốt, nhưng những danh mục này bao gồm những chẩn đoán có độ chính xác (độ tin cậy) kém hơn. Bạn có thể tìm thêm thông tin về các mức cảnh báo và các tùy chọn để làm việc trong Windows tại đây: *khóc*.

Việc xem xét thành công các lỗi thú vị nhất (và sửa chúng thành công) là điều đáng giá. ngăn chặn các cảnh báo còn lại. Điều này là cần thiết để những cảnh báo mới không bị lẫn giữa những cảnh báo cũ. Ngoài ra, máy phân tích tĩnh là một trợ lý cho người lập trình chứ không phải là danh sách các lỗi. 🙂

1. Tự động hóa

Sau khi làm quen, đã đến lúc cấu hình plugin và tích hợp vào CI. Việc này phải được thực hiện trước khi người lập trình bắt đầu sử dụng bộ phân tích tĩnh. Thực tế là lập trình viên có thể quên bật tính năng phân tích hoặc không muốn thực hiện việc đó. Để làm điều này, bạn cần thực hiện một số kiểm tra cuối cùng mọi thứ để mã chưa được kiểm tra không thể vào nhánh phát triển chung.

Những gì bạn sẽ học được ở giai đoạn này:

  • Công cụ này cung cấp những tùy chọn tự động hóa nào;
  • Máy phân tích có tương thích với hệ thống lắp ráp của bạn không?

Vì tài liệu hoàn hảo không tồn tại nên đôi khi bạn phải viết ủng hộ. Điều này là bình thường và chúng tôi rất sẵn lòng trợ giúp bạn. 🙂

Bây giờ hãy chuyển sang các dịch vụ tích hợp liên tục (CI). Bất kỳ máy phân tích nào cũng có thể được triển khai vào chúng mà không gặp bất kỳ vấn đề nghiêm trọng nào. Để thực hiện việc này, bạn cần tạo một giai đoạn riêng biệt trong quy trình, giai đoạn này thường nằm sau quá trình xây dựng và kiểm thử đơn vị. Điều này được thực hiện bằng cách sử dụng các tiện ích bảng điều khiển khác nhau. Ví dụ: PVS-Studio cung cấp các tiện ích sau:

Để tích hợp phân tích vào CI, bạn cần thực hiện ba việc:

  • Cài đặt máy phân tích;
  • Chạy phân tích;
  • Mang lại kết quả.

Ví dụ: để cài đặt PVS-Studio trên Linux (Debian-base), bạn cần chạy các lệnh sau:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

Trên các hệ thống chạy Windows, không có cách nào để cài đặt bộ phân tích từ trình quản lý gói, nhưng có thể triển khai bộ phân tích từ dòng lệnh:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Bạn có thể đọc thêm về cách triển khai PVS-Studio trên hệ thống chạy Windows *đây*.

Sau khi cài đặt, bạn cần chạy phân tích trực tiếp. Tuy nhiên, bạn chỉ nên thực hiện việc này sau khi quá trình biên dịch và kiểm tra đã vượt qua. Điều này là do phân tích tĩnh thường mất gấp đôi thời gian biên dịch.

Vì phương thức khởi chạy phụ thuộc vào nền tảng và tính năng của dự án nên tôi sẽ hiển thị tùy chọn cho C++ (Linux) làm ví dụ:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

Lệnh đầu tiên sẽ thực hiện phân tích và lệnh thứ hai bao lì xìchuyển đổi báo cáo thành định dạng văn bản, hiển thị trên màn hình và trả về mã trả về khác 0 nếu có cảnh báo. Cơ chế như thế này có thể được sử dụng một cách thuận tiện để chặn bản dựng khi có thông báo lỗi. Tuy nhiên, bạn luôn có thể xóa cờ -w và không chặn một tập hợp có chứa cảnh báo.

Lưu ý. Định dạng văn bản là bất tiện. Nó được cung cấp đơn giản như một ví dụ. Hãy chú ý đến một định dạng báo cáo thú vị hơn - FullHtml. Nó cho phép bạn điều hướng qua mã.

Bạn có thể đọc thêm về cách thiết lập phân tích trên CI trong bài viết "PVS-Studio và tích hợp liên tục" (Windows) hoặc "Cách thiết lập PVS-Studio trong Travis CI" (Linux).

Được rồi, bạn đã định cấu hình bộ phân tích trên máy chủ bản dựng. Bây giờ, nếu ai đó đã tải lên mã chưa được kiểm tra, giai đoạn xác minh sẽ thất bại và bạn sẽ có thể phát hiện sự cố, tuy nhiên, điều này không hoàn toàn thuận tiện vì sẽ hiệu quả hơn nếu kiểm tra dự án không phải sau khi các nhánh đã được hợp nhất mà là trước nó, ở giai đoạn yêu cầu kéo. A.

Nhìn chung, việc thiết lập phân tích yêu cầu kéo không khác nhiều so với việc khởi chạy phân tích thông thường trên CI. Ngoại trừ nhu cầu lấy danh sách các tập tin đã thay đổi. Chúng thường có thể thu được bằng cách truy vấn sự khác biệt giữa các nhánh bằng git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Bây giờ bạn cần chuyển danh sách tệp này tới máy phân tích làm đầu vào. Ví dụ: trong PVS-Studio, điều này được triển khai bằng cờ -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Bạn có thể tìm hiểu thêm về phân tích yêu cầu kéo *đây*. Ngay cả khi CI của bạn không có trong danh sách các dịch vụ được đề cập trong bài viết, bạn sẽ thấy phần chung dành cho lý thuyết về loại phân tích này rất hữu ích.

Bằng cách thiết lập phân tích các yêu cầu kéo, bạn có thể chặn các cam kết chứa cảnh báo, từ đó tạo ra ranh giới mà mã chưa được kiểm tra không thể vượt qua.

Điều này chắc chắn là tốt, nhưng tôi muốn có thể xem tất cả các cảnh báo ở một nơi. Không chỉ từ máy phân tích tĩnh mà còn từ các bài kiểm tra đơn vị hoặc từ máy phân tích động. Có nhiều dịch vụ và plugin khác nhau cho việc này. Ví dụ, PVS-Studio có plugin để tích hợp vào SonarQube.

2. Tích hợp trên máy của nhà phát triển

Bây giờ là lúc cài đặt và định cấu hình máy phân tích để sử dụng phát triển hàng ngày. Đến thời điểm này bạn đã làm quen với hầu hết các cách làm việc nên đây có thể được gọi là phần dễ nhất.

Là tùy chọn đơn giản nhất, các nhà phát triển có thể tự cài đặt bộ phân tích cần thiết. Tuy nhiên, việc này sẽ mất rất nhiều thời gian và khiến họ mất tập trung vào quá trình phát triển, vì vậy bạn có thể tự động hóa quá trình này bằng cách sử dụng trình cài đặt và các cờ cần thiết. Đối với PVS-Studio có nhiều cờ để cài đặt tự động. Tuy nhiên, luôn có những trình quản lý gói, ví dụ như Chocolatey (Windows), Homebrew (macOS) hoặc hàng tá tùy chọn cho Linux.

Sau đó, bạn sẽ cần cài đặt các plugin cần thiết, ví dụ như Visual Studio, IDEA, Rider và vv

3. Sử dụng hàng ngày

Ở giai đoạn này, đã đến lúc nói vài lời về các cách tăng tốc máy phân tích trong quá trình sử dụng hàng ngày. Việc phân tích đầy đủ toàn bộ dự án tốn rất nhiều thời gian, nhưng chúng ta có thường xuyên thay đổi mã trong toàn bộ dự án cùng một lúc không? Hầu như không có bất kỳ phép tái cấu trúc nào lớn đến mức sẽ ảnh hưởng ngay đến toàn bộ cơ sở mã. Số lượng tệp được thay đổi cùng một lúc hiếm khi vượt quá hàng tá, vì vậy việc phân tích chúng là điều hợp lý. Đối với tình huống như vậy có chế độ phân tích gia tăng. Đừng lo lắng, đây không phải là một công cụ khác. Đây là chế độ đặc biệt cho phép bạn chỉ phân tích các tệp đã thay đổi và phần phụ thuộc của chúng và điều này sẽ tự động xảy ra sau khi xây dựng nếu bạn đang làm việc trong IDE có cài đặt plugin.

Nếu máy phân tích phát hiện vấn đề trong mã được thay đổi gần đây, nó sẽ báo cáo vấn đề này một cách độc lập. Ví dụ: PVS-Studio sẽ cho bạn biết về điều này bằng cảnh báo:

Phân tích tĩnh - từ giới thiệu đến tích hợp
Tất nhiên, việc yêu cầu các nhà phát triển sử dụng công cụ này là chưa đủ. Chúng ta cần bằng cách nào đó nói cho họ biết nó là gì và nó như thế nào. Ví dụ: đây là các bài viết về cách bắt đầu nhanh với PVS-Studio, nhưng bạn có thể tìm thấy các hướng dẫn tương tự cho bất kỳ công cụ nào bạn thích:

Những bài viết như vậy cung cấp tất cả thông tin cần thiết cho việc sử dụng hàng ngày và không mất nhiều thời gian. 🙂

Ngay cả ở giai đoạn làm quen với công cụ này, chúng tôi đã loại bỏ rất nhiều cảnh báo trong một trong những lần ra mắt đầu tiên. Thật không may, máy phân tích tĩnh không hoàn hảo nên đôi khi chúng đưa ra kết quả dương tính giả. Việc ngăn chặn chúng thường rất dễ dàng; ví dụ: trong plugin PVS-Studio dành cho Visual Studio, bạn chỉ cần nhấp vào một nút:

Phân tích tĩnh - từ giới thiệu đến tích hợp
Tuy nhiên, bạn có thể làm nhiều hơn là chỉ ngăn chặn chúng. Ví dụ: bạn có thể báo cáo sự cố để được hỗ trợ. Nếu có thể sửa được kết quả dương tính giả thì trong các bản cập nhật trong tương lai, bạn có thể nhận thấy rằng mỗi lần có ít kết quả dương tính giả cụ thể hơn đối với cơ sở mã của bạn.

Sau khi tích hợp

Như vậy là chúng ta đã trải qua tất cả các giai đoạn tích hợp phân tích tĩnh vào quá trình phát triển. Bất chấp tầm quan trọng của việc thiết lập các công cụ như vậy trên CI, nơi quan trọng nhất để chạy chúng là máy tính của nhà phát triển. Suy cho cùng, máy phân tích tĩnh không phải là người phán xét ở đâu đó nói với bạn rằng mã này không tốt. Ngược lại, nó là một trợ lý sẽ cho bạn biết nếu bạn mệt mỏi và nhắc nhở bạn nếu bạn quên điều gì đó.

Đúng, nếu không sử dụng thường xuyên, phân tích tĩnh khó có thể đơn giản hóa đáng kể quá trình phát triển. Xét cho cùng, lợi ích chính của nó đối với nhà phát triển không nằm ở việc tìm kiếm các phần mã phức tạp và gây tranh cãi mà nằm ở việc phát hiện sớm chúng. Đồng ý rằng việc phát hiện ra vấn đề sau khi các chỉnh sửa đã được gửi đi kiểm tra không chỉ khó chịu mà còn rất tốn thời gian. Phân tích tĩnh, khi được sử dụng thường xuyên, sẽ xem xét mọi thay đổi trực tiếp trên máy tính của bạn và báo cáo những chỗ đáng ngờ trong khi xử lý mã.

Và nếu bạn hoặc đồng nghiệp của bạn vẫn chưa chắc chắn liệu nó có đáng để triển khai máy phân tích hay không thì tôi khuyên bạn nên bắt đầu đọc bài viết ngay bây giờ "Lý do nên đưa máy phân tích mã tĩnh PVS-Studio vào quá trình phát triển". Nó giải quyết mối lo ngại điển hình của các nhà phát triển rằng việc phân tích tĩnh sẽ tiêu tốn thời gian của họ, v.v.

Phân tích tĩnh - từ giới thiệu đến tích hợp

Nếu bạn muốn chia sẻ bài viết này với độc giả nói tiếng Anh, vui lòng sử dụng liên kết bản dịch: Maxim Zvyagintsev. Phân tích tĩnh: Từ bắt đầu đến tích hợp.

Nguồn: www.habr.com

Thêm một lời nhận xét