Có bất kỳ công cụ phân tích tĩnh JavaScript nào không? [đóng cửa]


110

Tôi đã quen với việc trình biên dịch của mình phàn nàn khi tôi làm điều gì đó ngu ngốc như lỗi đánh máy trên tên biến nhưng JavaScript có thói quen để điều này vượt qua.

Có bất kỳ công cụ phân tích tĩnh nào cho JavaScript không?


1
Bây giờ một bảng chữ cái ngày là bạn của bạn - nó hỗ trợ kiểm tra kiểu ngầm của javascript và nếu bạn muốn hoàn thành 100%, bạn có thể viết jsdoc3 hoặc chú thích đóng google và nó sẽ suy ra các loại từ đó. Các trình chỉnh sửa như vscode hoặc webstorm hỗ trợ nó ngay lập tức: github.com/Microsoft/TypeScript/wiki/…
cancerbero

Câu trả lời:


49

Tôi đồng ý rằng JSLint là nơi tốt nhất để bắt đầu. Lưu ý rằng JavaScript Lint khác với JSLint . Tôi cũng khuyên bạn nên kiểm tra JSure , trong thử nghiệm giới hạn của tôi đã làm tốt hơn một trong hai cái đó, mặc dù có một số góc cạnh khó khăn khi triển khai — phiên bản Intel Mac bị lỗi khi khởi động đối với tôi, mặc dù phiên bản PowerPC chạy tốt ngay cả trên Intel, và phiên bản Linux cũng chạy tốt. (Nhà phát triển, Berke Durak, nói rằng anh ấy sẽ liên hệ lại với tôi khi điều này được khắc phục, nhưng tôi chưa nhận được tin tức từ anh ấy.)

Đừng mong đợi nhiều từ phân tích tĩnh JavaScript như bạn nhận được từ một trình kiểm tra C tốt. Như Durak đã nói với tôi, “bất kỳ phân tích không tầm thường nào đều rất khó do bản chất động của Javascript.”

(Một lỗi khác, thậm chí còn khó hiểu hơn chỉ dành cho Mac, lần này với tiện ích Konfabulator của JSLint: Kéo biểu tượng tài liệu BBEdit vào tiện ích sẽ chuyển tài liệu vào thùng rác. Nhà phát triển, Douglas Crockford, đã không thử tiện ích này trên máy Mac.)

Ngày 10 tháng 8 năm 2009: Hôm nay tại Hội nghị chuyên đề về phân tích tĩnh , Simon Holm Jensen đã trình bày một bài báo về TAJS: Type Analyzer cho JavaScript , được viết bởi Anders Møller và Peter Thiemann. Bài báo không đề cập đến các công cụ trên, nhưng Jensen nói với tôi rằng anh ấy đã xem một số trong số chúng và không ấn tượng. Mã cho TAJS sẽ có sẵn vào mùa hè này.


2
@UpTheCreek: JSLint hiện có trên GitHub.
Dave Swersky

@Dave oh đúng, thật tuyệt :)
UpTheCreek

5
Mã nguồn cho TAJS hiện đã có sẵn.
Rich Dougherty

57

CẬP NHẬT CÂU TRẢ LỜI, 2017: Có. Sử dụng ESLint. http://eslint.org


Ngoài JSLint (đã được đề cập trong câu trả lời của Flash Sheridan ) và trình biên dịch C Close (đã được đề cập trước đó trong câu trả lời của awhyte ), tôi cũng đã nhận được rất nhiều lợi ích từ việc chạy JSHintPHP CodeSniffer . Tính đến năm 2012, tất cả bốn công cụ đều là mã nguồn mở miễn phí và có một cộng đồng nhà phát triển lớn và tích cực đứng sau chúng. Mỗi loại đều khác nhau một chút (và tôi nghĩ là bổ sung cho nhau) trong các loại kiểm tra mà chúng thực hiện:

JSLint được thiết kế để trở thành, và vẫn là công cụ kẻ viền cá nhân của Douglas Crockford. Nó đi kèm với một bộ quy tắc mặc định tuyệt vời - của riêng Crockford, được cập nhật liên tục khi anh tiếp tục tìm hiểu về JavaScript và những cạm bẫy của nó. JSLint rất kiên định và đây thường được coi là một điều tốt. Vì vậy, có (cố ý) một số lượng giới hạn bạn có thể làm để định cấu hình hoặc tắt các quy tắc riêng lẻ. Nhưng điều này có thể khiến việc áp dụng JSLint vào mã kế thừa trở nên khó khăn.

JSHint rất giống với JSLint (trên thực tế nó bắt đầu ra đời với tên gọi JSLint fork) nhưng dễ dàng hơn / có thể cấu hình hoặc tắt tất cả các kiểm tra của JSLint thông qua các tùy chọn dòng lệnh hoặc qua một .jshintrctệp .

Tôi đặc biệt thích rằng tôi có thể yêu cầu JSHint báo cáo tất cả các lỗi trong một tệp, ngay cả khi có hàng trăm lỗi. Ngược lại, mặc dù JSLint có maxerrtùy chọn cấu hình, nhưng nói chung nó sẽ giải cứu tương đối sớm khi cố gắng xử lý các tệp chứa nhiều lỗi.

Trình biên dịch Closure cực kỳ hữu ích ở chỗ, nếu mã không được biên dịch với C Close, bạn có thể cảm thấy rất chắc chắn rằng đoạn mã đã nói đã được đào sâu theo một cách cơ bản nào đó. Biên dịch đóng cửa có thể là thứ gần nhất có trong thế giới JS đối với việc kiểm tra cú pháp "thông dịch viên" như php -lhoặcruby -c

C Close cũng cảnh báo bạn về các vấn đề tiềm ẩn như thiếu tham số và các biến không được khai báo hoặc xác định lại. Nếu bạn không thấy các cảnh báo mà bạn mong đợi, hãy thử tăng mức cảnh báo bằng cách gọi Đóng cửa với một tùy chọn--warning_level VERBOSE

PHP CodeSniffer có thể phân tích cú pháp JavaScript cũng như PHP và CSS. CodeSniffer cung cấp một số tiêu chuẩn mã hóa khác nhau, phpcs -ibao gồm nhiều tiêu chuẩn mã hóa hữu ích cho mã JavaScript bao gồm kiểm tra cấu trúc điều khiển nội tuyếnkhoảng trắng thừa .

Đây là danh sách các đoạn mã JavaScript có sẵn trong PHP CodeSniffer kể từ phiên bản 1.3.6 và đây là bộ quy tắc tùy chỉnh cho phép bạn chạy tất cả chúng cùng một lúc. Sử dụng bộ quy tắc tùy chỉnh, thật dễ dàng để chọn và chọn các quy tắc bạn muốn áp dụng. Và bạn thậm chí có thể viết các bài đánh giá của riêng mình nếu bạn muốn thực thi một "kiểu nội bộ" cụ thể không được hỗ trợ sẵn sàng. Afaik CodeSniffer là công cụ duy nhất trong số bốn công cụ được đề cập ở đây hỗ trợ tùy chỉnh và tạo các quy tắc phân tích tĩnh mới. Tuy nhiên, có một lưu ý: CodeSniffer cũng là công cụ chạy chậm nhất trong số các công cụ được đề cập.


2
Tính năng phát hiện sao chép-dán cho mã JavaScript hiện có sẵn qua CPD. Theo hiểu biết của tôi, đây là công cụ sao chép mã nguồn mở mạnh mẽ đầu tiên dành cho JavaScript! pmd.sourceforge.net và xem thêm câu hỏi "Có công cụ CPD like cho javascript không?" stackoverflow.com/a/13745190/55478
Noah Sussman

20

Trình biên dịch JS "Đóng cửa" của Google tạo ra các cảnh báo và lỗi có thể định cấu hình tại thời điểm biên dịch. Nó chắc chắn tìm thấy các biến và phương thức sai chính tả, cộng với các lỗi thường gặp. Nếu bạn sẵn sàng viết JsDoc theo cách Đóng cửa, nó cũng có thể làm được nhiều điều với thông tin kiểu.

Công cụ YUI "Compressor" cũng có thể đưa ra cảnh báo, nhưng vẫn chưa thử.

Tôi không gặp nhiều may mắn với Aptana IDE, được xây dựng trên Eclipse, nhưng những người khác lại thích nó. Xem phần thảo luận về Stack Overflow của các IDE JS.

IntelliJ IDE, không miễn phí lần cuối tôi kiểm tra, có hỗ trợ JS tuyệt vời. Nó sẽ phát hiện và đánh dấu các vars và phương thức sai chính tả khi bạn nhập, v.v. Nó cũng có tính năng tự động hoàn thành.


11

Tóm lại, JSLint, JSHint, Plato, ESLint, Google Closure-Linter là những công cụ có sẵn. Tôi đã gặp phải sự cố cài đặt khi dùng thử Google Closure-Linter dành cho Windows. Tuy nhiên, nó đề cập trên trang web rằng hỗ trợ của nó cho Windows là thử nghiệm. Tôi đã tìm thấy và thử một công cụ khác hoạt động tốt. Đây là liên kết cho nó: http://esprima.org/

Ngoài ra, đây là liên kết github cho công cụ Esprima: https://github.com/ariya/esprima


7

Bạn có thể xem một số công cụ để phân tích mã tĩnh JavaScript trong Wiki này .

Một công cụ trong Wiki, nhưng không được đề cập trong bài đăng này, là DeepScan . Trọng tâm của nó là tìm lỗi thời gian chạy và các vấn đề chất lượng hơn là các quy ước mã hóa của linters. Nó cũng bao gồm TypeScript, React và Vue.js.

Bạn có thể dùng thử cho dự án GitHub của mình.



4

Tập trung vào bảo mật hơn danh sách mục đích chung có thể tìm thấy trên Mozilla Wiki tại Phân tích mã bảo mật / B2G / JavaScript

Mục đích của tài liệu này là thu thập các công cụ phân tích mã JavaScript phù hợp để đưa vào các dự án Mozilla sắp tới hoặc sử dụng nội bộ.

Ngoài ra, có ít nhất một sản phẩm thương mại thực hiện phân tích bảo mật: Burp có các khả năng phân tích JavaScript mới

Bản phát hành mới nhất của Burp bao gồm một công cụ mới để phân tích tĩnh mã JavaScript. Điều này cho phép Burp Scanner báo cáo một loạt các lỗ hổng bảo mật mới, bao gồm:

  • XSS dựa trên DOM
  • Chèn JavaScript
  • Chèn SQL phía máy khách
  • Chiếm đoạt WebSocket
  • Thao tác đường dẫn tệp cục bộ
  • Chuyển hướng mở dựa trên DOM
  • Thao tác cookie
  • Thao tác tiêu đề yêu cầu Ajax
  • Từ chối dịch vụ dựa trên DOM
  • Thao tác tin nhắn web
  • Thao tác lưu trữ HTML5

4

Trong lĩnh vực thương mại, Coverity Static Analysis hỗ trợ phân tích JavaScript kể từ phiên bản 7.7 (giữa năm 2015). Về câu hỏi cụ thể của bạn về lỗi chính tả, dự án thú cưng của tôi xuất hiện trong bản phát hành mới nhất (8.0, đầu năm 2016) không tìm thấy lỗi chính tả trong tên của các phần tử chương trình.

Với tư cách là nhà phát triển chủ chốt của dự án, vui lòng chấp nhận kiến ​​thức không biết xấu hổ của tôi: Mặc dù chưa trưởng thành như phân tích C / C ++ đáng kính , nhưng phân tích JavaScript của Coverity chia sẻ hầu hết cùng một công cụ, với cùng trọng tâm là tìm ra các khiếm khuyết có giá trị cao với mức thấp tỷ lệ báo cáo khuyết tật dương tính giả. Chúng tôi đang tăng cường tập trung vào việc tìm kiếm các lỗi bảo mật trong JavaScript (và các ngôn ngữ khác), ngoài việc tìm ra các lỗi lập trình chung.

Bây giờ, đây là một số lỗi chính tả mà nó tìm thấy (lỗi chính xác được để lại như một bài tập cho người đọc, để nhấn mạnh rằng những lỗi này có thể bị bỏ qua dễ dàng như thế nào):

merge.js: (liên kết ổn định) (bản sửa đổi mới nhất)

lệnh-gói-truy vấn.js: (liên kết ổn định) (bản sửa đổi mới nhất)

series-pie-tests.js: (liên kết ổn định) (bản sửa đổi mới nhất)

outline_case.js: (liên kết ổn định) (bản sửa đổi mới nhất)


3

Tôi thích Jslint vì điều này ...


Mát mẻ. Tôi đã tìm thấy một plugin Eclipse cho JSLint tại rockstarapps.com/joomla-1.5.8/products/… trông cũng khá tốt. Lưu ý rằng người ta cần cài đặt từ 'trang web Cập nhật Eclipse cho Phiên bản Beta của jsLex 1.2.2' để có được chức năng JSLint.
Mat


2

JSAnalyse vừa được xuất bản trên codeplex. Nó là một công cụ phân tích sự phụ thuộc giữa các tệp javascript. Bạn thậm chí có thể xác định các phụ thuộc được phép và JSAnalysis kiểm tra xem các quy tắc đã xác định có được đáp ứng hay không. Điều đó cho phép theo dõi các phụ thuộc javascript ngay cả trong các dự án lớn và có kiến ​​trúc sạch sẽ.

JSAnalyse có thể được thực thi như một công cụ dòng lệnh hoặc được định cấu hình thông qua Visual Studio Layer Diagramm. Nó cũng dễ dàng tích hợp vào bản dựng. Với đăng ký có kiểm soát, bạn có thể kiểm soát các phần phụ thuộc.

http://jsanalyse.codeplex.com/


1

SD ECMAScript CloneDR của chúng tôi là một công cụ để tìm kiếm các bản sao chính xác và gần như bỏ sót của mã trùng lặp trên các cơ sở mã nguồn JavaScript lớn.

Nó sử dụng cú pháp ngôn ngữ để hướng dẫn phát hiện, vì vậy nó sẽ tìm thấy các bản sao bất chấp sự thay đổi định dạng, nhận xét bị chèn / xóa, các biến đổi tên và thậm chí một số câu lệnh được chèn / xóa.

Trang web có một CloneDR mẫu chạy trên thư viện Closure của Google.


có ai đã thử cái này chưa? Không tìm thấy bất kỳ tải về hoặc đặt hàng nút ...
Sven Hecht

... Kể từ tháng 1 năm 2011 ... có một liên kết tải xuống mà bạn có thể sử dụng để nhận bản sao eval của CloneDR cho JavaScript (hoặc một số ngôn ngữ khác) để chơi cùng.
Ira Baxter

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.