Sự khác biệt giữa phân tích mã tĩnh và xem xét mã là gì?


9

Tôi chỉ muốn biết sự khác biệt giữa phân tích mã tĩnh và xem xét mã. Làm thế nào là hai trong số này được thực hiện? Cụ thể hơn, các công cụ hiện có để xem xét mã / phân tích tĩnh của PHP là gì? Tôi cũng muốn biết về các công cụ tốt để xem lại mã cho bất kỳ ngôn ngữ nào.


Đánh giá mã nói chung là một quy trình thủ công, theo đó một lập trình viên khác xem qua mã của bạn. Đó là một cách để phát hiện ra những sai lầm nhỏ hoặc sai lệch so với các quy ước mã hóa, v.v. và là một cách tốt để cải thiện chất lượng mã tổng thể. Phân tích mã tĩnh là thứ bạn có thể sử dụng một công cụ, mặc dù tôi chưa bao giờ tự làm việc này. Quan tâm để xem những câu trả lời của người khác

9
Trong hai từ? "Một bộ não".
MSalters

Câu trả lời:


19

Đánh giá mã là một cái gì đó mọi người làm, phân tích tĩnh là một cái gì đó máy móc làm. Có (đôi khi tốt) công cụ phân tích tĩnh. Đánh giá mã là khi một đồng nghiệp / cố vấn / giáo sư / bạn bè đi qua mã của bạn và đưa ra lời phê bình mang tính xây dựng.

Mặt khác, phân tích tĩnh là một quy trình tự động trong đó một máy, được thông báo bởi những gì nó biết về ngôn ngữ mà nó đang phân tích (thường là từ hệ thống loại), phân tích một chương trình và cố gắng chọn ra những thứ có thể không chính xác, không hiệu quả, phong cách kém, hoặc nếu không tối ưu.


2
Tôi luôn có ấn tượng rằng đánh giá mã là một loại phân tích tĩnh, vì đó là cách đo lường sức khỏe của phần mềm mà không cần thực hiện nó.
Buhb

4
@Buhb: nó bổ sung kiến ​​thức về bối cảnh. Một người xem xét mã nên hiểu nếu mã đang làm những gì được dự kiến ​​sẽ làm. Một công cụ tĩnh sẽ (tốt nhất là, nếu ngôn ngữ cho phép nó thông qua một số trang trí / khẳng định / hợp đồng) kiểm tra rằng chính thức mọi thứ đều ổn ... Vì vậy, bạn có thể đặt nó theo cách khác: phân tích tĩnh là một loại đánh giá mã, được thực hiện theo thuật toán.
Francesco

Chỉ cần thêm, Lint (nhà phân tích tĩnh): Không cần thiết !! Đồng nghiệp (Người đánh giá): Bạn cũng có thể làm theo cách đó !!
Kushal

11

Phân tích tĩnh là quá trình phân tích một phần mềm mà không thực hiện nó. Điều này là rất tốt và được khuyến khích, nhưng bạn phải nhớ rằng

  1. các công cụ phân tích tĩnh khác nhau có sự hiểu biết khác nhau về mã mà họ đang nghiên cứu, do đó chúng có thể báo hiệu (hoặc không báo hiệu) các vấn đề khác nhau. Một công cụ có thể đưa ra một báo cáo rõ ràng và công cụ kia có thể phàn nàn về một triệu điều.
  2. một công cụ động (để đặt tên cho một ví dụ, nghĩ về valgrind) có thể tìm thấy nhiều vấn đề khác, với giá của một gánh nặng nghiêm trọng đối với việc tiêu thụ tài nguyên (thời gian, sử dụng bộ nhớ). Điều này là như vậy bởi vì bạn thường chạy một phiên bản phần mềm cụ. Lưu ý rằng, bằng cách được thiết bị theo một cách nào đó (thay thế malloc của bạn bằng một malloc gỡ lỗi), nó không hoàn toàn giống với phần mềm của bạn (như bạn có thể thấy từ thời gian thực hiện)

Cả hai cách tiếp cận này đều bị thiếu ngữ cảnh: họ không biết những gì sw cần phải đạt được.

Đánh giá mã được thực hiện bởi một lập trình viên khác, người được cho là biết nó và có thể kiểm tra

  1. nếu mã đúng
  2. nếu phần mềm đúng về mặt ngữ nghĩa.

Nó đắt hơn nhiều và nó có mức độ lặp lại khác nhau nhưng là một trợ giúp tuyệt vời.

Như mọi khi, không có một viên đạn bạc nào có thể khắc phục tất cả các lỗi và tránh tất cả các vấn đề. Áp dụng - càng nhiều càng tốt cho địa điểm, mã, thời gian, ba hình thức kiểm tra (tĩnh, động, nhiều mắt (và não) thực sự nhìn vào mã) được khuyến nghị.

ps: Tôi phải lưu ý rằng việc áp dụng các công cụ từ đầu thường tốt hơn nhiều. Chuyển đổi một hệ thống di sản là một kinh nghiệm ít thú vị hơn nhiều, do tích cực sai. Nếu bạn bắt đầu từ đầu và luôn hướng đến việc giữ cho công cụ phân tích sạch sẽ, có lẽ bạn sẽ tránh được rất nhiều vấn đề.

pps: như đối với các công cụ, nó phụ thuộc vào ngôn ngữ. Trong thế giới C và C ++, bạn có thể bắt đầu bằng cách nhìn vào Visual Studio, nơi chứa công cụ phân tích tĩnh tích hợp. Một danh sách tương đối đầy đủ có thể được tìm thấy trên Wikipedia.

ppps: Phân tích tĩnh phù hợp hơn với các ngôn ngữ tĩnh, như C hoặc C ++. Đối với Python, có thể rất khó để nói nếu một tên đề cập đến một danh sách tại một điểm sẽ đề cập đến một danh sách cho phần còn lại của chương trình, do các thuộc tính động của nó. Điều này không có nghĩa là không có gì có thể được thực hiện, như một nỗ lực của JIT như PyPy cho thấy.


2

Đánh giá mã là khi cấp cao hoặc cơ quan chuyên trách kiểm tra mã của bạn, cách mã hóa của bạn, các tiêu chuẩn tuân theo mã và cụ thể là mức logic của mã

Theo như phân tích tĩnh, đó là phân tích phần mềm máy tính được thực hiện mà không thực sự thực hiện các chương trình được xây dựng từ phần mềm đó (phân tích được thực hiện trên các chương trình thực thi được gọi là phân tích động)

Danh sách các công cụ theo công nghệ được đưa ra trong liên kết dưới đây

Danh sách các công cụ để phân tích tĩnh

Do đó xem xét mã và phân tích tĩnh là các thuật ngữ hoàn toàn khác nhau.


7
Câu trả lời của OM về cơ bản là chính xác, ngoại trừ việc tôi ngụy biện với 'Người cao cấp hoặc Cơ quan chuyên trách kiểm tra mã của bạn ...'. Đúng là một số cửa hàng dị thường tiến hành đánh giá mã theo cách phụ huynh / trẻ em này, nhiều cửa hàng (và tốt hơn) có hệ thống đánh giá mã ngang hàng không giống với giáo viên chấm điểm bài tập về nhà. Nơi tôi làm việc, việc một thiếu niên xem xét công việc của một học sinh cuối cấp là điều bình thường. Mục tiêu là để có một cặp mắt thứ hai nhìn vào tất cả các mã trước khi nó được kiểm tra.
Jim In Texas

2
@JimInTexas, tương tự trong cửa hàng của chúng tôi. Tôi muốn nói rằng kết quả quan trọng nhất (dài hạn) của việc đánh giá mã là truyền bá kiến ​​thức, thống nhất thực tiễn và tầm nhìn kiến ​​trúc / thiết kế trong toàn đội. Về mặt này, một thiếu niên xem xét mã của một cấp cao tệ nhất là một cách tuyệt vời để học các thực hành tốt nhất tại địa phương - nhưng ai nói rằng một cấp cao không bao giờ phạm sai lầm và một thiếu niên không bao giờ có thể phát hiện ra những điều này?
Péter Török

1

Đánh giá mã là đánh giá định tính hơn, phân tích mã tĩnh là đánh giá định lượng nhiều hơn.

Này, chàng trai, phương pháp này có thể được viết tốt hơn

đấu với

Hiệu suất giảm. Sẽ không hiệu quả khi xác định một chuỗi rỗng bằng cách sử dụng cấu trúc 'wcslen (str)> 0'. Một cách hiệu quả hơn là kiểm tra: str [0]! = '\ 0'.

Hiệu suất giảm. Biểu thức của loại strlen (MyStr.c_str ()) có thể được viết lại thành MyStr.length ()

Hiệu suất giảm. Trong trường hợp 'Đặt hàng' là trình vòng lặp, việc sử dụng hình thức tiền tố gia tăng sẽ hiệu quả hơn. Thay thế iterator ++ bằng ++ iterator.

Mặc dù lỗi thực sự có thể (rõ ràng) tồn tại và được SCA phát hiện

Định dạng không chính xác. Xem xét kiểm tra đối số N thực tế của chức năng 'Foo'

Biểu thức được bao quanh bởi dấu ngoặc đơn hai lần: ((biểu thức)). Một cặp dấu ngoặc đơn là không cần thiết hoặc hiện diện sai

Một cuộc gọi của chức năng 'memset' sẽ dẫn đến việc tràn bộ đệm 'Dest.lfFaceName'


xin lỗi để xúc phạm bạn Theo như những gì bình luận (biến mất?) Của tôi dự định nói - bạn có biết lý do nào khiến con người không thể đưa ra những bình luận giống như bạn cung cấp như các ví dụ về đầu ra từ phân tích mã tĩnh không?
sq33G

@ sq33G: Không. Bất kỳ người nào có đồ dùng văn phòng (số lượng giấy thực tế vô hạn) có thể mô phỏng máy Turing tùy ý. Tuy nhiên nó là nhàm chán và tốn thời gian. (Có thể không phải là người được đưa ra nhưng nói những hành vi không xác định trong C).
Maciej Piechotka

Ah. Vì vậy, câu trả lời thực sự cho câu hỏi của OP là máy Turing không phải là con người hoàn chỉnh.
sq33G

0

Phân tích tĩnh là khi một tạo tác được phân tích mà không được thực thi. Mặc dù nó có thể được áp dụng cho bất kỳ vật phẩm nào, nó thường được áp dụng cho mã nguồn hoặc mã đối tượng và đề cập đến việc sử dụng các công cụ cụ thể để phân tích và thu thập thông tin về các sản phẩm công việc này. Các công cụ này tạo ra các báo cáo được giải thích bởi một kỹ sư để sử dụng trong việc xác định chất lượng của hệ thống đang được xây dựng và như một hướng dẫn để lập kế hoạch phát triển và bảo trì. Wikipedia có một danh sách các công cụ để phân tích tĩnh , được tổ chức theo ngôn ngữ và với một mô tả ngắn gọn về khả năng của chúng.

Đánh giá là một đánh giá của con người về một số sản phẩm công việc, có thể là mã. Đánh giá cũng có thể được tiến hành trên các thiết kế hoặc các tài liệu khác là tốt. Ý tưởng là những người quen thuộc với sản phẩm công việc khác ngoài nhà phát triển đang xem xét nó để tìm lỗi, từ các vấn đề bảo mật đến vi phạm tiêu chuẩn mã hóa.

Về mặt kỹ thuật, đánh giá mã có thể được coi là một hình thức phân tích tĩnh, vì mã không thực sự được thực thi trong quá trình xem xét. Tuy nhiên, theo thuật ngữ chung, "phân tích tĩnh" thường đề cập đến phân tích cú pháp máy của các tệp nguồn hoặc đối tượng trong khi "xem xét" chỉ ra rằng con người là người thực hiện phân tích.


-2

Xem lại mã là kỹ thuật hữu ích để ngửi thấy các vấn đề trong mã nguồn ở giai đoạn rất sớm. Là một phần của bài tập này, nhiều vấn đề như hiệu suất, khả năng mở rộng và các tiêu chuẩn mã hóa được xác định và khắc phục. Điều này sẽ cải thiện chất lượng mã.

Phân tích tĩnh được sử dụng để phân tích các số liệu chất lượng mã như độ phức tạp chu kỳ, chỉ số duy trì, độ sâu kế thừa và khớp nối lớp. Các công cụ khác nhau có sẵn trên thị trường để phân tích chất lượng mã. Nhà phát triển C # sử dụng Microsoft visual studio để tạo báo cáo số liệu.


-3

phân tích mã tĩnh được thực hiện bởi công cụ tự động, đánh giá mã được thực hiện với mọi người trước khi mã được cam kết.

Các công cụ để xem xét mã:

1. so sánh

2. khác biệt của phần mềm kiểm soát phiên bản

Những công cụ này luôn được sử dụng để tạo ra sự khác biệt giữa phiên bản cũ và phiên bản mới.


2
1) Không cần phải có trước khi mã được cam kết - việc xem xét mã được thực hiện bởi mọi người và 2) Tôi thấy mô tả về các công cụ tìm khác biệt như các công cụ đánh giá mã "thú vị" chắc chắn chúng là các công cụ được sử dụng để xác định mã để xem xét Tôi đã được hỏi về các công cụ đánh giá mã có lẽ tôi chỉ vào những công cụ giúp quản lý quy trình (ví dụ tôi đã sử dụng Kiln và Crucible).
Murph
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.