GCC dan Clang menerima ratusan command-line flag yang mengontrol standar bahasa, warning, optimasi, debugging, linking, dan analisis statis. Mengetahui flag yang paling sering dipakai akan membuat kita lebih produktif dan kode yang dihasilkan lebih aman. Bab ini menyusun flag GCC/Clang yang paling sering kita pakai, lengkap dengan contoh pemakaian dan dampaknya pada binary yang dihasilkan.
Flag Standar Bahasa #
Flag -std memilih versi standar C yang dipakai compiler untuk menginterpretasikan source code.
| Flag | Efek |
|---|---|
-std=c89 / -std=c90 | Standar ISO C90 (ANSI C89) |
-std=c99 | Standar ISO C99 |
-std=c11 | Standar ISO C11 (default GCC 14+) |
-std=c17 / -std=c18 | Standar ISO C17 (bugfix C11) |
-std=c2x / -std=c23 | Standar ISO C23 (GCC 15+) |
-std=gnu11 | C11 + ekstensi GNU (default GCC) |
-pedantic | Tolak ekstensi non-standar, hanya warning |
-pedantic-errors | Ekstensi non-standar jadi error |
Flag Warning #
| Flag | Efek |
|---|---|
-Wall | Warning umum (sign conversion tidak, unused var ya) |
-Wextra | Warning tambahan (parameter tidak terpakai, signed/unsigned) |
-Wpedantic | Peringati penggunaan ekstensi non-standar |
-Werror | Perlakukan warning sebagai error |
-Wconversion | Konversi implicit yang mungkin mengubah nilai |
-Wshadow | Variabel lokal menutupi variabel luar |
-Wformat=2 | Periksa format string printf/scanf ketat |
-Wnull-dereference | Deteksi dereference NULL |
-Wuninitialized | Variabel dipakai sebelum diinisialisasi |
-Wstrict-prototypes | Wajibkan void pada fungsi tanpa parameter |
-Wunused-but-set-variable | Variabel diset tapi tidak dibaca |
-fanalyzer | Analisis statik ekstra (use-after-free, double-free) |
Flag Optimasi #
| Flag | Efek |
|---|---|
-O0 | Tidak ada optimasi (default, cepat compile, mudah debug) |
-O1 | Optimasi ringan |
-O2 | Optimasi standar (produksi, tidak termasuk space-speed tradeoff) |
-O3 | Optimasi agresif (inline, vectorize) |
-Os | Optimasi untuk ukuran binary |
-Oz | Optimasi ukuran lebih agresif (Clang) |
-Ofast | -O3 + math assumption (non-standar, mungkin mengubah float result) |
-Og | Optimasi ramah debug (GCC 4.8+) |
-flto | Link-time optimization (LTO) |
Flag Debug #
| Flag | Efek |
|---|---|
-g | Sertakan simbol debug (DWARF) |
-g3 | Lebih banyak informasi (macro expansion) |
-ggdb | Format debug optimal untuk GDB |
-p / -pg | Instrument untuk gprof |
Flag Include, Library, dan Linking #
| Flag | Efek |
|---|---|
-I<path> | Tambah path pencarian header |
-L<path> | Tambah path pencarian library |
-l<name> | Link dengan library lib<name>.{a,so} |
-static | Link statik penuh |
-shared | Buat shared object (library) |
-fPIC | Position-Independent Code (wajib untuk shared library) |
-fPIE | Position-Independent Executable (default modern) |
-pie | Hasilkan PIE executable |
-Wl,<opt> | Teruskan opsi ke linker |
-Wl,-rpath,<path> | Set runtime library search path |
-Wl,--gc-sections | Buang section yang tidak terpakai |
Flag Sanitizer #
Sanitizer adalah tool bawaan GCC/Clang yang menginstrumentasi binary untuk mendeteksi bug memori dan UB saat runtime. Sangat berguna untuk testing.
| Flag | Deteksi |
|---|---|
-fsanitize=address | Buffer overflow, use-after-free, double-free (ASan) |
-fsanitize=undefined | Signed overflow, shift, null deref, alignment (UBSan) |
-fsanitize=thread | Race condition (TSan) |
-fsanitize=memory | Penggunaan memori belum diinisialisasi (MSan, Clang only) |
-fsanitize=leak | Memory leak (LSan, terintegrasi ASan) |
-fsanitize=address,undefined | Kombinasi ASan + UBSan (paling sering dipakai) |
Program Lengkap #
Program kecil berikut akan kita compile dengan berbagai kombinasi flag untuk melihat dampaknya pada binary dan output.
/* File: cflags1.c - Demo compiler flags */
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Pemakaian: %s <nama>\n", argv[0]);
return 1;
}
printf("Halo, %s!\n", argv[1]);
return 0;
}Compile dengan tiga profil berbeda dan amati hasilnya:
# Profil 1: Optimasi produksi
gcc -std=c11 -Wall -Wextra -O2 -g -o cflags1_opt cflags1.c
./cflags1_opt Budi
# Profil 2: Strict dengan analisis statik
gcc -std=c11 -Wall -Wextra -Wpedantic -Wconversion -fanalyzer -o cflags1_strict cflags1.c
./cflags1_strict Budi
# Profil 3: Sanitizer untuk testing
gcc -std=c11 -Wall -Wextra -fsanitize=address,undefined -g -o cflags1_san cflags1.c
./cflags1_san Budi
# Periksa ukuran binary
ls -la cflags1_opt cflags1_strict cflags1_sanOutput yang Dihasilkan (semua profil memberi output yang sama):
Halo, Budi!Output ukuran binary dan debug info (ls -la dan file):
-rwxrwxr-x 18824 cflags1_opt (optimized, with debug info)
-rwxrwxr-x 16032 cflags1_strict (no -O, no sanitizer)
-rwxrwxr-x 28696 cflags1_san (ASan + UBSan, debug info)
cflags1_opt: ELF 64-bit LSB pie executable, x86-64, with debug_info, not stripped
cflags1_strict: ELF 64-bit LSB pie executable, x86-64, not stripped
cflags1_san: ELF 64-bit LSB pie executable, x86-64, with debug_info, not strippedMari kita telaah baris-baris kode di atas:
- Profil 1 (
-O2 -g): Kombinasi optimasi standar dan debug info. Binary berukuran 18.824 byte—cukup kecil dan cepat.-gmenyertakan simbol DWARF yang membantugdbmenampilkan nomor baris asli saat debugging. - Profil 2 (
-Wpedantic -Wconversion -fanalyzer): Tidak ada optimasi, tetapi warning ketat diaktifkan. Binary 16.032 byte (paling kecil) karena tanpa instrumentasi dan tanpa optimasi agresif yang menambah inline. - Profil 3 (
-fsanitize=address,undefined): Binary 28.696 byte (paling besar) karena ASan menambahkan shadow memory dan checks pada setiap akses memori. Inilah harga yang kita bayar untuk deteksi bug otomatis saat runtime. - Output yang sama: Ketiga binary menghasilkan teks identik karena kode programnya valid dan tidak memicu bug. Jika kode memiliki bug memori, hanya
cflags1_sanyang akan memberikan pesan error.
Strategi Pemilihan Flag #
| Skenario | Flag disarankan |
|---|---|
| Belajar / eksperimen | -std=c11 -Wall -Wextra -g |
| Testing aktif cari bug | -std=c11 -Wall -Wextra -g -O1 -fsanitize=address,undefined |
| Debug production issue | -std=c11 -g -O2 -fno-omit-frame-pointer |
| Build produksi | -std=c11 -O2 -Wall -Wextra -Werror -DNDEBUG |
| Build library shared | tambah -fPIC -shared |
| Build untuk profiling | -std=c11 -g -O2 -pg |