Seluruh kebiasaan yang kita kumpulkan di section ini — dari garis undefined behavior sampai validator path — punya bentuk dokumen resmi yang disusun para ahli: coding guidelines. Guideline bukan teori; ia daftar aturan yang bisa diperiksa manusia maupun alat, dan dipakai proyek dari game sampai mobil. Chapter penutup ini mengenalkan tiga guideline utama untuk C++, menunjukkan aturannya hidup di dalam kode yang teruji, dan menutup section dengan checklist sebelum rilis.

Tiga Guideline yang Layak Dikenal #

SEI CERT C++ Coding Standard disusun oleh Software Engineering Institute di Carnegie Mellon dengan fokus keamanan dan keandalan. Aturannya dikelompokkan per kategori — EXP untuk expression, MEM untuk memory management, F untuk functions — dan tiap aturan memuat pasangan contoh noncompliant versus compliant beserta risiko yang dinilai. Banyak alat pemeriksaan komersial menargetkan aturan ini secara langsung, dan clang-tidy menyediakannya lewat kelompok cert-*.

C++ Core Guidelines ditulis Bjarne Stroustrup dan Herb Sutter bersama komunitas, berisi ribuan aturan bernomor (F, R, ES, CP, dan lainnya) dengan filsafat abstraksi tanpa biaya tambahan: pikirkan lewat tipe dan kepemilikan, bukan disiplin pointer mentah. Aturan yang tidak bisa diperiksa compiler didampingi pustaka kecil bernama GSL, dan clang-tidy menerjemahkan banyak aturannya menjadi kelompok cppcoreguidelines-*.

AUTOSAR C++14 dipakai industri otomotif: subset C++ yang jauh lebih ketat, yang membatasi fitur berperilaku bergantung implementasi dan sebagian pola dinamis, dengan alasan sertifikasi dan determinisme. Tidak semua proyek perlu seketat itu, tetapi membaca alasannya mendidik — setiap larangan memuat justifikasi keamanannya.

GuidelinePenyusunFokusBentuk aturan
SEI CERT C++SEI, Carnegie Mellonkeamanan dan keandalankategori EXP/MEM/F…, contoh noncompliant vs compliant
C++ Core GuidelinesStroustrup, Sutter, komunitastipe, kepemilikan, gaya modernnomor F/R/ES/CP…, didampingi GSL
AUTOSAR C++14aliansi otomotifsubset ketat dan sertifikasiaturan bernomor, wajib/opsional

Guideline di Dalam Kode: Satu Program Kecil #

Guideline baru berarti sesuatu bila aturannya terlihat di kode. Program berikut mempraktikkan beberapa aturan sekaligus dan menamakannya di komentar:

cpp
// panduan.cpp — kebiasaan dari guideline resmi, dipraktikkan dalam satu program kecil.

#include <iostream>
#include <memory>
#include <string>
#include <string_view>
#include <vector>

// Core Guidelines F/STR: parameter teks masuk lewat string_view, batas dari data,
// tidak ada aritmetika pointer mentah, tidak ada indeks yang ditebak.
std::string_view potong(std::string_view teks, std::size_t maks) {
    if (maks >= teks.size()) {
        return teks;                 // seluruh teks aman dikembalikan
    }
    return teks.substr(0, maks);     // potongan di dalam batas
}

int main() {
    const std::vector<std::string> daftar = {"alpukat", "bawang", "cabai"};

    for (const auto& item : daftar) {          // ES.71: range-for daripada indeks manual
        std::cout << potong(item, 4) << '\n';
    }

    auto pemilik = std::make_unique<std::string>("pemilik tunggal");   // R.11: hindari new manual
    std::cout << *pemilik << '\n';             // MEM50: tidak ada akses setelah pelepasan
    pemilik.reset();
    std::cout << "sisa pemilik: " << (pemilik ? "masih ada" : "kosong") << '\n';
    return 0;
}

Output yang Dihasilkan:

text
alpu
bawa
caba
pemilik tunggal
sisa pemilik: kosong

Bedah baris-per-baris:

  1. Baris 11–16 (potong) — teks masuk lewat std::string_view tanpa salinan (keluarga aturan F/STR pada Core Guidelines); batas dihitung dari teks.size() dan substr dijaga tetap berada di dalam — tidak ada aritmetika pointer dan tidak ada indeks yang ditebak.
  2. Baris 21–23 (range-for, ES.71) — aturan menyuruh memilih range-for daripada perulangan berindeks; tidak ada variabel indeks yang bisa meleset keluar batas.
  3. Baris 25–28 (kepemilikan, R.11 dan MEM50) — std::make_unique menggantikan new manual; setelah reset(), program hanya menguji status pointer tanpa mendereferensinya — akses setelah pelepasan mustahil terjadi di jalur ini.
  4. Output — potong memotong aman di batas empat karakter dan pesan status menutup program. Kode yang taat guideline terlihat biasa saja — dan itu justru poinnya: keamanan yang benar jarang menarik perhatian.

Guideline Baru Berarti Tooling #

Aturan yang hanya hidup di dokumen akan tergelincir; pasang pemeriksaannya. Baseline kita sepanjang course — g++ -Wall -Wextra — sudah menangkap banyak pelanggaran sejak kompilasi. Langkah berikutnya adalah clang-tidy dengan kelompok aturan guideline; chapter linting-dengan-clang-tidy di section Debugging dan Code Quality membahas pemasangannya:

bash Contoh perintah — clang-tidy tidak terinstal di lingkungan course (ilustrasi)
clang-tidy panduan.cpp --checks=cert-*,cppcoreguidelines-*,clang-analyzer-* -- -std=c++23 -Wall -Wextra

Cara mengadopsinya di proyek nyata: mulai dari kelompok aturan kecil, wajibkan lewat CI, lalu tambahkan bertahap. Mengaktifkan ribuan aturan sekaligus hanya menenggelamkan tim dalam ribuan peringatan; subset yang tumbuh pelan jauh lebih tahan lama.

Checklist Sebelum Rilis dan Penutup Section #

Keamanan dijaga dengan kebiasaan yang diulang; checklist berikut merangkum section ini menjadi daftar yang bisa ditempel di proses rilis:

  • Build rilis lolos -Wall -Wextra tanpa peringatan baru; static analysis berjalan di CI tanpa temuan yang diterima diam-diam.
  • Build uji dijalankan dengan AddressSanitizer/UBSan dan hasilnya bersih.
  • Setiap input dari luar melewati validator: panjang, format, rentang; penolakan bersifat default (fail-closed).
  • Tidak ada nama berkas dari input yang dipakai tanpa normalisasi dan pemeriksaan awalan; rahasia tidak pernah masuk log.
  • Kepemilikan memori lewat smart pointer dan RAII; tidak ada new/delete manual pada jalur kode baru.
  • Temuan keamanan lama dipetakan ke ID CWE dan statusnya dicek ulang setiap rilis.

Section ini dimulai dari garis halus antara bug dan kerentanan — undefined behavior — lalu bergerak melalui out-of-bounds, use-after-free, buffer overflow, luapan bilangan, format string, validasi input, memori, dan berkas, sampai kamus CWE dan guideline resmi. Pola yang sama berulang di setiap chapter: jaga batas, jadikan default yang aman, dan biarkan alat memeriksa. Bekal itu sekarang kita bawa ke babak berikutnya, Section Interoperabilitas dan Ecosystem, yang dibuka dengan pertanyaan lama yang berbahaya: bagaimana C++ berbicara dengan C, bahasa yang mendefinisikan ABI di sebagian besar platform.

Referensi: SEI CERT C++ Coding Standard , C++ Core Guidelines .