Pesan error GCC/Clang kadang membingungkan—terutama karena baris yang ditunjuk sering bukan tempat bug sebenarnya. Bab ini menyusun pesan error dan warning yang paling sering kita temui saat belajar C, lengkap dengan penyebab dan perbaikan. Setiap pesan disertai contoh kode bermasalah dan output aktual dari GCC.
Tabel Error dan Warning #
| Pesan | Jenis | Penyebab Umum | Perbaikan |
|---|---|---|---|
expected ',' or ';' before 'X' | Error sintaks | Lupa titik koma di baris sebelumnya | Tambah ; di akhir statement sebelumnya |
'X' undeclared (first use in this function) | Error | Identifier belum dideklarasikan atau typo | Cek ejaan, tambah deklarasi, atau #include |
implicit declaration of function 'X' | Error (C99+) | Fungsi dipakai tanpa prototipe | Tambah #include atau prototipe |
initialization of 'X' from incompatible pointer type | Error | Pointer dengan tipe berbeda | Cast eksplisit atau perbaiki tipe |
format 'X' expects argument of type 'A', but argument 2 has type 'B' | Warning | Specifier printf/scanf tidak cocok tipe argumen | Cocokkan specifier dengan tipe |
'X' may be used uninitialized | Warning | Variabel dipakai sebelum diisi | Inisialisasi saat deklarasi |
missing separator | Error Makefile | Baris recipe pakai spasi, bukan TAB | Ganti spasi dengan TAB di baris recipe |
expected declaration or statement at end of input | Error | Brace { tidak ditutup } | Cek keseimbangan kurung kurawal |
undefined reference to 'X' | Linker error | Fungsi dideklarasikan tapi tidak didefinisikan atau library tidak di-link | Definisikan fungsi atau tambah -l<lib> |
cannot find -lX | Linker error | Library libX.so/libX.a tidak ditemukan | Install library atau tambah -L<path> |
conflicting types for 'X' | Error | Prototipe tidak cocok dengan definisi | Samakan signature |
redefinition of 'X' | Error | Definisi fungsi/struct ganda | Hapus duplikat atau pakai include guard |
passing argument N of 'X' discards 'const' qualifier | Warning | Pointer non-const menerima const | Tambah const pada parameter |
assignment to expression with array type | Error | Array tidak bisa di-assign setelah deklarasi | Pakai strcpy atau memcpy |
comparison between pointer and integer | Warning | Bandingkan char* dengan char | Bandingkan *p dengan ch atau p dengan &ch |
control reaches end of non-void function | Warning | Fungsi non-void tidak punya return di semua path | Tambah return di akhir |
variable set but not used | Warning | Variabel diset tapi tidak dibaca | Hapus atau pakai variabel |
Klasifikasi Pesan #
Compiler membedakan pesan menjadi empat level:
| Level | Flag | Efek |
|---|---|---|
| Error | — | Kompilasi gagal, tidak ada binary dihasilkan |
| Warning | -W | Kompilasi berhasil, tetapi ada potensi masalah |
| Pedantic warning | -Wpedantic | Pelanggaran standar yang masih diterima compiler |
| Static analyzer warning | -fanalyzer | Hasil analisis lintas fungsi (use-after-free, double-free) |
Program Demo: Error dan Warning #
Program berikut memuat beberapa bug yang sering kita temui saat belajar. Compile dengan flag ketat untuk melihat pesan yang ditampilkan.
/* File: err1.c - Demo beberapa error dan warning compiler */
#include <stdio.h>
int main(void) {
int x; /* belum diinisialisasi */
printf("x = %d\n", x); /* warning: x belum diinisialisasi */
int *p = NULL;
*p = 10; /* null dereference */
char buf[4];
sprintf(buf, "Halo Budi"); /* buffer overflow */
return 0;
}Compile dengan flag ketat dan amati pesan yang muncul:
gcc -std=c11 -Wall -Wextra -Wpedantic -fanalyzer -c err1.cOutput yang Dihasilkan (compiler menampilkan tiga pesan—dua warning dan satu statik analyzer warning):
err1.c: In function 'main':
err1.c:12:23: warning: 'Halo Budi' directive writing 9 bytes into a region of size 4 [-Wformat-overflow=]
12 | sprintf(buf, "Halo Budi"); /* buffer overflow */
| ~~~~^~~~~
err1.c:12:5: note: 'sprintf' output 10 bytes into a destination of size 4
err1.c:6:5: warning: 'x' is used uninitialized [-Wuninitialized]
6 | printf("x = %d\n", x); /* warning: x belum diinisialisasi */
| ^~~~~~~~~~~~~~~~~~~~~
err1.c:6:5: warning: use of uninitialized value 'x' [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
6 | printf("x = %d\n", x);
| ^~~~~~~~~~~~~~~~~~~~~Mari kita telaah baris-baris pesan di atas:
- Pesan 1 (
-Wformat-overflow=): GCC menganalisis format stringsprintfsaat compile dan menemukan bahwa"Halo Budi"(9 karakter + null terminator = 10 byte) tidak muat dalambuf[4]. Perbaikannya: ganti kesnprintf(buf, sizeof(buf), "Halo")atau perbesarbuf. - Pesan 2 (
-Wuninitialized): Variabelxdideklarasikanint x;tanpa inisialisasi, lalu dipakai diprintf. Nilainya tidak terdefinisi (umumnya nol, tetapi tidak dijamin). Perbaikannya:int x = 0;atau beri nilai sebelum dipakai. - Pesan 3 (
-Wanalyzer-use-of-uninitialized-value): Flag-fanalyzermelakukan analisis lintas fungsi yang lebih dalam dan menampilkan CWE (Common Weakness Enumeration). Pesan ini menunjukkan CWE-457 yang berkaitan dengan penggunaan variabel belum diinisialisasi. *p = 10tidak diperingatkan: Dereference NULL sebenarnya UB, tetapi compiler statik tidak selalu mendeteksinya. Untuk kasus ini, ASan (AddressSanitizer) akan menangkap saat runtime—lihat bab Setup Address Sanitizer di lampiran.
Contoh Error Sintaks #
Beberapa error klasik yang sering membingungkan pemula:
/* err2.c: missing semicolon */
int main(void) {
int x = 5
return 0;
}err2.c: In function 'main':
err2.c:3:5: error: expected ',' or ';' before 'return'
3 | return 0;
| ^~~~~~/* err5.c: implicit function declaration */
int main(void) {
int n = strlen("halo");
return n;
}err5.c: In function 'main':
err5.c:2:13: error: implicit declaration of function 'strlen' [-Wimplicit-function-declaration]
2 | int n = strlen("halo");
| ^~~~~~
err5.c:1:1: note: include '<string.h>' or provide a declaration of 'strlen'Compiler GCC 14 menolak kode ini sebagai error. Fixing-nya: tambahkan #include <string.h> di awal file. GCC bahkan memberi saran yang sangat spesifik—“include <string.h> or provide a declaration of strlen”.
Linker Errors #
Linker error muncul setelah kompilasi sukses, saat menggabungkan object file menjadi executable. Pesan paling umum:
/* err7.c: undefined reference */
extern int tidak_ada(void);
int main(void) {
return tidak_ada();
}gcc -std=c11 -Wall -Wextra -o err7 err7.c/usr/bin/ld: /tmp/ccyt9Imk.o: in function `main':
err7.c:(.text+0x5): undefined reference to 'tidak_ada'
collect2: error: ld returned 1 exit statusPerbaikan: definisikan fungsi tidak_ada() di file .c lain dan sertakan saat link, atau hapus pemanggilan jika tidak diperlukan.
Strategi Membaca Pesan Compiler #
Ketika compiler menampilkan banyak pesan, baca dari atas ke bawah. Error pertama sering memicu cascade error lain yang sebenarnya tidak ada. Setelah memperbaiki error pertama, re-compile dan lihat berapa banyak error yang tersisa.
| Strategi | Manfaat |
|---|---|
| Mulai dari pesan pertama | Hindari efek domino error cascade |
Baca baris note: juga | Sering berisi saran perbaikan langsung |
Pakai -fdiagnostics-show-caret=no untuk output ringkas | Berguna saat pesan terlalu panjang |
Pakai -Wall -Wextra -Werror untuk menolak kode bermasalah | Memaksa kita memperbaiki semua warning |
Pakai -fanalyzer untuk analisis mendalam | Mendeteksi use-after-free, double-free |