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ỗi | Thời điểm phát hiện | Đặc điểm | Ví dụ điển hình |
|---|---|---|---|
| Syntax | Compile time | Vi phạm ngữ pháp | Thiếu ;, ngoặc không khớp |
| Runtime | Run time | Crash, UB | Chia 0, truy cập NULL, stack overflow |
| Linker | Link time | Thiếu symbol | Thiếu định nghĩa hàm, sai main() |
| Logical | Run time (kết quả sai) | Code chạy nhưng sai logic | Sai thuật toán, ; thừa, off-by-one |
| Semantic | Compile time | Vô nghĩa ngữ nghĩa | Gá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ả.