Giới Thiệu Assert() – Công Cụ Gỡ Lỗi Hữu ích | Share Your Knowledge!

Bạn đã từng nghe nói đến hoặc đã từng sử dụng hàm assert() trong lập trình C chưa? Mình tin chắc ở đây, không nhiều người đã từng sử dụng hàm tiện ích này. Trong bài viết này, mình sẽ giới thiệu đến các bạn công dụng của nó. Hàm assert() được định nghĩa trong thư viện assert.h. Có thể nói nó là 1 công cụ giúp chúng ta gỡ rối rất hữu ích. Dạng thức của nó như sau: assert(expression); Những gì hàm này thực hiện, phụ thuộc vào một điều kiện là trong chương trình của bạn có định nghĩa NDEBUG hay không (bạn có thể định nghĩa NDEBUG bằng nhiều cách khác nhau, như là sử dụng command line nếu như compiler của bạn cho phép làm việc đó, hoặc là bạn tự định nghĩa nó trong chương trình bằng cách thêm một dòng sau : #define NDEBUG) Nếu trong chương trình của bạn NDEBUG không được định nghĩa thì khi gặp assert(), biểu thức bên trong assert() (tức là expression) sẽ được thực hiện. Nếu kết quả của biểu thức là true, chương trình tiếp tục thực hiện các câu lệnh tiếp theo assert(). Nếu biểu thức có kết quả false, chương trình của bạn sẽ dừng lại tại điểm đó, và thông thường bạn sẽ nhận được thông báo về điều đó. Nếu trong chương trình của bạn NDEBUG đã được định nghĩa trước khi chương trình thực hiện tới dòng lệnh có chứa assert() thì hàm này không làm gì cả (expression sẽ không được thực hiện, và bản thân hàm sẽ được thay thế bằng Null Statement, tức là nó không có ảnh hưởng gì tới chương trình). Sử dụng đặc điểm này của assert(), chúng ta có thể viết một chương trình ít lỗi hơn. Bí quyết là chúng ta nên thường xuyên dùng nó để kiểm tra các tham số của hàm, kết quả hàm trả lại, v.v…Để rõ hơn, mình xin đưa ra một vài ví dụ minh hoa. Giả sử bạn phải viết một chương trình nén dữ liệu, đâu đó trong chương trình của ban sẽ có một hàm giống như sau: void Compress (const char pszSrcFileName, const char *pszDestFileName) { / code goes here / } Bạn biết rằng để hàm này thực hiện được thì 2 tham số của hàm phải là 2 con trỏ hợp lệ, vì vậy bạn có thể dùng assert() để phát hiện ra trường hợp bạn truyền Null Pointer cho hàm như sau: void Compress (const char *pszSrcFileName, const char *pszDestFileName) {           assert(pszSrcFileName && pszDestFileName);          /hoặc có thể viết như sau:           assert(pszSrcFileName);          assert(pszDestFileName);          /          / code goes here / } Bây giờ, nếu như bạn có vô tình gọi hàm Compress() với Null Pointer thì bạn sẽ phát hiện ra ngay. Mặc dù assert() hay đựơc dùng để kiểm tra Null Pointer, bạn cũng có thể dùng nó để kiểm tra các kiểu dữ liệu khác nhau. Ví dụ: char *AllocBuffer(int nSize) {         assert(nSize > 0 && nSize < MAX_SIZE);        / code goes here / } Ở đây, chúng ta đã dùng assert() để đảm bảo là mỗi khi hàm AllocBuffer() được gọi, nó luôn luôn nhận được một giá trị nSize hợp lệ. Ngoài việc dùng để kiểm tra xem các tham số của hàm có hợp lệ ha không, assert() cũng có thể dùng để kiểm tra nhiều giá trị khác nữa, ví dụ như giá trị trả lại từ một hàm: int SomeFunc(…) { / compute here and store result in variable called res / assert(res >= -100 && res <= 100); return res; } Trong ví dụ này, chúng ta biết rằng nếu hàm thực hiện đúng thì kết quả hàm trả lại sẽ luôn luôn nằm trong khoảng (-100, 100), vì thế chúng ta có thể dùng assert() để kiểm tra xem hàm chúng ta viết có thực hiện đúng hay không. Ngoài ra còn rất nhiều trường hợp khác mà bạn có thể dùng assert() trong chương trình của bạn. Những ví dụ trên chỉ nhằm giúp bạn hiểu được idea của việc dùng assert() mà thôi. Sau khi chương trình của bạn đã được test thử nhiều lần để tháo gỡ các lỗi, sẽ đễn một thời điểm bạn phải tung ra thị trường Release Version. Khi đó, bạn có thể disable các assert() dùng trong chương trình của bạn. Bạn làm việc đó một cách dễ dàng, bằng cách định nghĩa NDEBUG theo những cách mà mình đã nói ở trên. Khi dùng assert(), bạn phải hết sức chú ý khi nào nên dùng và khi nào không. Về nguyên tắc, chúng ta dùng assert() để phát hiện ra những bugs do chính chúng ta, những người lập trình vì vô tình mà gây ra : gọi một hàm với những tham số không hợp lệ, sử dụng sai thuật toán, v.v… Có những trường hợp chúng ta không nên dùng assert() để kiểm tra, mà phải dùng cơ chế sử lý lỗi trong thoi gian chay chương trình (runtime). Ví dụ : char *pBuf = (char *)malloc(100); if (!pBuf) {           / su ly truong hop malloc() tra ve null pointer o day */ } Tại sao không thể dùng được assert() trong trường hợp này? Bởi vì assert() chỉ có thể dùng để phát hiện ra nhưng lỗi, mà một khi chương trình viết đúng, thì chúng không còn tồn tại nữa. Nhưng trong trường hợp ở đây, dù chương trình chúng ta viết có chính xác đi chăng nữa, nhưng cũng không thể biết được là liệu malloc() cóa trả lại null pointer hay không. Một điều cần phải chú ý nữa khi dùng assert(), đó là biểu thức expression chỉ được thực hiện ở chế độ Debug (tức là khi NDEBUG không được định nghĩa), do đó chúng ta không nên viết những dòng lệnh kiểu như sau: assert(pBuf = GetBuf()); Ở đây, chúng ta muốn gọi hàm GetBuf(), sau đó kiểm tra xem con trỏ mà hàm trả lại có hợp lệ hay không. Nhưng khi biên dịch đoạn mã nguồn này ở chế độ Release (khi NDEBUG được định nghĩa) thì toàn bộ dòng lệnhtrên sẽ được thay thế bởi Null Statement, và như thê hàm GetBuf() sẽ không được gọi, và con trỏ pBuf cũng sẽ có giá trị bất kỳ. Trích diendantinhoc.org

Đánh giá:

Chia sẻ:

  • Twitter
  • Facebook
Thích Đang tải...

Có liên quan

Điều hướng bài viết « Phân quyền trong Linux: Bài 1- Quản lý User, group và phân quyền trên linux Google search skills » Chuyên mục
  • Entertaiment (4)
    • Poetries-Stories (3)
  • General Knowledge (1)
  • IELTS (42)
    • Writing Task 1 (36)
      • Bar chart (11)
      • Line graph (6)
      • Map (4)
      • Mix graph (3)
      • Pie chart (4)
      • Process (6)
      • Table (2)
    • Writing Task 2 (6)
      • Opinion (6)
  • Introduction (1)
  • Linux (5)
    • Linux Command (3)
    • Tip & Trick (1)
  • Network (8)
  • Photography (3)
  • Programming (69)
    • Android (5)
    • C/C++ (41)
    • Embedded (47)
Bài mới
  • Some advance knowledge in C/C++ _ Part 2 Tháng Mười Hai 6, 2017
  • Some advance knowledge in C/C++ _ Part 1 Tháng Mười Hai 6, 2017
  • Bù sáng (EV) Tháng Mười Một 29, 2016
  • 10 chú ý để có 1 tấm hình đẹp Tháng Mười Một 29, 2016
  • 6 yếu tố căn bản trong bố cục ảnh Tháng Mười Một 29, 2016
Xem nhiều
  • Pie chart - Practice 1: The average household expenditures in Japan and Malaysia
  • Line graph - Practice 4: Tourists to England who visited four different attractions in Brighton
  • Process - Practice 3: Life cycle of a frog
  • Bar chart - Practice 5: The different modes of transport used to travel to and from work in one European city
  • Bar chart - Practice 6: The division of household tasks by gender in Great Britain
Comment mới
How to Debug Program… trong How to Debug C Program using g…
Nguyễn Tiến Sử trong I2C Bit-Bangging – MSP430
Trung Kiên trong I2C Bit-Bangging – MSP430
C Pointer to Pointer… trong C Pointers Fundamentals Explai…
DungNT104 trong Cơ bản về mạng GPON
Số lần truy cập
  • 326 185 lần
Tháng Mười 2015
H B T N S B C
1234
567891011
12131415161718
19202122232425
262728293031
« Th6 Th11 » Tài khoản
  • Đăng ký
  • Đăng nhập
  • RSS bài viết
  • RSS bình luận
  • WordPress.com
Theo dõi blog này qua email

Nhập email của bạn để nhận thông báo về bài viết mới

Địa chỉ email:

Theo dõi

Thư viện
  • Tháng Mười Hai 2017 (2)
  • Tháng Mười Một 2016 (75)
  • Tháng Mười 2016 (10)
  • Tháng Tám 2016 (11)
  • Tháng Sáu 2016 (1)
  • Tháng Ba 2016 (1)
  • Tháng Mười Hai 2015 (2)
  • Tháng Mười Một 2015 (12)
  • Tháng Mười 2015 (3)
  • Tháng Sáu 2015 (2)
  • Tháng Mười 2014 (3)
  • Tháng Năm 2014 (1)
  • Tháng Tư 2014 (10)
Trang này sử dụng cookie. Tìm hiểu cách kiểm soát ở trong: Chính Sách Cookie
  • Đăng lại
  • Theo dõi Đã theo dõi
    • Share Your Knowledge!
    • Theo dõi ngay
    • Đã có tài khoản WordPress.com? Đăng nhập.
    • Share Your Knowledge!
    • Tùy biến
    • Theo dõi Đã theo dõi
    • Đăng ký
    • Đăng nhập
    • URL rút gọn
    • Báo cáo nội dung
    • Xem toàn bộ bài viết
    • Quản lý theo dõi
    • Ẩn menu
%d Tạo trang giống vầy với WordPress.comHãy bắt đầu

Từ khóa » Thư Viện Assert