ความแตกต่างระหว่างการวิเคราะห์รหัสคงที่และการตรวจสอบรหัสคืออะไร?


9

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


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

9
ในสองคำ? "สมอง"
MSalters

คำตอบ:


19

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

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


2
ฉันมักจะตกอยู่ภายใต้ความประทับใจว่าการตรวจสอบโค้ดเป็นการวิเคราะห์แบบคงที่เนื่องจากเป็นวิธีการวัดความสมบูรณ์ของซอฟต์แวร์โดยไม่ต้องดำเนินการ
Buhb

4
@Buhb: มันยิ่งเพิ่มความรู้ในบริบท ผู้ตรวจสอบโค้ดควรเข้าใจว่ารหัสกำลังทำสิ่งที่คาดหวังไว้หรือไม่ เครื่องมือแบบคงที่จะ (ที่ดีที่สุดถ้าภาษาที่ช่วยให้มันผ่านการตกแต่ง / การยืนยัน / สัญญา) ตรวจสอบว่าทุกอย่างเป็นทางการก็โอเค ... ดังนั้นคุณสามารถใส่มันในวิธีอื่น: การวิเคราะห์แบบคงที่คือการตรวจสอบรหัส อัลกอริทึม
ฟรานเชสโก

เพียงเพื่อเพิ่มผ้าสำลี (นักวิเคราะห์แบบคงที่):เพื่อนที่ไม่จำเป็น !! เพื่อนร่วมงาน (ผู้ตรวจสอบ):คุณสามารถทำแบบนั้นได้ด้วย !!
Kushal

11

การวิเคราะห์เชิงสถิตคือกระบวนการวิเคราะห์ซอฟต์แวร์โดยไม่ต้องดำเนินการ นี่เป็นสิ่งที่ดีมากและแนะนำ แต่คุณต้องจำไว้ว่า

  1. เครื่องมือวิเคราะห์สแตติกที่แตกต่างกันมีความเข้าใจที่แตกต่างกันของรหัสที่พวกเขากำลังศึกษาอยู่ดังนั้นพวกเขาจึงสามารถส่งสัญญาณ เครื่องมือหนึ่งสามารถให้รายงานที่สะอาดได้และอีกเครื่องมือหนึ่งอาจบ่นได้หลายล้านเรื่อง
  2. เครื่องมือแบบไดนามิก (เพื่อตั้งชื่อตัวอย่างลองนึกถึง valgrind) สามารถค้นหาปัญหาอื่น ๆ อีกมากมายในราคาที่เป็นภาระร้ายแรงในการใช้ทรัพยากร (เวลาการใช้หน่วยความจำ) นี่เป็นเพราะคุณมักจะใช้งานซอฟต์แวร์เวอร์ชั่น โปรดสังเกตว่าด้วยการใช้เครื่องมือในทางใดทางหนึ่ง (แทนที่ malloc ของคุณด้วย debug malloc) มันไม่เหมือนกับซอฟต์แวร์ของคุณอย่างแน่นอน (อย่างที่คุณเห็นจากเวลาทำการ)

วิธีการทั้งสองนี้ประสบจากการขาดบริบท: พวกเขาไม่ทราบว่า sw ควรจะบรรลุอะไร

การตรวจสอบรหัสนั้นทำโดยผู้ทำรหัสอีกคนที่ควรจะรู้และสามารถตรวจสอบได้

  1. ถ้ารหัสถูกต้อง
  2. หากซอฟต์แวร์นั้นถูกต้องทางอรรถศาสตร์

มันมีราคาแพงกว่ามากและมีระดับการทำซ้ำที่แตกต่างกัน แต่เป็นความช่วยเหลือที่ดี

เช่นเคยไม่มี bullet เงินเดียวที่จะแก้ไขข้อบกพร่องทั้งหมดและหลีกเลี่ยงปัญหาทั้งหมด ใช้ - ให้มากที่สุดเท่าที่เป็นไปได้ให้สถานที่, รหัส, เวลา, สามรูปแบบของการตรวจสอบ (คงที่, แบบไดนามิก, ดวงตามากขึ้น (และสมอง) ดูรหัสจริง)

ps: ฉันต้องทราบว่าโดยปกติแล้วจะเป็นการดีกว่ามากหากใช้เครื่องมือตั้งแต่เริ่มต้น การแปลงระบบมรดกเป็นประสบการณ์ที่น่าพึงพอใจน้อยกว่ามากเนื่องจากผลบวกปลอม หากคุณเริ่มต้นจากศูนย์และมุ่งรักษาเครื่องมือวิเคราะห์ให้สะอาดอยู่เสมอคุณอาจหลีกเลี่ยงปัญหาได้มากมาย

pps: สำหรับเครื่องมือมันขึ้นอยู่กับภาษา ในโลก C และ C ++ คุณสามารถเริ่มต้นด้วยการดู Visual Studio ซึ่งมีเครื่องมือวิเคราะห์แบบคงที่ในตัว รายการที่ค่อนข้างสมบูรณ์สามารถพบได้ใน Wikipedia

ppps: การวิเคราะห์แบบสถิตเหมาะกับภาษาแบบคงที่เช่น C หรือ C ++ สำหรับ Python มันยากมากที่จะบอกว่าชื่อที่อ้างถึงรายการ ณ จุดหนึ่งจะอ้างถึงรายการสำหรับส่วนที่เหลือของโปรแกรมเนื่องจากคุณสมบัติแบบไดนามิก นี่ไม่ได้หมายความว่าจะไม่สามารถทำอะไรได้เลยเนื่องจากความพยายามของ JIT อย่างPyPyแสดงให้เห็น


2

การตรวจสอบรหัสคือเมื่อผู้อาวุโสหรือผู้มีอำนาจตรวจสอบรหัสของคุณวิธีการเข้ารหัสมาตรฐานที่ใช้ในรหัสและโดยเฉพาะระดับตรรกะของรหัส

เท่าที่เกี่ยวข้องกับการวิเคราะห์แบบคงที่มันคือการวิเคราะห์ซอฟต์แวร์คอมพิวเตอร์ที่ดำเนินการโดยไม่ได้ใช้งานโปรแกรมที่สร้างขึ้นจริงจากซอฟต์แวร์นั้น (การวิเคราะห์ที่ดำเนินการกับโปรแกรมที่เรียกว่าการวิเคราะห์แบบไดนามิก)

รายการเครื่องมือตามเทคโนโลยีมีให้ในลิงค์ด้านล่าง

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

ดังนั้นการตรวจสอบโค้ดและการวิเคราะห์แบบสแตติกจึงแตกต่างกันโดยสิ้นเชิง


7
คำตอบของ OM นั้นถูกต้องเป็นหลักยกเว้นว่าฉันเล่นลิ้นกับ 'A Senior หรือ Dedicated Authority ตรวจสอบรหัสของคุณ ... ' เป็นความจริงที่ว่าร้านค้าที่ผิดปกติบางแห่งดำเนินการตรวจสอบโค้ดในลักษณะหลัก / ลูกนี้ร้านค้าจำนวนมาก (และดีกว่า) มีระบบตรวจสอบโค้ดแบบเพียร์ทูเพียร์ที่ไม่เหมือนกับครูที่ให้คะแนนการบ้าน ฉันทำงานที่ไหนมันเป็นเรื่องธรรมดาสำหรับผู้อยู่ใต้บังคับบัญชาที่จะทบทวนงานของรุ่นพี่ วัตถุประสงค์คือเพื่อให้ดวงตาคู่ที่สองมองดูรหัสทั้งหมดก่อนที่จะถูกตรวจสอบ
Jim In Texas

2
@JimInTexas เหมือนกันในร้านของเรา ฉันจะบอกว่าผลลัพธ์ที่สำคัญที่สุด (ในระยะยาว) ของการตรวจสอบโค้ดคือการกระจายความรู้การปฏิบัติแบบรวมและวิสัยทัศน์ด้านสถาปัตยกรรม / การออกแบบทั่วทั้งทีม ในแง่นี้ผู้อยู่ใต้บังคับบัญชาที่ตรวจสอบรหัสของผู้อาวุโสนั้นเป็นวิธีที่ดีที่สุดในการเรียนรู้แนวปฏิบัติที่ดีที่สุดในท้องถิ่น - แต่ใครบอกว่าผู้อาวุโสไม่เคยทำผิดพลาด
PéterTörök

1

การตรวจสอบรหัสเป็นการประเมินเชิงคุณภาพมากขึ้นการวิเคราะห์รหัสแบบคงที่เป็นการประเมินเชิงปริมาณมากขึ้น

เฮ้เด็กชายวิธีนี้สามารถเขียนได้ดีกว่า

vs, fe

ประสิทธิภาพลดลง ไม่มีประสิทธิภาพในการระบุสตริงว่างโดยใช้โครงสร้าง 'wcslen (str)> 0' วิธีที่มีประสิทธิภาพมากขึ้นคือการตรวจสอบ: str [0]! = '\ 0'

ประสิทธิภาพลดลง การแสดงออกของชนิด strlen (MyStr.c_str ()) สามารถเขียนใหม่เป็น MyStr.length ()

ประสิทธิภาพลดลง ในกรณีที่ 'สั่งซื้อ' เป็นตัววนซ้ำจะมีประสิทธิภาพมากกว่าในการใช้รูปแบบการเพิ่มคำนำหน้า แทนที่ iterator ++ ด้วย ++ iterator

ในขณะที่ข้อผิดพลาดจริงสามารถ (ชัด) อยู่และตรวจพบโดย SCA

รูปแบบไม่ถูกต้อง ลองตรวจสอบอาร์กิวเมนต์ N จริงของฟังก์ชัน 'Foo'

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

การเรียกใช้ฟังก์ชั่น 'memset' จะนำไปสู่ ​​underflow ของบัฟเฟอร์ 'dest.lfFaceName'


ขอโทษที่ดูถูกคุณ เท่าที่ความคิดเห็นของฉัน (หายไป?) มีจุดมุ่งหมายเพื่อพูด - คุณรู้หรือไม่ว่าทำไมมนุษย์ไม่สามารถเสนอความคิดเห็นแบบเดียวกับที่คุณให้ไว้เป็นตัวอย่างของผลลัพธ์จากการวิเคราะห์รหัสคงที่?
sq33G

@ sq33G: ไม่ผู้ใดก็ตามที่ใช้เครื่องใช้สำนักงาน (กระดาษจำนวน จำกัด ) สามารถจำลองเครื่องทัวริงได้ตามอำเภอใจ อย่างไรก็ตามมันน่าเบื่อและใช้เวลานาน (อาจเป็นไปไม่ได้ แต่ให้บอกพฤติกรรมที่ไม่ได้กำหนดใน C)
Maciej Piechotka

อา. ดังนั้นคำตอบที่แท้จริงสำหรับคำถามของ OP คือเครื่องทัวริงไม่สมบูรณ์แบบ
sq33G

0

การวิเคราะห์แบบสแตติกคือเมื่อวิเคราะห์สิ่งประดิษฐ์โดยไม่ต้องดำเนินการ แม้ว่าจะสามารถนำไปใช้กับสิ่งประดิษฐ์ใด ๆ ก็มักจะนำไปใช้กับซอร์สโค้ดหรือรหัสวัตถุและหมายถึงการใช้เครื่องมือเฉพาะในการวิเคราะห์และรับข้อมูลเกี่ยวกับผลิตภัณฑ์งานเหล่านี้ เครื่องมือเหล่านี้จัดทำรายงานที่วิศวกรตีความเพื่อใช้ในการกำหนดคุณภาพของระบบที่กำลังก่อสร้างและเป็นแนวทางในการวางแผนการพัฒนาและบำรุงรักษา Wikipedia มีรายการเครื่องมือสำหรับการวิเคราะห์เชิงสถิตจัดเรียงตามภาษาและคำอธิบายโดยย่อเกี่ยวกับความสามารถของพวกเขา

ความคิดเห็นเป็นการประเมินโดยมนุษย์ของผลิตภัณฑ์ทำงานบางอย่างซึ่งอาจเป็นรหัส ความคิดเห็นยังสามารถดำเนินการในการออกแบบหรือเอกสารอื่น ๆ เช่นกัน แนวคิดคือคนที่คุ้นเคยกับผลิตภัณฑ์งานนอกเหนือจากผู้พัฒนากำลังมองหามันเพื่อหาข้อผิดพลาดตั้งแต่ปัญหาด้านความปลอดภัยไปจนถึงการละเมิดมาตรฐานการเข้ารหัส

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


-2

การตรวจสอบโค้ดเป็นเทคนิคที่มีประโยชน์ในการดมกลิ่นปัญหาในซอร์สโค้ดตั้งแต่เริ่มแรก เป็นส่วนหนึ่งของแบบฝึกหัดนี้หลายประเด็นเช่นประสิทธิภาพการขยายขีดความสามารถและมาตรฐานการเข้ารหัสที่ระบุและแก้ไข สิ่งนี้จะปรับปรุงคุณภาพรหัส

การวิเคราะห์แบบสแตติกใช้สำหรับวิเคราะห์ตัวชี้วัดคุณภาพของรหัสเช่นความซับซ้อนของไซโคลเมทริกดัชนีการบำรุงรักษาความลึกของการสืบทอดและข้อต่อคลาส เครื่องมือต่าง ๆ ที่มีอยู่ในตลาดเพื่อวิเคราะห์คุณภาพของรหัส นักพัฒนา C # ใช้ Microsoft visual studio เพื่อสร้างรายงานเมตริก


-3

การวิเคราะห์โค้ดแบบสแตติกดำเนินการโดยเครื่องมืออัตโนมัติการตรวจสอบโค้ดจะทำกับคนก่อนที่จะส่งรหัส

เครื่องมือสำหรับการตรวจสอบรหัส:

1. เปรียบเทียบก่อน

2. ส่วนต่างของซอฟต์แวร์ควบคุมเวอร์ชัน

เครื่องมือเหล่านี้ใช้เพื่อสร้างความแตกต่างระหว่างเวอร์ชันเก่ากับเวอร์ชันใหม่เสมอ


2
1) ไม่จำเป็นต้องเป็นรหัสก่อน - ผู้คนจะทำการตรวจสอบรหัสและ 2) ฉันพบว่าคำอธิบายของเครื่องมือต่าง ๆ เป็นเครื่องมือตรวจสอบรหัส "น่าสนใจ" แน่นอนว่าเป็นเครื่องมือที่ใช้ในการระบุรหัสเพื่อการตรวจสอบ แต่ถ้า ฉันถูกถามเกี่ยวกับเครื่องมือตรวจสอบรหัสฉันอาจชี้ไปที่เครื่องมือที่ช่วยจัดการกระบวนการ (ฉันใช้ Kiln และ Crucible เป็นต้น)
Murph
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.