Lỗi phần mềm là phổ biến. Thật dễ dàng để tạo ra chúng, và thật khó để tìm thấy chúng. Trong chương này, chúng ta sẽ tìm hiểu các chủ đề liên quan đến việc tìm và loại bỏ các lỗi trong các chương trình C ++ của chúng ta, bao gồm cả việc học cách sử dụng trình gỡ lỗi tích hợp là một phần của IDE của chúng ta.

Mặc dù các công cụ và kỹ thuật sửa lỗi không phải là một phần của chuẩn C ++, học cách tìm và loại bỏ các lỗi trong các chương trình bạn viết là một phần cực kỳ quan trọng để trở thành một lập trình viên thành công. Do đó, chúng ta sẽ dành một chút thời gian cho các chủ đề như vậy, để các chương trình bạn viết trở nên phức tạp hơn, khả năng chẩn đoán và khắc phục các vấn đề của bạn tiến triển với tốc độ tương tự.

Nếu bạn có kinh nghiệm từ các chương trình gỡ lỗi trong một ngôn ngữ lập trình được biên dịch khác, phần lớn điều này sẽ quen thuộc với bạn.

1. Cú pháp và lỗi ngữ nghĩa

Lập trình có thể là một thách thức và C ++ là một ngôn ngữ kỳ quặc. Đặt hai thứ đó lại với nhau, và có rất nhiều cách để phạm sai lầm. Lỗi thường rơi vào một trong hai loại: lỗi cú pháp và lỗi ngữ nghĩa (lỗi logic).

Một lỗi cú pháp xảy ra khi bạn viết một câu lệnh không hợp lệ theo ngữ pháp của ngôn ngữ C ++. Điều này bao gồm các lỗi như dấu chấm phẩy bị thiếu, sử dụng các biến không được khai báo, dấu ngoặc đơn hoặc dấu ngoặc không khớp, v.v. Ví dụ, chương trình sau đây chứa khá nhiều lỗi cú pháp:

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: cafedevn@gmail.com
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

#include <iostream>
 
int main()
{
    std::cout < "Hi there"; << x; // invalid operator (<), extraneous semicolon, undeclared variable (x)
    return 0 // missing semicolon at end of statement
}

May mắn thay, trình biên dịch nói chung sẽ bắt lỗi cú pháp và tạo cảnh báo hoặc lỗi, vì vậy bạn dễ dàng xác định và khắc phục sự cố. Sau đó, nó chỉ là vấn đề biên dịch lại cho đến khi bạn thoát khỏi tất cả các lỗi.

Khi chương trình của bạn được biên dịch chính xác, việc đưa nó vào thực sự tạo ra kết quả mà bạn muốn có thể khó khăn. Một lỗi ngữ nghĩa xảy ra khi một câu lệnh có giá trị cú pháp, nhưng không làm được những gì lập trình viên dự định.

Đôi khi những điều này sẽ khiến chương trình của bạn bị thoát, chẳng hạn như trong trường hợp chia cho 0:

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: cafedevn@gmail.com
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

#include <iostream>
 
int main()
{
    int a = 10;
    int b = 0;
    std::cout << a << " / " << b << " = " << a / b; // division by 0 is undefined
    return 0;
}

Thông thường, những thứ này sẽ chỉ tạo ra giá trị hoặc hành vi sai:

#include <iostream>
 
int main()
{
    int x;
    std::cout << x; // Use of uninitialized variable leads to undefined result
 
    return 0;
}

hoặc là

#include <iostream>
 
int add(int x, int y)
{
    return x - y; // function is supposed to add, but it doesn't
}
 
int main()
{
    std::cout << add(5, 3); // should produce 8, but produces 2
 
    return 0;
}

hoặc là

#include <iostream>
 
int main()
{
    return 0; // function returns here
 
    std::cout << "Hello, world!"; // so this never executes
}

Các trình biên dịch hiện đại đã trở nên tốt hơn trong việc phát hiện một số loại lỗi ngữ nghĩa phổ biến (ví dụ: sử dụng một biến chưa được khởi tạo). Tuy nhiên, trong hầu hết các trường hợp, trình biên dịch sẽ không thể nắm bắt được hầu hết các vấn đề này, bởi vì trình biên dịch được thiết kế để thực thi ngữ pháp.

Trong ví dụ trên, các lỗi khá dễ phát hiện. Nhưng trong hầu hết các chương trình không tầm thường, các lỗi ngữ nghĩa không dễ tìm thấy bằng cách đánh dấu code. Đây là nơi kỹ thuật gỡ lỗi có thể có ích.

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!