Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Các loại lỗi phổ biến trong C/C++

Trong quá trình phát triển C/C++, lập trình viên gặp phải 5 loại lỗi chính. Hiểu rõ bản chất từng loại giúp debug nhanh chóng và viết code bền vững hơn.

1. Lỗi cú pháp (Syntax Error / Compile-time Error)

Vi phạm quy tắc ngữ pháp ngôn ngữ. Compiler phát hiện trước khi chạy.

Ví dụ

#include <stdio.h>
int main() {
    printf("Hello World") // Thiếu dấu chấm phẩy
}

Kết quả

error: expected ';' before '}' token

2. Lỗi thời gian chạy (Runtime Error)

Chương trình biên dịch thành công nhưng sập (crash) khi thực thi. Không bắt được lúc compile.

Ví dụ: Chia cho 0

#include <stdio.h>
int main() {
    int x = 52, y = 0;
    printf("Div: %f", (float)x / y); // Chia cho 0 → Undefined Behavior, thường crash
    return 0;
}

Kết quả

Floating point exception (core dumped)

3. Lỗi liên kết (Linker Error)

Bi dịch thành công các file .o riêng lẻ, nhưng linker không gộp được thành executable. Thường do: thiếu định nghĩa hàm, sai tên hàm (case-sensitive), thiếu thư viện, hoặc main viết sai (Main).

Ví dụ

#include <stdio.h>
void Main() { // Sai: phải là main()
    printf("Hello");
}

Kết quả

undefined reference to `main'

4. Lỗi logic (Logical Error)

Chương trình chạy không sập, cho kết quả — nhưng sai so với ý đồ. Khó debug nhất vì không có thông báo lỗi.

Ví dụ: Dấu chấm phẩy thừa sau for

#include <stdio.h>
int main() {
    for (int i = 0; i < 5; i++); // Dấu ; tạo vòng lặp rỗng!
    {
        printf("Hello World\n"); // Chỉ in 1 lần
    }
    return 0;
}

Kết quả

Hello World

Mong đợi: in 5 lần.

5. Lỗi ngữ nghĩa (Semantic Error)

Cú pháp đúng nhưng vô nghĩa theo ngữ cảnh ngôn ngữ. Compiler thường bắt được (giống syntax error nhưng ở mức ngữ nghĩa).

Ví dụ: Gán cho biểu thức

#include <stdio.h>
int main() {
    int x = 10, y = 20, z;
    x + y = z; // Lỗi: vế trái phải là lvalue (biến), không phải biểu thức
    return 0;
}

Kết quả

error: lvalue required as left operand of assignment

Bảng tóm tắt

Loại lỗiThời điểm phát hiệnĐặc điểmVí dụ điển hình
SyntaxCompile timeVi phạm ngữ phápThiếu ;, ngoặc không khớp
RuntimeRun timeCrash, UBChia 0, truy cập NULL, stack overflow
LinkerLink timeThiếu symbolThiếu định nghĩa hàm, sai main()
LogicalRun time (kết quả sai)Code chạy nhưng sai logicSai thuật toán, ; thừa, off-by-one
SemanticCompile timeVô nghĩa ngữ nghĩaGán cho biểu thức, ép kiểu sai

Mẹo debug

  • Syntax/Semantic/Linker: Đọc kỹ thông báo compiler/linker.
  • Runtime: Dùng GDB, Valgrind, AddressSanitizer (-fsanitize=address).
  • Logical: In log trung gian, dùng debugger step-through, viết unit test.

Phân loại đúng lỗi là bước đầu tiên để khắc phục hiệu quả.