1. Trang chủ
  2. » Giáo Dục - Đào Tạo

KỸ THUẬT lập TRÌNH CHƯƠNG 5 defensive programming

42 297 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 42
Dung lượng 255 KB

Nội dung

CHƯƠNG 5- Defensive Programming Khai niem : DEFENSIVE PROGRAMMING • Xuất phát từ khái niệm defensive driving • Khi lái xe bạn phải tâm niệm bạn người lái xe khác làm Bằng cách đó, bạn chắn họ làm điều nguy hiểm, bạn khơng bị ảnh hưởng ( tai nạn) • Bạn có trách nhiệm bảo vệ thân, người khác có lỗi • Trong defensive programming, ý tưởng chương trình ( con) truyền liệu tồi, khơng sao, kể với CT khác bị fault • Một cách tổng qt, lập trình phịng thủ nghĩa : làm để tự bảo vệ khỏi giới lạnh lùng,tàn nhẫn liệu không hợp lệ, kiện mà "khơng bao giờ" xảy ra, lập trình viên khác ‘sai lầm’ Bảo vệ CT khỏi Invalid Inputs • Trong thực tiễn :“Garbage in, garbage out.” • Trong lập trình “rác rưởi vào – rác rưởi ra” điều khơng chấp nhận • Một CT tốt không sãn xuất rác rưởi, đầu v ! • Với CT tốt :”rác rưởi vào, khơng có ra”, “rác rưởi vào, có thơng báo lỗi” “khơng cho phép rác rưởi vào” • Theo tiêu chuẩn ngày nay, “garbage in, garbage out” dấu hiệu CT tồi, khơng an tồn cách để xử lý rác vào • Kiểm tra giá trị liệu từ nguồn bên – Khi nhận liệu từ file, bàn phím, mạng, từ nguồn ngồi khác, kiểm tra đê đảm bảo liệu nằm giới hạn cho phép – Hãy đảm bảo giá trị số nằm dung sai xâu phải đủ ngẵn để xử lý , Nếu chuỗi dự định để đại diện cho phạm vi giới hạn giá trị (như ID giao dịch tài tương tự), chắn chuỗi hợp lệ cho mục đích nó; khơng từ chối – Nếu bạn làm việc ứng dụng bảo mật, đực biệt lưu ý đến liệu công hệ thống : Cố làm tràn nhớ , injected SQL commands, injected html hay XML code, tràn số … cách để xử lý rác vào • Check the values of all routine input parameters – Kiểm tra giá trị tất tham số truyền vào hàm cần kiểm tra liệu nhập từ nguồn ngồi khác • Decide how to handle bad inputs – Khi phát tham số hay liệu khơng hợp lệ, bạn cần làm với nó? Tùy thuộc tình huống, bạn chọn phương án mô tả chi tiết phần sau Assertions • macro hay CT dùng trình phát triển ứng dụng , cho phép CT tự kiểm tra chạy • Return true >> OK, false >> có lỗi CT • VD : Nếu hệ thống cho file liệu khách hàng không vượt 50 000 ghi, CT chứa assertion số ghi performance Rất nhiều NNLT hỗ trợ assertions : C++, Java Visual Basic Kể NNLT khơng hỗ trợ, dễ ràng xd VD: #define ASSERT( condition, message ) { if ( !(condition) ) { fprintf( stderr, "Assertion %s failed: %s\n", condition,message ); exit( EXIT_FAILURE ); } } Guidelines for Using Assertions • Sử dụng code xử lý lỗi với điều kiện ta chờ đợi xảy ra; Dùng assertions cho ĐK không mong đợi ( không xảy ra) – Error-handling : checks for bad input data – Assertions : check for bugs in the code – Error handling hướng tới việc xử lý lỗi, cịn assertion hướng đến việc hiệu chỉnh chương trình , tạo new version of software • Tránh đưa code xử lý vào assertions – Điều xảy ta turn off the assertions ? Các phương pháp gỡ rối • Kiểm tra thay đổi – Lỗi thường xảy đoạn CT đc bổ xung – 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 trình sửa đổi vơ hữu ích ( source safe ) Các phương pháp gỡ rối • Tránh mắc lỗi lần : Sau sửa lỗi, suy nghĩ xem có lỗi tương tự nơi khác khơng VD : for (i=1;i outname= &agrv[i][2]; Tương tự ? Chú ý : đơn giản viết code ngủ đừng ngủ gật viết code Các phương pháp gỡ rối • Gỡ rối gặp – Khi phát lỗi, sửa ngay, đừng để sau sửa, lỗi khơng xuất lại ( tình huống) – Cũng đừng vội vàng, không suy nghĩ chín chắn, kỹ càng, việc sửa chữa ảnh hưởng tới tình khác Các phương pháp gỡ rối • Đọc trước gõ vào – Đừng vội vàng, khơng rõ điều thực gây lỗi sửa khơng chỗ có nguy gây lỗi khác – Có thể viết đoạn code gây lỗi giấy=> tạo cách nhìn khác, tạo hội để nghĩ suy – Đừng miên man chép đoạn khơng có nguy gây lỗi, in toàn code giấy in => phá vỡ cấu trúc Các phương pháp gỡ rối • Giải thích cho người khác đoạn code – Tạo đk để ngẫm nghĩ – Thậm chí giải thích cho người khơng phải LTV – Extrem programming : làm việc theo cặp, pair programming, người LT, người kiểm tra, ngược lại – Khi gặp vấn đề, khó khăn, chậm tiến độ, thay đổi cơng việc => rút khỏi luồng qn tính sai lâm … Các phương pháp gỡ rối • Làm cho lỗi xuất lại – Cố gắng làm cho lỗi xuất lại cần – Nếu khơng đc, thử tìm ngun nhân lại khơng đc • Chia để trị – Thu hẹp phạm vi – Tập trung vào liệu gây lỗi Các phương pháp gỡ rối • Hiển thị kết để định vị khu vực gây lỗi – Thêm vào dòng lệnh in giá trị biến liên quan, đơn giản xác định tiến trình thực : “đến 1” … • Viết mã tự kiểm tra – Viết thêm hàm để kiểm tra, gắn vào trước sau đoạn có nguy cơ, comment lại sau xử lý lỗi • 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 Hiển thị KQ In giá trị điểm nhạy cảm – Poor: printf("%d", keyvariable); – Maybe better: printf("%d\n", – Better: keyvariable); printf("%d", keyvariable); fflush(stdout); stdout is buffered; CT có lỗi trước output In '\n' xóa nhớ đệm stdout , khơng xóa in file Gọi fflush() để làm buffer cách tường minh Hiển thị KQ (cont.) – Maybe even better: fprintf(stderr, "%d", keyvariable); – Maybe better still: In debugging output stderr; debugging output tách biệt với in ân CT Ngoài ra: stderr không dùng buffer FILE *fp = fopen("logfile", "w"); … fprintf(fp, "%d", keyvariable); fflush(fp); Ghi a log file Các phương pháp gỡ rối • Phương sách cuối – Dùng trình gỡ rối để chạy bước – 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 động xử lý Pentium • 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) ; ??? Tóm lại • Gỡ rối nghệ thuật mà ta phải luyện tập thường xun • 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 Thêm – Những lỗi thường gặp với C, C++ Array as a parameter handled improperly – Tham số mảng đc xử lý không cách Array index out of bounds – Vượt phạm vi số mảng Call-by-value used instead of call-by reference for function parameters to be modified – Gọi theo giá trị, thay gọi theo tham chiếu cho hàm để sửa Comparison operators misused – Các toán tử so sánh bị dùng sai Compound statement not used - Lệnh phức hợp không đc dùng Dangling else - nhánh else khong hợp lệ Division by zero attempted - Chia cho Division using integers so quotient gets truncated – Dùng phép chia số nguyên nên phần thập phân bị cắt Files not closed properly (buffer not flushed) - File khơng đc đóng phù hợp ( buffer khơng bị dẹp) 10 Infinite loop - lặp vô hạn 11 Global variables used – dùng biến tổng thể 12 IF-ELSE not used properly – dùng if-else không chuân 13 Left side of assignment not an L-value - phía trái phép gán biến 14 Loop has no body – vịng lặp khơng có thân 15 Missing "&" or missing "const" with a call-by-reference function parameter – thiếu dấu & hay từ khóa const với lời gọi tham số hàm theo tham chiếu 16 Missing bracket for body of function or compound statement – Thiếu cặp {} cho thân hàm hay nhóm lệnh 17 Mission reference to namespace - Thiếu tham chiếu tới tên miền 18 Missing return statement in a value-returning function – Thiếu return 19 Missing semi-colon in simple statement, function prototypes, struct definitions or class definitions – thiếu dấu ; lệnh đơn … 20 Mismatched data types in expressions – kiểu liệu không hợp 21 Operator precedence misunderstood - Hiểu sai thứ tự phép toán 22 Off-by-one error in a loop – Thoát khỏi lỗi vòng lặp 23 Overused (overloaded) local variable names - Trùng tên biến cục 24 Pointers not set properly or overwritten in error – Con trỏ không đc xác định trỏ vào vị trí khơng có 25 Return with value attempted in void function – trả giá trị hàm void 26 Undeclared variable name – không khai báo biến 27 Un-initialized variables – Không khởi tạo giá trị 28 Unmatched parentheses – thiếu } 29 Un-terminated strings - xâu không kết thúc , thiếu “ 30 Using "=" when "= =" is intended or vice versa 31 Using "&" when "&&" is intended or vice versa 32 "while" used improperly instead of "if“ – while đc dùng thay if ... thân, người khác có lỗi • Trong defensive programming, ý tưởng chương trình ( con) truyền liệu tồi, khơng sao, kể với CT khác bị fault • Một cách tổng qt, lập trình phịng thủ nghĩa : làm để tự... chúng Nhiều kỹ thuật làm giảm số lượng thành phần tương tác : – Che giấu thông tin – Trừu tượng hóa … • Có kỹ thuật nhàm đảm bảo tính tồn vẹn thiết kế phần mềm – – – – • Documentation Lập mơ hình... loại bỏ nhiều lỗi trình PT HT Kỹ thuật xử lý lỗi Error Handling Techniques • Error handling dùng để 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

Ngày đăng: 11/11/2015, 17:01

TỪ KHÓA LIÊN QUAN

w