มีเครื่องมือวิเคราะห์แบบคงที่ของ JavaScript หรือไม่? [ปิด]


111

ฉันคุ้นเคยกับการที่คอมไพเลอร์บ่นเมื่อฉันทำอะไรโง่ ๆ เช่นการพิมพ์ชื่อตัวแปรผิด แต่ JavaScript มีนิสัยที่จะปล่อยให้สิ่งนี้ผ่านไป

มีเครื่องมือวิเคราะห์แบบคงที่สำหรับ JavaScript หรือไม่?


1
วันนี้ typescript เป็นเพื่อนของคุณ - รองรับการตรวจสอบประเภทโดยนัยของจาวาสคริปต์และหากคุณต้องการดำเนินการ 100% คุณสามารถเขียนคำอธิบายประกอบ jsdoc3 หรือ google closed และจะอนุมานประเภทจากที่นั่น บรรณาธิการเช่น vscode หรือ webstorm สนับสนุนสิ่งนี้ทันที: github.com/Microsoft/TypeScript/wiki/…
Cancerbero

คำตอบ:


49

ฉันยอมรับว่า JSLint เป็นจุดเริ่มต้นที่ดีที่สุด โปรดทราบว่าJavaScript ผ้าสำลีแตกต่างจากJSLint ฉันขอแนะนำให้ตรวจสอบJSureซึ่งในการทดสอบแบบ จำกัด ของฉันทำได้ดีกว่าอย่างใดอย่างหนึ่งแม้ว่าจะมีขอบที่หยาบในการใช้งานก็ตาม - เวอร์ชัน Intel Mac เกิดข้อผิดพลาดในการเริ่มต้นสำหรับฉันแม้ว่าเวอร์ชัน PowerPC จะทำงานได้ดีแม้ใน Intel ก็ตาม และเวอร์ชัน Linux ก็ทำงานได้ดีเช่นกัน (ผู้พัฒนา Berke Durak กล่าวว่าเขาจะติดต่อกลับมาหาฉันเมื่อได้รับการแก้ไขแล้ว แต่ฉันไม่ได้รับการติดต่อจากเขา)

อย่าคาดหวังจากการวิเคราะห์แบบคงที่ของ JavaScript มากเท่าที่คุณจะได้รับจากตัวตรวจสอบ C ที่ดี ดังที่ Durak บอกกับฉันว่า“ การวิเคราะห์ที่ไม่สำคัญใด ๆ นั้นยากมากเนื่องจากลักษณะไดนามิกของ Javascript”

(ข้อผิดพลาดอื่น ๆ ที่คลุมเครือสำหรับ Mac เท่านั้นคราวนี้ด้วยวิดเจ็ต Konfabulator ของ JSLint: การลากไอคอนเอกสาร BBEdit ไปยังวิดเจ็ตจะย้ายเอกสารไปที่ถังขยะนักพัฒนา Douglas Crockford ไม่ได้ลองใช้วิดเจ็ตบน Mac)

10 สิงหาคม 2552: วันนี้ในการประชุมวิชาการวิเคราะห์แบบคงที่ Simon Holm Jensen ได้นำเสนอบทความเกี่ยวกับTAJS: Type Analyzer สำหรับ JavaScriptเขียนโดย Anders Møllerและ Peter Thiemann กระดาษไม่ได้กล่าวถึงเครื่องมือข้างต้น แต่ Jensen บอกฉันว่าเขาดูบางชิ้นแล้วไม่ประทับใจ รหัสสำหรับ TAJS ควรมีให้ในช่วงฤดูร้อนนี้


2
@UpTheCreek: JSLint มีอยู่ใน GitHub
Dave Swersky

@Dave โอ้ใช่เลยดีมาก :)
UpTheCreek

5
ซอร์สโค้ดสำหรับ TAJS พร้อมใช้งานแล้ว
Rich Dougherty

57

คำตอบที่อัปเดต 2017: ใช่ ใช้ ESLint http://eslint.org


นอกจากนี้ในการJSLint (ดังกล่าวแล้วในคำตอบแฟลชเชอริแดน ) และคอมไพเลอร์ปิด (ดังกล่าวก่อนหน้านี้ในคำตอบของ awhyte ) ฉันได้ยังมีอากาศมากได้รับประโยชน์จากการทำงานJSHintและPHP CodeSniffer ในปี 2012 เครื่องมือทั้งสี่เป็นโอเพ่นซอร์สฟรีและมีชุมชนนักพัฒนาขนาดใหญ่และกระตือรือร้นอยู่เบื้องหลังเครื่องมือเหล่านี้ แต่ละอย่างแตกต่างกันเล็กน้อย (และฉันคิดว่าเสริมกัน) ในประเภทของการตรวจสอบที่ดำเนินการ:

JSLintได้รับการออกแบบให้เป็นและยังคงเป็นเครื่องมือตัดขุยส่วนตัวของ Douglas Crockford มันมาพร้อมกับชุดกฎเริ่มต้นที่ยอดเยี่ยม - ของ Crockford เองซึ่งได้รับการอัปเดตอย่างต่อเนื่องในขณะที่เขายังคงเรียนรู้เกี่ยวกับ JavaScript และข้อผิดพลาดของมัน JSLint มีความเห็นเป็นอย่างมากและโดยทั่วไปแล้วสิ่งนี้ถูกมองว่าเป็นสิ่งที่ดี ดังนั้นจึงมี (โดยเจตนา) จำนวน จำกัด ที่คุณสามารถทำได้เพื่อกำหนดค่าหรือปิดใช้งานกฎแต่ละข้อ แต่อาจทำให้ยากที่จะใช้ JSLint กับรหัสเดิม

JSHintจะคล้ายกับ JSLint (ในความเป็นจริงมันเริ่มต้นชีวิตเป็น JSLint ส้อม) แต่มันเป็นเรื่องง่าย / ไปได้ที่จะกำหนดค่าหรือปิดใช้งานทั้งหมดของการตรวจสอบ JSLint ผ่านทางเลือกบรรทัดคำสั่งหรือผ่านทางไฟล์.jshintrc

โดยเฉพาะอย่างยิ่งผมเหมือนที่ผมสามารถบอก JSHint เพื่อรายงานทั้งหมดของข้อผิดพลาดในแฟ้มแม้ว่าจะมีหลายร้อยข้อผิดพลาด ในทางตรงกันข้ามแม้ว่า JSLint จะมีmaxerrตัวเลือกการกำหนดค่า แต่โดยทั่วไปจะประกันตัวค่อนข้างเร็วเมื่อพยายามประมวลผลไฟล์ที่มีข้อผิดพลาดจำนวนมาก

คอมไพเลอร์การปิดมีประโยชน์อย่างยิ่งหากโค้ดไม่รวบรวมด้วยการปิดคุณจะรู้สึกได้ว่าโค้ดดังกล่าวถูกบีบอย่างลึกซึ้งในลักษณะพื้นฐานบางประการ การรวบรวมการปิดอาจเป็นสิ่งที่ใกล้เคียงที่สุดที่มีอยู่ในโลก JS สำหรับการตรวจสอบไวยากรณ์ "ล่าม" เช่นphp -lหรือruby -c

การปิดยังเตือนคุณเกี่ยวกับปัญหาที่อาจเกิดขึ้นเช่นพารามิเตอร์ที่ขาดหายไปและตัวแปรที่ไม่ได้ประกาศหรือกำหนดใหม่ หากคุณไม่เห็นคำเตือนที่คุณคาดหวังให้ลองเพิ่มระดับการเตือนโดยเรียกใช้การปิดด้วยตัวเลือก--warning_level VERBOSE

PHP CodeSniffer สามารถแยกวิเคราะห์ JavaScriptเช่นเดียวกับ PHP และ CSS เรือ CodeSniffer กับหลายมาตรฐานการเข้ารหัสที่แตกต่างกัน (พูดphpcs -iจะเห็นพวกเขา) ซึ่งรวมถึง sniffs ที่มีประโยชน์มากมายสำหรับโค้ด JavaScript รวมทั้งการตรวจสอบกับโครงสร้างการควบคุมแบบอินไลน์และช่องว่างฟุ่มเฟือย

นี่คือรายการ sniffs JavaScript ที่มีอยู่ใน PHP CodeSniffer ในเวอร์ชัน 1.3.6 และนี่คือชุดกฎที่กำหนดเองที่จะช่วยให้คุณสามารถเรียกใช้ทั้งหมดได้ในครั้งเดียว การใช้ชุดกฎที่กำหนดเองทำให้ง่ายต่อการเลือกและเลือกกฎที่คุณต้องการใช้ และคุณยังสามารถเขียนกลิ่นของคุณเองได้หากต้องการบังคับใช้ "สไตล์บ้าน" ที่ไม่ได้รับการสนับสนุนนอกกรอบ Afaik CodeSniffer เป็นเครื่องมือเดียวในสี่ตัวที่กล่าวถึงในที่นี้ที่สนับสนุนการปรับแต่งและการสร้างกฎการวิเคราะห์แบบคงที่ใหม่ ข้อแม้ประการหนึ่ง: CodeSniffer ยังเป็นเครื่องมือที่ทำงานช้าที่สุดที่กล่าวถึง


2
ขณะนี้การตรวจจับการคัดลอกวางสำหรับโค้ด JavaScript สามารถใช้ได้ผ่าน CPD จากความรู้ของฉันนี่เป็นเครื่องมือทำสำเนาโอเพนซอร์สที่มีประสิทธิภาพตัวแรกสำหรับ JavaScript! pmd.sourceforge.netและดูคำถาม "มี CPD เหมือนกับเครื่องมือสำหรับ javascript หรือไม่" stackoverflow.com/a/13745190/55478
Noah Sussman

20

คอมไพเลอร์ JS "ปิด" ของ Googleสร้างคำเตือนและข้อผิดพลาดที่กำหนดค่าได้ในเวลาคอมไพล์ พบตัวแปรและวิธีการที่สะกดผิดอย่างแน่นอนรวมถึงข้อผิดพลาดของ arity หากคุณยินดีที่จะเขียน JsDoc วิธีปิดก็สามารถทำข้อมูลประเภทต่างๆได้มากเช่นกัน

เครื่องมือ "Compressor" ของ YUI สามารถสร้างคำเตือนได้เช่นกัน แต่ยังไม่ได้ลองใช้

ฉันไม่ค่อยมีโชคกับ Aptana IDE ที่สร้างขึ้นจาก Eclipse แต่คนอื่นชอบ ดูการอภิปราย Stack Overflow ของ JS IDE

IntelliJ IDE ซึ่งไม่ฟรีล่าสุดที่ฉันตรวจสอบมีการสนับสนุน JS ที่ยอดเยี่ยมของ frickin จะตรวจจับและไฮไลต์ตัวแปรและวิธีการที่สะกดผิดขณะที่คุณพิมพ์และอื่น ๆ มีการเติมข้อความอัตโนมัติด้วย


11

โดยสรุป JSLint, JSHint, Plato, ESLint, Google Closure-Linter เป็นเครื่องมือที่มีอยู่ ฉันประสบปัญหาในการติดตั้งขณะลองใช้ Google Closure-Linter สำหรับ Windows แต่มีการกล่าวถึงในหน้าเว็บว่าการสนับสนุนสำหรับ Windows เป็นการทดลอง ฉันพบและลองใช้เครื่องมืออื่นที่ใช้งานได้ดี นี่คือลิงค์สำหรับมัน: http://esprima.org/

นอกจากนี้นี่คือลิงก์ github สำหรับเครื่องมือ Esprima: https://github.com/ariya/esprima


7

คุณสามารถดูเครื่องมือบางอย่างสำหรับการวิเคราะห์โค้ดแบบคงที่ JavaScript ได้ในWikiนี้

เครื่องมือในวิกิพีเดีย แต่ไม่ได้กล่าวถึงในบทความนี้เป็นDeepScan จุดเน้นคือการค้นหาข้อผิดพลาดรันไทม์และปัญหาด้านคุณภาพมากกว่าการเขียนโค้ดของ linters นอกจากนี้ยังครอบคลุมถึง TypeScript, React และ Vue.js

คุณสามารถทดลองใช้กับโครงการ GitHub ของคุณ



4

ความปลอดภัยที่เน้นมากกว่ารายการวัตถุประสงค์ทั่วไปสามารถพบได้ใน Mozilla Wiki ที่การวิเคราะห์โค้ด Security / B2G / JavaScript

เอกสารนี้มีวัตถุประสงค์เพื่อรวบรวมเครื่องมือวิเคราะห์โค้ด JavaScript ที่เหมาะสำหรับรวมไว้ในโครงการ Mozilla ที่กำลังจะมาถึงหรือใช้งานภายใน

นอกจากนี้ยังมีผลิตภัณฑ์เชิงพาณิชย์อย่างน้อยหนึ่งผลิตภัณฑ์ที่วิเคราะห์ความปลอดภัย: Burp ได้รับความสามารถในการวิเคราะห์ JavaScript ใหม่

Burp รุ่นล่าสุดมีเอ็นจิ้นใหม่สำหรับการวิเคราะห์โค้ด JavaScript แบบคงที่ สิ่งนี้ทำให้ Burp Scanner สามารถรายงานช่องโหว่ใหม่ ๆ ได้แก่ :

  • XSS ที่ใช้ DOM
  • การฉีด JavaScript
  • การฉีด SQL ฝั่งไคลเอ็นต์
  • WebSocket หักหลัง
  • การจัดการเส้นทางไฟล์ในเครื่อง
  • การเปลี่ยนเส้นทางแบบเปิดตาม DOM
  • การจัดการคุกกี้
  • การจัดการส่วนหัวของคำขอ Ajax
  • การปฏิเสธการให้บริการโดยใช้ DOM
  • การจัดการข้อความเว็บ
  • การจัดการการจัดเก็บ HTML5

4

ในขอบเขตการค้าCoverity Static Analysisรองรับการวิเคราะห์ JavaScript ตั้งแต่เวอร์ชัน 7.7 (กลางปี ​​2015) เกี่ยวกับคำถามเฉพาะของคุณเกี่ยวกับการพิมพ์ผิดโครงการสัตว์เลี้ยงของฉันที่ปรากฏในรุ่นล่าสุด (8.0 ต้นปี 2016) พบการพิมพ์ผิดในชื่อองค์ประกอบของโปรแกรม

ในฐานะผู้พัฒนาหลักในโครงการโปรดยอมรับปลั๊กไร้ยางอายของฉัน: แม้ว่าจะยังไม่โตเต็มที่เท่าการวิเคราะห์ C / C ++ ที่ได้รับการยกย่อง แต่การวิเคราะห์ JavaScript ของ Coverity ก็ใช้เอนจิ้นเดียวกันส่วนใหญ่โดยเน้นที่การค้นหาข้อบกพร่องที่มีมูลค่าสูงในระดับต่ำ อัตรารายงานข้อบกพร่องที่เป็นบวกเท็จ เรากำลังให้ความสำคัญกับการค้นหาข้อบกพร่องด้านความปลอดภัยใน JavaScript (และภาษาอื่น ๆ ) นอกเหนือจากการค้นหาข้อผิดพลาดในการเขียนโปรแกรมทั่วไป

ต่อไปนี้เป็นข้อผิดพลาดบางประการที่พบ (การพิมพ์ผิดถูกทิ้งไว้เป็นแบบฝึกหัดสำหรับผู้อ่านเพื่อเน้นว่าสามารถมองข้ามสิ่งเหล่านี้ได้ง่ายเพียงใด):

merge.js: (ลิงก์ที่เสถียร) (แก้ไขล่าสุด)

คำสั่ง -Package-query.js: (ลิงค์ที่เสถียร) (การแก้ไขล่าสุด)

series-pie-tests.js: (ลิงก์ที่เสถียร) (แก้ไขล่าสุด)

outline_case.js: (ลิงก์ที่เสถียร) (แก้ไขล่าสุด)


3

ฉันชอบJslintสำหรับสิ่งนี้ ...


เย็น. ฉันพบปลั๊กอิน Eclipse สำหรับ JSLint ที่rockstarapps.com/joomla-1.5.8/products/…ซึ่งก็ดูดีเหมือนกัน โปรดทราบว่าจำเป็นต้องติดตั้งจากไซต์ 'Eclipse Update สำหรับ jsLex 1.2.2 เวอร์ชันเบต้าเพื่อรับฟังก์ชัน JSLint
จ้า

3

Flowทำการวิเคราะห์แบบคงที่โดยมีและไม่มีคำอธิบายประกอบ

หากคุณต้องการคำอธิบายประกอบไวยากรณ์คือเข้ากันได้กับtypescript

ติดตั้งแพ็คเกจด้วย:

npm install --global flow-bin

นอกจากนี้ยังมีเครื่องมือบางอย่าง ลองดูที่gulp-flowtypeและบางทีSublimeLinter-flow


2

JSAnalyse เพิ่งเผยแพร่บน codeplex เป็นเครื่องมือที่วิเคราะห์การอ้างอิงระหว่างไฟล์จาวาสคริปต์ คุณยังสามารถกำหนดการอ้างอิงที่อนุญาตและ JSAnalysis ตรวจสอบว่าเป็นไปตามกฎที่กำหนดไว้หรือไม่ ที่ช่วยให้ติดตามเกี่ยวกับการพึ่งพาจาวาสคริปต์แม้ในโครงการขนาดใหญ่และมีสถาปัตยกรรมที่สะอาดตา

JSAnalyse สามารถดำเนินการเป็นเครื่องมือบรรทัดคำสั่งหรือกำหนดค่าผ่าน Visual Studio Layer Diagramm นอกจากนี้ยังง่ายต่อการรวมเข้ากับบิลด์ ด้วยการเช็คอินแบบ gated คุณสามารถควบคุมการอ้างอิงได้

http://jsanalyse.codeplex.com/


1

SD ECMAScript CloneDRของเราเป็นเครื่องมือในการค้นหาสำเนาที่แน่นอนและใกล้พลาดของรหัสที่ซ้ำกันในฐานซอร์สโค้ด JavaScript ขนาดใหญ่

มันใช้ไวยากรณ์ของภาษาเพื่อเป็นแนวทางในการตรวจจับดังนั้นมันจะพบโคลนแม้ว่าจะมีการเปลี่ยนแปลงรูปแบบความคิดเห็นที่แทรก / ลบตัวแปรที่เปลี่ยนชื่อและแม้แต่คำสั่งแทรก / ลบบางส่วน

ไซต์นี้มี CloneDR ตัวอย่างที่รันบนไลบรารีการปิดของ Google


มีใครลองตัวนี้หรือยัง ไม่พบปุ่มดาวน์โหลดหรือสั่งซื้อใด ๆ ...
Sven Hecht

... ตั้งแต่เดือนมกราคม 2011 ... มีลิงค์ดาวน์โหลดที่คุณสามารถใช้เพื่อรับสำเนา eval ของ CloneDR สำหรับ JavaScript (หรือภาษาอื่น ๆ ) เพื่อเล่นด้วย
Ira Baxter

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.