คำถามติดแท็ก software-verification

6
การตรวจสอบโปรแกรมอย่างเป็นทางการในทางปฏิบัติ
ในฐานะวิศวกรซอฟต์แวร์ฉันเขียนโค้ดจำนวนมากสำหรับผลิตภัณฑ์อุตสาหกรรม สิ่งที่ค่อนข้างซับซ้อนกับคลาส, เธรด, ความพยายามในการออกแบบบางอย่าง แต่ยังมีบางอย่างที่ทำให้ประสิทธิภาพลดลง ฉันทำการทดสอบจำนวนมากและฉันเหนื่อยกับการทดสอบดังนั้นฉันจึงสนใจในเครื่องมือพิสูจน์อย่างเป็นทางการเช่น Coq, Isabelle ... ฉันสามารถใช้สิ่งเหล่านี้เพื่อพิสูจน์อย่างเป็นทางการว่ารหัสของฉันปราศจากข้อบกพร่องและสามารถทำได้ ด้วยหรือ - แต่ทุกครั้งที่ฉันตรวจสอบหนึ่งในเครื่องมือเหล่านี้ฉันเดินออกไปโดยไม่มั่นใจว่าพวกเขาสามารถใช้งานได้สำหรับวิศวกรรมซอฟต์แวร์ทุกวัน ตอนนี้นั่นอาจเป็นฉันเท่านั้นและฉันกำลังมองหาตัวชี้ / ความคิดเห็น / ความคิดเกี่ยวกับที่ :-) โดยเฉพาะฉันได้รับความประทับใจว่าการทำให้หนึ่งในเครื่องมือเหล่านี้ใช้งานได้สำหรับฉันจะต้องใช้เงินลงทุนจำนวนมากในการกำหนดวัตถุวิธีการ ... ของโปรแกรมภายใต้การพิจารณาอย่างเหมาะสม จากนั้นฉันก็สงสัยว่านักปราชญ์จะไม่หมดพลังไอน้ำเพราะขนาดของทุกสิ่งที่มันต้องจัดการด้วยหรือไม่ หรือบางทีฉันอาจต้องกำจัดผลข้างเคียง (เครื่องมือพิสูจน์พวกนั้นดูเหมือนจะทำได้ดีกับภาษาที่ประกาศ) และฉันสงสัยว่ามันจะส่งผลให้ "รหัสที่พิสูจน์แล้ว" ซึ่งไม่สามารถใช้ได้เพราะมันจะไม่เร็วหรือ เล็กพอ นอกจากนี้ฉันไม่มีความหรูหราในการเปลี่ยนภาษาที่ฉันทำงานด้วยมันต้องเป็น Java หรือ C ++: ฉันไม่สามารถบอกเจ้านายของฉันได้ว่าฉันจะใช้รหัสใน OXXXml นับจากนี้ไปเพราะเป็นภาษาเดียวใน ซึ่งฉันสามารถพิสูจน์ความถูกต้องของรหัส ... ใครบางคนที่มีประสบการณ์มากขึ้นเกี่ยวกับเครื่องมือพิสูจน์ความคิดเห็นอย่างเป็นทางการ? อีกครั้ง - ฉันจะรักในการใช้เครื่องมือสอบมาตรอย่างเป็นทางการผมคิดว่าพวกเขาจะดี แต่ผมมีความประทับใจที่พวกเขาอยู่ในหอคอยงาช้างที่ฉันไม่สามารถเข้าถึงได้จากคูต่ำต้อยของ Java / C ++ ... (PS: …

6
อัลกอริทึมในการแก้ปัญหา“ การหยุดชะงัก” ของทัวริง
คำถามนี้ถูกย้ายจาก Theoretical Computer Science Exchange Exchange เนื่องจากสามารถตอบได้ใน Computer Science Stack Exchange อพยพ 7 ปีที่ผ่านมา "Alan Turing พิสูจน์แล้วในปี 1936 ว่าอัลกอริทึมทั่วไปเพื่อแก้ปัญหาการหยุดชะงักสำหรับคู่อินพุตโปรแกรมที่เป็นไปได้ทั้งหมดไม่มีอยู่" ฉันสามารถหาอัลกอริทึมทั่วไปเพื่อแก้ปัญหาการหยุดพักสำหรับบางคู่ที่เป็นไปได้ของโปรแกรมหรือไม่ ฉันสามารถหาภาษาโปรแกรม (หรือภาษา) ที่ฉันใช้กับโปรแกรมทุกประเภทในภาษานี้ได้หรือไม่มันสามารถตัดสินใจได้ว่าโปรแกรมจะหยุดทำงานหรือรันตลอดไปหรือไม่?

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

2
โปรแกรมความถูกต้องสเปค
จากวิกิพีเดีย: ในทางวิทยาการคอมพิวเตอร์เชิงทฤษฎีความถูกต้องของอัลกอริทึมถูกยืนยันเมื่อมีการกล่าวว่าอัลกอริทึมนั้นถูกต้องตามข้อกำหนด แต่ปัญหาคือการได้สเปค "ที่เหมาะสม" ไม่ใช่งานที่ไม่สำคัญและไม่มีวิธีการที่ถูกต้อง 100% (เท่าที่ฉันรู้) เพื่อให้ได้สิ่งที่ถูกต้องมันเป็นเพียงการประมาณดังนั้นถ้าเราจะ ใช้เพรดิเคตเป็นสเปคเพียงเพราะมัน "ดูเหมือน" เหมือน "หนึ่ง" ทำไมไม่ลองใช้โปรแกรมให้ถูกต้องเพียงเพราะมัน "ดู" ถูกต้อง?

1
ทำไมเราไม่ค้นคว้าเพิ่มเติมเกี่ยวกับการรับประกันเวลารวบรวม?
ฉันรักทุกสิ่งที่รวบรวมเวลาและฉันชอบความคิดที่ว่าเมื่อคุณรวบรวมโปรแกรมการรับประกันจำนวนมากเกี่ยวกับการดำเนินการของมัน โดยทั่วไปการพูดระบบประเภทคงที่ (Haskell, C ++, ... ) ดูเหมือนจะให้การรับประกันเวลาคอมไพล์ที่แข็งแกร่งกว่าระบบประเภทแบบไดนามิกใด ๆ จากสิ่งที่ฉันเข้าใจ Ada ดำเนินการตรวจสอบเวลาให้ดียิ่งขึ้นไปอีกและสามารถตรวจจับช่วงของข้อผิดพลาดที่มากกว่าก่อนดำเนินการ มันยังถือว่าปลอดภัยพอสมควร ณ เวลาใดเวลาหนึ่งมันถูกเลือกสำหรับฟิลด์ที่ละเอียดอ่อน (เมื่อข้อผิดพลาดในการเขียนโปรแกรมอาจทำให้เสียชีวิต) ตอนนี้ฉันสงสัยว่า: ถ้าการค้ำประกันแบบคงที่ที่ดีกว่านำไปสู่รหัสที่มีเอกสารและปลอดภัยกว่าแล้วทำไมเราไม่ค้นคว้าเพิ่มเติมในทิศทางนั้น ตัวอย่างของสิ่งที่ดูเหมือนว่าจะหายไปจะเป็นภาษาที่แทนที่จะกำหนดintประเภททั่วไปที่มีช่วงที่กำหนดโดยจำนวนบิตของสถาปัตยกรรมพื้นฐานหนึ่งอาจมีช่วง (ในตัวอย่างต่อไปนี้Int [a..b]อธิบายถึงชนิดจำนวนเต็มระหว่าง รวม a และ b): a : Int [1..24] b : Int [1..12] a + b : Int [2..36] a - b : Int [-11..23] b - a : Int …

2
วิธีจัดการกับอาร์เรย์ในระหว่างการพิสูจน์ความถูกต้องของ Hoare-style
ในการอภิปรายคำถามนี้ Gilles กล่าวอย่างถูกต้องว่าการพิสูจน์ความถูกต้องใด ๆ ของอัลกอริทึมที่ใช้อาร์เรย์ต้องพิสูจน์ว่าไม่มีการเข้าถึงอาร์เรย์นอกขอบเขต ขึ้นอยู่กับรุ่นรันไทม์สิ่งนี้จะทำให้เกิดข้อผิดพลาดรันไทม์หรือการเข้าถึงองค์ประกอบที่ไม่ใช่อาร์เรย์ เทคนิคหนึ่งที่พบบ่อยในการดำเนินการพิสูจน์ความถูกต้องเช่น (อย่างน้อยในการศึกษาปริญญาตรีและอาจจะอยู่ในการตรวจสอบโดยอัตโนมัติ) โดยใช้ตรรกะโฮร์ ฉันไม่ทราบว่าชุดกฎมาตรฐานมีอะไรที่เกี่ยวข้องกับอาร์เรย์ ดูเหมือนว่าพวกเขาจะถูก จำกัด ให้ตัวแปรตัวแปร ฉันจินตนาการถึงการเพิ่มสัจพจน์ของแบบฟอร์ม {0≤i<A.length∧P[A[i]/E]} A[i]:=E; {P}{0≤i<A.length∧P[A[i]/E]} A[i]:=E; {P}\qquad \displaystyle \frac{}{\{0 \leq i \lt A.\mathrm{length} \land {P[A[i]/E]} \}\ A[i] := E;\ \{P\}} แต่ก็ไม่เป็นที่ชัดเจนกับผมว่าคุณจะจัดการกับการเข้าถึงอาร์เรย์บนด้านขวามือคือถ้ามันเป็นส่วนหนึ่งของการแสดงออกที่ซับซ้อนในบางคำสั่งx : = EEEEx:=Ex:=Ex := E วิธีการเข้าถึงอาร์เรย์สามารถสร้างแบบจำลองในตรรกะของ Hoare เพื่อให้ไม่มีการเข้าถึงที่ไม่ถูกต้องสามารถและต้องได้รับการพิสูจน์ความถูกต้องของโปรแกรม? รู้รอบอาจสันนิษฐานได้ว่าเราไม่อนุญาตให้ใช้องค์ประกอบของอาร์เรย์ในงบนอกเหนือจากหรือเป็นส่วนหนึ่งของEบางตัวในx : = Eเนื่องจากไม่ได้ จำกัด การแสดงออก เราสามารถกำหนดตัวแปรชั่วคราวตามค่าที่ต้องการเช่น write t …

4
เทคนิคทางการทั่วไปสำหรับการพิสูจน์รหัสฟังก์ชั่นที่ถูกต้องคืออะไร?
ฉันต้องการแสดงหลักฐานสำหรับส่วนของโปรแกรม Haskell ที่ฉันเขียนเป็นส่วนหนึ่งของวิทยานิพนธ์ของฉัน ถึงตอนนี้ฉันไม่สามารถหางานอ้างอิงที่ดีได้ การเขียนโปรแกรมเบื้องต้นเกี่ยวกับหนังสือของ Graham Hutton ใน Haskell ( Google Books ) - ซึ่งฉันอ่านขณะเรียนรู้ Haskell— สัมผัสกับเทคนิคสองสามประการสำหรับการให้เหตุผลเกี่ยวกับโปรแกรมเช่น การใช้เหตุผลเชิงสมการ ใช้รูปแบบที่ไม่ทับซ้อนกัน รายการเหนี่ยวนำ ในบทที่ 13 แต่มันไม่เชิงลึกมาก มีหนังสือหรือบทความใดบ้างที่คุณสามารถแนะนำซึ่งให้ภาพรวมรายละเอียดเพิ่มเติมของเทคนิคการพิสูจน์อย่างเป็นทางการสำหรับ Haskell หรือรหัสการทำงานอื่น ๆ

6
เทคนิคการตรวจสอบโปรแกรมสามารถป้องกันข้อบกพร่องของประเภทของ Heartbleed ไม่ให้เกิดขึ้นได้หรือไม่?
ในเรื่องของ Heartbleed bug บรูซชไนเออร์เขียน Crypto-Gram เมื่อวันที่ 15 เมษายนว่า '' ภัยพิบัติ 'เป็นคำที่ถูกต้อง ในระดับ 1 ถึง 10 นี่คือ 11 ' ฉันอ่านเมื่อหลายปีก่อนว่าเคอร์เนลของระบบปฏิบัติการบางระบบได้รับการตรวจสอบอย่างเข้มงวดด้วยระบบตรวจสอบโปรแกรมที่ทันสมัย ด้วยเหตุนี้จึงสามารถป้องกันไม่ให้เกิดข้อผิดพลาดในประเภทของ Heartbleed ผ่านการประยุกต์ใช้เทคนิคการตรวจสอบโปรแกรมในวันนี้หรือไม่จริงหรือแม้กระทั่งเป็นไปไม่ได้

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