Bài giảng Kỹ thuật lập trình: Chương 4 - TS. Vũ Hương Giang

128 87 0
Bài giảng Kỹ thuật lập trình: Chương 4 - TS. Vũ Hương Giang

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài giảng Các kỹ thuật kiểm tra tính đúng đắn và tính an toàn của chương trình phần mềm bao gồm các nội dung: Bẫy lỗi (error handling), lập trình phòng ngừa (defensive programming), kiểm thử (Testing), gỡ rối (Debugging). Mời các bạn cùng tham khảo nội dung chi tiết.

• Với toán, làm để: – Thiết kế giải thuật nhằm giải tốn – Cài đặt giải thuật chương trình máy tính - Hãy làm cho chương trình chạy trước tăng tính hiệu chương trình - Hãy tăng tính hiệu chương trình đồng thời thể tốt phong cách lập trình cá nhân CuuDuongThanCong.com https://fb.com/tailieudientucntt CHƯƠNG IV CÁC KỸ THUẬT KIỂM TRA TÍNH ĐÚNG ĐẮN VÀ TÍNH AN TỒN CỦA CHƯƠNG TRÌNH PHẦN MỀM I II III IV Bẫy lỗi (error handling) Lập trình phịng ngừa (defensive programming) Kiểm thử (Testing) Gỡ rối (Debugging) CuuDuongThanCong.com https://fb.com/tailieudientucntt Mở đầu • Lỗi: chương trình chạy khơng định • Chuỗi kiểm tra chương trình – – – – Bẫy lỗi (error handling) Lập trình phịng ngừa (defensive programming) Kiểm thử (testing) Gỡ rối (debugging) • Phân biệt: – Bẫy lỗi: Prevent errors – Lập trình phịng ngừa: Detect problems as early as possible – Kiểm thử: finished code – Gỡ rối: fixing defects uncovered by testing CuuDuongThanCong.com https://fb.com/tailieudientucntt I BẪY LỖI CuuDuongThanCong.com https://fb.com/tailieudientucntt Nguyên tắc • Khi lỗi xảy cần – Định vị nguồn gây lỗi – Kiểm sốt lỗi • Ln có ý thức đề phịng lỗi hay xảy chương trình, đọc file, liệu người dùng nhập vào cấp phát nhớ • Áp dụng biện pháp phòng ngừa điều dẫn tới việc dừng chương trình • In lỗi stderr stream fprintf (stderr,"There is an error!\n"); CuuDuongThanCong.com https://fb.com/tailieudientucntt Kiểm tra để phát lỗi ? • Kiểm tra thao tác gây lỗi viết CT – Nhập liệu – Sử dụng liệu • Ví dụ: – Kiểm tra lần mở tệp tin hay cấp phát ô nhớ – Kiểm tra phương thức người dùng nhập liệu vào không cịn nguy gây dừng chương trình – Trong trường hợp tràn nhớ (out of memory), nên in lỗi kết thúc chương trình (-1: error exit); – Trong trường hợp liệu người dùng đưa vào bị lỗi, tạo hội cho người dùng nhập lại liệu (lỗi tên file người dùng nhập sai) CuuDuongThanCong.com https://fb.com/tailieudientucntt Làm phát lỗi ? • Cần có cách xử lý lỗi mà ta chờ đợi xảy • Tùy theo tình cụ thể, ta – – – – – – – – – Trả giá trị trung lập Thay đoạn liệu hợp lệ Trả giá trị lần trước Thay giá trị hợp lệ gần Ghi vết cảnh báo vào tệp Trả mã lỗi Gọi thủ tục hay đối tượng xử lý Hiện thông báo lỗi Tắt máy CuuDuongThanCong.com https://fb.com/tailieudientucntt Một số lỗi nhập liệu phổ biến • Dữ liệu nhập vào lớn (ví dụ, vượt kích thước kích thước lưu trữ cho phép mảng hay biến) • Dữ liệu nhập vào sai kiểu, giá trị nhỏ giá trị âm • Lỗi chia cho số (divide by zero) CuuDuongThanCong.com https://fb.com/tailieudientucntt Dùng hàm bao gói (Wrappered function) • Hàm bao gói = gọi hàm gốc + bẫy lỗi • Tại thời điểm cần kiểm tra lỗi hàm gốc, dùng hàm bao gói thay dùng hàm gốc • Ví dụ: • Nếu phải viết đoạn mã kiểm tra lỗi lần sử dụng malloc nhàm chán – Kiểm tra – Thơng báo lỗi kiểu “out of memory” – Thốt • Tự viết hàm safe_malloc sử dụng hàm thay dùng malloc có sẵn – – – – Malloc Kiểm tra Thông báo lỗi kiểu “out of memory” Thoát CuuDuongThanCong.com https://fb.com/tailieudientucntt safe_malloc #include #include void *safe_malloc (size_t); /* Bẫy lỗi dùng hàm malloc */ void *safe_malloc (size_t size) /* Cấp phát nhớ báo lỗi thoát */ { void *ptr; ptr= malloc(size); if (ptr == NULL) { fprintf (stderr, “Không đủ nhớ để thực dòng lệnh :%d file :%s\n", LINE , FILE ); exit(-1); } return ptr; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Assertions • Assertions dùng để kiểm tra giả thiết : – Các tham số đầu vào nằm phạm vi mong đợi (tương tự với tham số đầu ra) – File hay stream mở (hay đóng) CTC bắt đầu thực (hay kết thúc) – file hay stream ghi (hay cuối cùng) CTC bắt đầu ( hay kết thúc) thực – file hay stream mở để đọc, để ghi, hay đọc ghi – Giá trị tham số đầu vào không thay đổi CTC – pointer non-NULL – mảng đc truyền vào CTC chứa X phần tử – bảng đc khởi tạo để chứa giá trị thực – danh sách rỗng (hay đầy) lkhi CTC bắt đầu (hay kết thúc) thực CuuDuongThanCong.com https://fb.com/tailieudientucntt Assertions • • • • • End users không cần thấy thông báo assertion ; Assertions chủ yếu đc dùng trình phát triển hay bảo dưỡng ứng dụng Dịch thành code phát triển, loại bỏ khỏi code sản phẩm để nâng cao hiệu chương trình Rất nhiều NNLT hỗ trợ assertions : C++, Java Visual Basic Kể NNLT khơng hỗ trợ, dễ dàng xây dựng CuuDuongThanCong.com VD: #define ASSERT(condition, message) { if ( !(condition) ) { fprintf( stderr, "Assertion %s failed: %s\n", condition, message); exit( EXIT_FAILURE ); } } https://fb.com/tailieudientucntt Dùng assertions ? • Bẫy lỗi cho tình lường trước (sự kiện ta chờ đợi xảy ra); – Error-handling : checks for bad input data  Hướng tới việc xử lý lỗi • Dùng assertions cho tình khơng lường trước (sự kiện khơng mong đợi xảy không xảy ra) – Assertions : check for bugs in the code  hướng đến việc hiệu chỉnh chương trình, tạo phiên chương trình • Tránh đưa code xử lý vào assertions – Điều xảy ta turn off the assertions ? CuuDuongThanCong.com https://fb.com/tailieudientucntt Dùng assertions ? • Các chương trình lớn: – trước tiên xác nhận lỗi (dùng assertion), – sau bẫy lỗi (dùng error-handling) • Nguyên nhân gây lỗi xác định: – dùng assertion, dùng error-handling, – khơng dùng lúc • Các chương trình cực lớn, nhiều người phát triển thời gian 5-10 năm, ? – Cả assertions error handling code đc dùng cho lỗi – Ví dụ source code cho Microsoft Word, điều kiện ln trả true đc dùng assertion, đồng thời đc xử lý – Assertions có lợi giúp loại bỏ nhiều lỗi trình phát triển hệ thống CuuDuongThanCong.com https://fb.com/tailieudientucntt Kiểm tra giá trị khơng thay đổi • Có thể sử dụng assert để kiểm tra giá trị không thay đổi #ifndef NDEBUG int isValid(MyType object) { … Test invariants here Return (TRUE) if object passes all tests, and (FALSE) otherwise … } #endif void myFunction(MyType object) { assert(isValid(object)); … Manipulate object here … assert(isValid(object)); } CuuDuongThanCong.com https://fb.com/tailieudientucntt 2.6 Hiện thị kết đầu • In giá trị biến điểm có khả gây lỗi để định vị khu vực gây lỗi, • Xác định tiến trình thực : “đến 1” • Poor: printf("%d", keyvariable); • Maybe better: stdout is buffered; CT có lỗi trước output In '\n' xóa nhớ đệm stdout , khơng xóa in file printf("%d\n", keyvariable); • Better: printf("%d", keyvariable); fflush(stdout); CuuDuongThanCong.com Gọi fflush() để làm buffer cách tường minh https://fb.com/tailieudientucntt Hiện thị kết đầu • Tạo log file • Lưu vết – Giúp ghi nhớ đc vấn đề xảy ra, giải vđề tương tự sau này, chuyển giao CT cho người khác • Maybe even better: fprintf(stderr, "%d", keyvariable); • Maybe better still: FILE *fp = fopen("logfile", "w"); … fprintf(fp, "%d", keyvariable); fflush(fp); CuuDuongThanCong.com In debugging output stderr; debugging output tách biệt với đầu thơng thường cách in ấn CT Ngồi ra: stderr khơng dùng buffer Ghi a log file https://fb.com/tailieudientucntt 2.7 Sử dụng trình gỡ rối (debugger) • • • • • • • IDE : kết hợp soạn thảo, biên dịch, gỡ rối … Các trình gỡ rối với giao diện đồ họa cho phép chạy chương trình bước qua lệnh hàm, dừng dòng lệnh đặc biệt hay xuất đk đặc biệt, bên canh có cơng cụ cho phép định dạng hiển thị giá trị biến, biểu thức Trình gỡ rối kích hoạt trực tiếp có lỗi gắn vào chương trình chạy Thường để tìm lỗi , ta phải xem xét thứ tự hàm đc kích hoạt ( theo vết) hiển thị giá trị biến liên quan Nếu không phát đc lỗi : dùng BreakPoint hoạc chạy bước – step by step Có nhiều cơng cụ gỡ rối mạnh hiệu quả, ta nhiều thời gian trí lực để gỡ rối ? Nhiều công cụ khơng thể giúp dễ dàng tìm lỗi, đưa câu hỏi sai, trình gỡ rối cho câu trả lời, ta khơng biết bị sai CuuDuongThanCong.com https://fb.com/tailieudientucntt Sử dụng trình gỡ rối • • ( • • • Dùng trình gỡ rối để chạy bước phương sách cuối Nhiều vấn đề tưởng đơn giản lại khơng phát được, ví dụ tốn tử so sánh pascal va VB có độ ưu tiên ngang nhau, với C ? == != nhỏ !) Thứ tự đối số lời gọi hàm : ví dụ : strcpy(s1,s2) int m[6]={1,2,3,4,5,6}, *p,*q; p=m; q=p+2; *p++ =*q++; *p=*q; ??? Lỗi loại khó tìm thân ý nghĩ ta vạch hướng suy nghĩ sai lệch : coi điều không Đôi lỗi nguyên nhân khách quan : Trình biên dịch, thư viện hay hệ điều hành, lỗi phần cứng : 1994 lỗi xử lý dấu chấm độngng xử lý Pentium CuuDuongThanCong.com https://fb.com/tailieudientucntt Công cụ hỗ trợ gỡ rối GDB: The GNU Project Debugger • Gỡ rối chương trình viết Ada, C, C++, Objective-C, Pascal, v.v., chạy máy cài đặt GDB hay máy khác • Hoạt động UNIX Microsoft Windows • Các chức hỗ trợ: – Bắt đầu chương trình, xác định yếu tố làm ảnh hưởng đến hoạt động chương trình – Dừng chương trình với điều kiện biết trước – Khi chương trình bị dừng, kiểm tra xảy – Thay đổi lệnh chương trình để LTV thử nghiệm gỡ rối lỗi CuuDuongThanCong.com https://fb.com/tailieudientucntt 2.8 Tập trung vào lệnh viết / viết lại • Kiểm tra thay đổi – Lỗi thường xảy đoạn CT bổ sung – Nếu phiên cũ OK, phiên có lỗi => lỗi chắn nằm đoạn CT – Lưu ý, sửa đổi, nâng cấp : giữ lại phiên cũ – đơn giản comment lại đoạn mã cũ – Đặc biệt, với hệ thống lớn, làm việc nhóm việc sử dụng hệ thống quản lý phiên mã nguồn chế lưu lại q trình sửa đổi vơ hữu ích ( source safe ) CuuDuongThanCong.com https://fb.com/tailieudientucntt Tập trung vào lệnh viết / viết lại • Các lỗi xuất thất thường : – Khó giải – Thường gán cho lỗi máy tính, hệ điều hành … – Thực thông tin CT : khơng phải thuật tốn, mà thông tin bị thay đổi qua lần chạy – Các biến đc khởi tạo hết chưa ? – Lỗi cấp phát nhớ ? Vd : char *vd( char *s) { char m[101]; strncpy(m,s,100) return m; } – Giải phóng nhớ động ? – for (p=listp; p!=NULL; p=p->next) free(p) ; ??? CuuDuongThanCong.com https://fb.com/tailieudientucntt Tập trung vào lệnh viết / viết lại • Phải gỡ rối ngay, khơng nên để sau – Khó: Viết tồn chương trình; kiểm tra tồn chương trình, gỡ rối tồn chương trình – Dễ hơn: Viết đoạn, kiểm tra đoạn, gỡ rối đoạn; viết đoạn, kiểm tra đoạn, gỡ rối đoạn; • Nên giữ lại phiên trước – Khó: Thay đổi mã nguồn, đánh dấu lỗi; cố gắng nhớ xem thay đổi từ lần làm việc trước – Dễ hơn: Backup mã nguồn, thay đổi mã nguồn, đánh dấu lỗi; so sánh phiên với phiên cũ để xác định điểm thay đổi CuuDuongThanCong.com https://fb.com/tailieudientucntt Giữ lại phiên trước • Cách 1: Sao chép tay vào thư mục … $ mkdir myproject $ cd myproject Create project files here $ cd $ cp –r myproject myprojectDateTime $ cd myproject Continue creating project files here … • Lặp lại lần có phiên • Cách 2: dùng công cụ RCS (Revision Control System), CVS, v.v CuuDuongThanCong.com https://fb.com/tailieudientucntt Tóm lại • Gỡ rối nghệ thuật mà ta phải luyện tập thường xuyên • Nhưng nghệ thuật mà ta khơng muốn • Mã nguồn viết tốt có lỗi dễ tìm • Đầu tiên phải nghĩ đến nguồn gốc sinh lỗi • Hãy suy nghĩ kỹ càng, có hệ thống để định vị khu vực gây lỗi • Khơng học từ lỗi – điều LTV CuuDuongThanCong.com https://fb.com/tailieudientucntt ... phần chương trình: phần chương trình dùng để làm – Viết kiểm thử mối liên kết phần chương trình: quy trình nghiệp vụ – Phịng ngừa điều kiện trước sau gọi phần chương trình: điều phải trước gọi chương. .. rối chương trình cẩn thận : hồn thành chương trình trước ngày so với hạn nộp • Thiết kế chương trình: – Thiết kế giải thuật trước viết ngôn ngữ lập trình cụ thể • Giữ vững cấu trúc chương trình:. .. viết chương trình • LTV giỏi khơng ngồi viết lúc 10000 dịng lệnh chạy thử chương trình • Mọi việc dễ dàng vừa viết chương trình vừa kiểm tra • Xác định cấu trúc chương trình, viết phần nhỏ chương

Ngày đăng: 11/01/2020, 20:27

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan