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 #

PesanJenisPenyebab UmumPerbaikan
expected ',' or ';' before 'X'Error sintaksLupa titik koma di baris sebelumnyaTambah ; di akhir statement sebelumnya
'X' undeclared (first use in this function)ErrorIdentifier belum dideklarasikan atau typoCek ejaan, tambah deklarasi, atau #include
implicit declaration of function 'X'Error (C99+)Fungsi dipakai tanpa prototipeTambah #include atau prototipe
initialization of 'X' from incompatible pointer typeErrorPointer dengan tipe berbedaCast eksplisit atau perbaiki tipe
format 'X' expects argument of type 'A', but argument 2 has type 'B'WarningSpecifier printf/scanf tidak cocok tipe argumenCocokkan specifier dengan tipe
'X' may be used uninitializedWarningVariabel dipakai sebelum diisiInisialisasi saat deklarasi
missing separatorError MakefileBaris recipe pakai spasi, bukan TABGanti spasi dengan TAB di baris recipe
expected declaration or statement at end of inputErrorBrace { tidak ditutup }Cek keseimbangan kurung kurawal
undefined reference to 'X'Linker errorFungsi dideklarasikan tapi tidak didefinisikan atau library tidak di-linkDefinisikan fungsi atau tambah -l<lib>
cannot find -lXLinker errorLibrary libX.so/libX.a tidak ditemukanInstall library atau tambah -L<path>
conflicting types for 'X'ErrorPrototipe tidak cocok dengan definisiSamakan signature
redefinition of 'X'ErrorDefinisi fungsi/struct gandaHapus duplikat atau pakai include guard
passing argument N of 'X' discards 'const' qualifierWarningPointer non-const menerima constTambah const pada parameter
assignment to expression with array typeErrorArray tidak bisa di-assign setelah deklarasiPakai strcpy atau memcpy
comparison between pointer and integerWarningBandingkan char* dengan charBandingkan *p dengan ch atau p dengan &ch
control reaches end of non-void functionWarningFungsi non-void tidak punya return di semua pathTambah return di akhir
variable set but not usedWarningVariabel diset tapi tidak dibacaHapus atau pakai variabel

Klasifikasi Pesan #

Compiler membedakan pesan menjadi empat level:

LevelFlagEfek
Error—Kompilasi gagal, tidak ada binary dihasilkan
Warning-WKompilasi berhasil, tetapi ada potensi masalah
Pedantic warning-WpedanticPelanggaran standar yang masih diterima compiler
Static analyzer warning-fanalyzerHasil 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.

c
/* 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:

bash
gcc -std=c11 -Wall -Wextra -Wpedantic -fanalyzer -c err1.c

Output yang Dihasilkan (compiler menampilkan tiga pesan—dua warning dan satu statik analyzer warning):

text
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:

  1. Pesan 1 (-Wformat-overflow=): GCC menganalisis format string sprintf saat compile dan menemukan bahwa "Halo Budi" (9 karakter + null terminator = 10 byte) tidak muat dalam buf[4]. Perbaikannya: ganti ke snprintf(buf, sizeof(buf), "Halo") atau perbesar buf.
  2. Pesan 2 (-Wuninitialized): Variabel x dideklarasikan int x; tanpa inisialisasi, lalu dipakai di printf. Nilainya tidak terdefinisi (umumnya nol, tetapi tidak dijamin). Perbaikannya: int x = 0; atau beri nilai sebelum dipakai.
  3. Pesan 3 (-Wanalyzer-use-of-uninitialized-value): Flag -fanalyzer melakukan analisis lintas fungsi yang lebih dalam dan menampilkan CWE (Common Weakness Enumeration). Pesan ini menunjukkan CWE-457 yang berkaitan dengan penggunaan variabel belum diinisialisasi.
  4. *p = 10 tidak 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:

c
/* err2.c: missing semicolon */
int main(void) {
    int x = 5
    return 0;
}
text
err2.c: In function 'main':
err2.c:3:5: error: expected ',' or ';' before 'return'
    3 |     return 0;
      |     ^~~~~~
c
/* err5.c: implicit function declaration */
int main(void) {
    int n = strlen("halo");
    return n;
}
text
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:

c
/* err7.c: undefined reference */
extern int tidak_ada(void);
int main(void) {
    return tidak_ada();
}
bash
gcc -std=c11 -Wall -Wextra -o err7 err7.c
text
/usr/bin/ld: /tmp/ccyt9Imk.o: in function `main':
err7.c:(.text+0x5): undefined reference to 'tidak_ada'
collect2: error: ld returned 1 exit status

Perbaikan: 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.

StrategiManfaat
Mulai dari pesan pertamaHindari efek domino error cascade
Baca baris note: jugaSering berisi saran perbaikan langsung
Pakai -fdiagnostics-show-caret=no untuk output ringkasBerguna saat pesan terlalu panjang
Pakai -Wall -Wextra -Werror untuk menolak kode bermasalahMemaksa kita memperbaiki semua warning
Pakai -fanalyzer untuk analisis mendalamMendeteksi use-after-free, double-free