paint-brush
Kỹ thuật phân tích mã tĩnh hiệu quả để cải thiện chất lượng mãtừ tác giả@launchable
27,163 lượt đọc
27,163 lượt đọc

Kỹ thuật phân tích mã tĩnh hiệu quả để cải thiện chất lượng mã

từ tác giả Launchable7m2023/03/09
Read on Terminal Reader

dài quá đọc không nổi

Phân tích mã tĩnh có nghĩa là phân tích mã nguồn để tìm các sự cố mà không cần thực thi nó. Điều này trái ngược với kiểm tra mã động, sẽ khởi chạy tệp thực thi và xác minh hành vi chính xác. Ba kỹ thuật bao gồm phân tích cú pháp, phân tích luồng dữ liệu và điều khiển và phân tích bảo mật. Đọc để tìm hiểu thêm về các loại phân tích tĩnh khác nhau và cách tăng hiệu quả của nó.
featured image - Kỹ thuật phân tích mã tĩnh hiệu quả để cải thiện chất lượng mã
Launchable HackerNoon profile picture

Cách khuếch đại hiệu quả phân tích mã tĩnh bằng cách xếp lớp trên lựa chọn kiểm tra dự đoán

Lập trình máy tính đã đi một chặng đường dài kể từ thời hoàng kim của thẻ đục lỗ . Đã qua rồi cái thời các lập trình viên lập trình thủ công một nhiệm vụ bằng cách đục lỗ trên thẻ giấy, kiểm tra ba lần tính chính xác của nó và hy vọng rằng nó hoạt động khi họ thực hiện chương trình.


máy tính


Ngày nay, các nhà phát triển có thể nhận phản hồi về tính chính xác của một dòng mã ngay khi họ nhập dòng mã đó vào trình chỉnh sửa mã của mình - khác xa so với quy trình phát triển thẻ đục lỗ nhờ những đổi mới trong lĩnh vực phân tích mã tĩnh.


Phân tích mã tĩnh có thể xác định và ngăn chặn các vấn đề sớm trong quá trình phát triển phần mềm, nhưng không phải không có nguy cơ đốt cháy tài nguyên. Mặc dù phân tích mã tĩnh có thể là một công cụ có giá trị để cải thiện chất lượng và độ tin cậy của phần mềm, nhưng bạn có thể tăng giá trị bằng cách thực hiện phân tích tác động thử nghiệm và thêm vào Lựa chọn thử nghiệm dự đoán.


Phân tích mã tĩnh có nghĩa là phân tích mã nguồn để tìm các sự cố mà không cần thực thi nó. Điều này trái ngược với kiểm tra mã động, sẽ khởi chạy tệp thực thi và xác minh hành vi chính xác.


Máy phân tích tĩnh sử dụng các thuật toán và bộ quy tắc để xác định các vấn đề tiềm ẩn, phân loại chúng dựa trên mức độ nghiêm trọng và tác động, đồng thời chuyển các vấn đề đó cho nhà phát triển để phân loại và giải quyết.

Đọc tiếp để tìm hiểu thêm về các loại phân tích tĩnh khác nhau và cách bạn có thể nâng cao hiệu quả của nó bằng cách xếp lớp trên Lựa chọn thử nghiệm dự đoán .

Tổng quan về kỹ thuật phân tích mã tĩnh

Các kỹ thuật phân tích mã tĩnh được sử dụng để xác định các vấn đề tiềm ẩn trong mã trước khi nó được triển khai, cho phép các nhà phát triển thực hiện các thay đổi và cải thiện chất lượng của phần mềm. Ba kỹ thuật bao gồm phân tích cú pháp, phân tích luồng dữ liệu và điều khiển và phân tích bảo mật.

Phân tích cú pháp

Phân tích cú pháp liên quan đến việc kiểm tra mã để tìm lỗi cú pháp và vi phạm tiêu chuẩn mã hóa, chẳng hạn như thiếu dấu ngoặc, tên biến không hợp lệ và thụt lề không đúng cách. Hầu hết các IDE hiện đại đều tích hợp sẵn phân tích cú pháp. Ví dụ: Visual Studio và Visual Studio Code có phân tích mã được tích hợp trong tính năng Intellisense. Trong ảnh chụp màn hình bên dưới, Visual Studio 2022 đang hiển thị lỗi cú pháp C# do thiếu dấu chấm phẩy trước khi mã được biên dịch.

lỗi cú pháp

Phân tích cú pháp giúp các nhà phát triển bắt lỗi trước khi họ nhấn nút “chạy”.

Phân tích luồng dữ liệu và điều khiển

Kỹ thuật này liên quan đến việc theo dõi luồng dữ liệu thông qua mã, để xác định các vấn đề tiềm ẩn như biến chưa được khởi tạo, con trỏ null và điều kiện chạy đua dữ liệu. Phân tích luồng điều khiển cũng tương tự và giúp xác định các lỗi như vòng lặp vô hạn và mã không thể truy cập. Nhiều trình biên dịch hiện đại có phân tích luồng dữ liệu và phân tích luồng điều khiển được tích hợp sẵn. Chúng hiển thị bất kỳ phát hiện nào dưới dạng cảnh báo hoặc lỗi thời gian biên dịch.


Ví dụ: bộ công cụ Clang dành cho họ ngôn ngữ C tự động thực hiện phân tích luồng trong quá trình biên dịch. Đối với các ngôn ngữ không được biên dịch, chẳng hạn như Python, bạn có thể sử dụng công cụ phân tích luồng kiểm soát và dữ liệu theo cách thủ công như CodeQL .

Phân tích bảo mật

Phân tích tĩnh bảo mật liên quan đến việc kiểm tra mã để tìm các lỗ hổng bảo mật tiềm ẩn, chẳng hạn như tràn bộ đệm, tập lệnh chéo trang và tấn công tiêm nhiễm. Họ cũng có thể quét các phụ thuộc bên thứ 3 của bạn để tìm các gói có lỗ hổng đã biết và phát hiện thông tin xác thực được kiểm tra trong mã nguồn của bạn.


Các công cụ kiểm tra bảo mật ứng dụng tĩnh (SAST) bao gồm:

Ví dụ: Kiểm tra bảo mật ứng dụng tĩnh với SemGrep

SemGrep là một công cụ phân tích tĩnh bảo mật ứng dụng miễn phí phổ biến. Chạy bộ phân tích bảo mật của SemGrep trên một dự án có mã không an toàn, chẳng hạn như OWASP Juice Shop , sẽ phát hiện ra hàng tá lỗ hổng bảo mật trong mã.


express serialize tiêm

Phân tích mã tĩnh Lợi ích: Chất lượng, Phòng ngừa, Chi phí

  1. Cải thiện chất lượng mã và độ tin cậy. Phân tích tĩnh hỗ trợ các nhà phát triển bằng cách giúp phát hiện sớm các vấn đề. Kết quả là mã tốt hơn, đáng tin cậy hơn.
  2. Xác định sớm và phòng ngừa các vấn đề. Thay vì tìm ra lỗi khi nó đã gây ra sự cố cho khách hàng, phân tích tĩnh có thể giúp tìm ra lỗi trước khi chạy mã lần đầu tiên.
  3. Tăng hiệu quả và tiết kiệm chi phí. Không cần tiếp tục chạy lại các bài kiểm tra trong bộ CI/CD của bạn nếu các nhà phát triển có thể phát hiện sớm các sự cố bằng phân tích tĩnh. Điều này giúp tiết kiệm chi phí điện toán đám mây và tăng tốc độ phát triển.

Những thách thức và cân nhắc khi sử dụng phân tích mã tĩnh

Mặc dù Phân tích mã tĩnh giúp các nhóm nắm bắt vấn đề sớm hơn, nhưng đây không phải là cách tiếp cận hoàn hảo và có thể dẫn đến kết quả dương tính giả, âm tính giả và bị giới hạn bởi các bộ công cụ.

Tích cực sai

Nếu bạn hỏi bất kỳ nhà phát triển nào rằng họ không thích gì về các công cụ phân tích tĩnh, bạn sẽ nghe đi nghe lại một câu trả lời: Tích cực sai.


Máy phân tích tĩnh sử dụng kinh nghiệm và bộ quy tắc để xác định các phát hiện trong một dòng mã. Tuy nhiên, chúng không hoàn hảo và thường đưa ra kết quả không thực sự được đưa ra trong ngữ cảnh.


Ví dụ về dòng mã sau:

 // Set the password policy so that user passwords expire after 365 days. passwordExpiry = 365;


Một bộ phân tích tĩnh bảo mật đơn giản sẽ nhìn thấy chuỗi “mật khẩu” và gắn cờ đây là thông tin xác thực trong mã nguồn. Sau khi kiểm tra, nó rõ ràng không phải là một bí mật và không yêu cầu thay đổi mã. Nhà phát triển cần thêm thời gian để điều tra vấn đề này và đánh dấu nó là dương tính giả, điều này có thể gây khó chịu.

Phủ định sai

Mã phần mềm có thể phức tạp và máy phân tích tĩnh có thể bỏ lỡ các sắc thái của tình huống. Do đó, bạn không thể dựa vào các máy phân tích tĩnh để tìm ra 100% các lỗi bạn viết.

Môi trường đám mây của bạn có hai tệp cấu hình máy chủ gần như giống hệt nhau: serverprod.config (sản xuất) và servertest.config.dev (môi trường thử nghiệm).


Một bộ phân tích tĩnh được định cấu hình để quét các tệp có phần mở rộng .config và tìm thấy chính xác các sự cố trong serverprod.config nhưng lại bỏ sót các sự cố tương tự trong tệp servertest.config.dev vì tệp đó không khớp với mẫu tên tệp của nó.

Sử dụng nhiều công cụ và cách tiếp cận

Không có một công cụ phân tích tĩnh nào làm được tất cả. Nhiều phần mềm chuyên dùng cho các môi trường, loại tệp và kiểu quét khác nhau. Một tổ chức có thể cần một công cụ để quét bảo mật, một công cụ khác cho giao diện TypeScript của họ, một công cụ thứ ba để quét phần phụ trợ của Golang và một bộ phân tích tĩnh khác cho các tệp Terraform cấu hình máy chủ của họ. Mỗi công cụ đều mang lại giá trị, nhưng việc thiết lập và duy trì tất cả chúng có thể khó khăn.

Công cụ phân tích mã tĩnh

Dưới đây là một số công cụ hàng đầu để phân tích mã tĩnh:

  1. SonarQube : một công cụ phân tích mã tĩnh mã nguồn mở phổ biến hỗ trợ nhiều loại ngôn ngữ lập trình và tích hợp với nhiều công cụ xây dựng và triển khai khác nhau.


  2. Kiểu kiểm tra : một công cụ phân tích mã tĩnh mã nguồn mở để kiểm tra các vi phạm quy ước và kiểu mã hóa trong mã Java.


  3. FindBugs : một công cụ phân tích mã tĩnh nguồn mở xác định các vấn đề tiềm ẩn trong mã Java, bao gồm các vấn đề về hiệu suất, lỗ hổng bảo mật và vi phạm tiêu chuẩn mã hóa.


  4. PMD : một công cụ phân tích mã tĩnh mã nguồn mở để kiểm tra các vấn đề trong nhiều ngôn ngữ lập trình, bao gồm Java, C++ và Python.


  5. Veracode : một công cụ phân tích mã tĩnh thương mại cung cấp nhiều tính năng để xác định và giải quyết các lỗ hổng bảo mật trong phần mềm.


  6. Coverity : một công cụ phân tích mã tĩnh thương mại tập trung vào việc xác định và ngăn ngừa các lỗi bảo mật trong mã.


  7. ESLint : Một dự án mã nguồn mở giúp tìm và khắc phục sự cố trong mã JavaScript. Nếu bạn đang sử dụng TypeScript, hãy xem biến thể TypeScript-eslint.


Các công cụ này cung cấp nhiều tính năng, hỗ trợ các ngôn ngữ lập trình khác nhau và có các loại giấy phép phần mềm khác nhau. Điều quan trọng là phải xem xét việc cấp phép cũng như các nhu cầu và yêu cầu cụ thể của một tổ chức khi chọn một công cụ phân tích mã tĩnh.

Ví dụ: Phân tích mã tĩnh JavaScript với ESLint

Đây là một ví dụ đơn giản về phân tích mã tĩnh JavaScript bằng ESLint:


mã tĩnh javascript


Dòng mã đơn này có hai vấn đề mà ESLint nhanh chóng phát hiện ra:


  1. Chuỗi cần sử dụng dấu ngoặc kép
  2. Một biến được gán một giá trị nhưng không bao giờ được sử dụng.


Bằng cách xác định và giải quyết các vấn đề này thông qua phân tích mã tĩnh, các tổ chức có thể cải thiện chất lượng và độ tin cậy của phần mềm của họ. Bạn muốn tự mình thử ESLint? Bạn có thể sử dụng Sân chơi ESLint trực tuyến.

Phân tích mã tĩnh và lựa chọn kiểm tra dự đoán

Lựa chọn bài kiểm tra dự đoán là một kỹ thuật sử dụng máy học để phân tích kết quả bài kiểm tra trước đây và dự đoán bài kiểm tra nào có khả năng thất bại trong tương lai. Điều này có thể được sử dụng cùng với phân tích mã tĩnh để cải thiện hiệu suất và hiệu quả của quá trình thử nghiệm.

Phân tích tĩnh chỉ là một khía cạnh trong chiến lược chất lượng phần mềm.


Hầu hết các tổ chức sử dụng phân tích tĩnh để tăng cường các bài kiểm tra phần mềm đầu cuối chức năng của họ. Các thử nghiệm phân tích tĩnh chỉ là một trong các loại thử nghiệm có thể chạy trong quy trình CI/CD.


Một cách mà Lựa chọn thử nghiệm dự đoán có thể giúp phân tích mã tĩnh bằng cách ưu tiên kiểm tra mã có nhiều khả năng chứa các vấn đề nhất. Bằng cách phân tích các kết quả kiểm tra trong quá khứ và xác định các mẫu có liên quan đến lỗi, Lựa chọn kiểm tra dự đoán có thể giúp tập trung nỗ lực kiểm tra vào các khu vực quan trọng nhất hoặc có vấn đề của mã. Điều này có thể giúp đảm bảo rằng các vấn đề quan trọng nhất được xác định và giải quyết càng sớm càng tốt, đồng thời giảm thời gian và nguồn lực dành cho các thử nghiệm không cần thiết.


Nhìn chung, bằng cách kết hợp Lựa chọn thử nghiệm dự đoán với phân tích mã tĩnh, các tổ chức có thể cải thiện hiệu suất và hiệu quả của quy trình thử nghiệm, đồng thời đảm bảo chất lượng và độ tin cậy của phần mềm.

Suy nghĩ cuối cùng

Phân tích tĩnh là một công cụ quan trọng trong kho vũ khí của một tổ chức để duy trì chất lượng mã. Nó có thể giảm các lỗi mã và cải thiện khả năng bảo trì, nhưng cũng có thể chứa đầy thông tin sai lệch và có thể yêu cầu nhiều công cụ để đáp ứng nhu cầu của tổ chức bạn.


Ngay cả với những vấn đề đó, phân tích tĩnh là một khía cạnh quan trọng đối với bất kỳ tổ chức nào để cung cấp mã chất lượng.


Chạy phân tích mã tĩnh nhanh hơn, thông minh hơn với Lựa chọn thử nghiệm dự đoán**.** Nó tích hợp liền mạch với CI của bạn, bất kể loại thử nghiệm, tần suất cam kết hay số lượng nhánh.


Lựa chọn thử nghiệm dự đoán có thể giảm 70% thời gian nhàn rỗi. Cung cấp cho nhà phát triển của bạn trải nghiệm tuyệt vời với phân tích tĩnh bằng thử nghiệm thông minh có quy mô.