Skip to content

emka.web.id

menulis pengetahuan – merekam peradaban

Menu
  • Home
  • Tutorial
  • Search
Menu

Glib Debugging Macros

Posted on April 8, 2012

glib has a nice set of macros you can use to enforce invariants and preconditions in your code. GTK+ uses these liberally—one of the reasons it’s so stable and easy to use. They all disappear when you define G_DISABLE_CHECKS or G_DISABLE_ASSERT, so there’s no performance penalty in production code. Using these liberally is a very, very good idea. You’ll find bugs much faster if you do. You can even add assertions and checks whenever you find a bug to be sure the bug doesn’t reappear in future versions—this complements a regression suite. Checks are especially useful when the code you’re writing will be used as a black box by other programmers; users will immediately know when and how they’ve misused your code.

Of course you should be very careful to ensure your code isn’t subtly dependent on debug-only statements to function correctly. Statements that will disappear in pro- duction code should never have side effects.

[code lang=”cpp”]
#include <glib.h>

g_return_if_fail(condition);
g_return_val_if_fail(condition, retval);
[/code]
Figure 2-3. Precondition Checks

Figure 2-3 shows glib’s precondition checks. g_return_if_fail() prints a warning
and immediately returns from the current function if condition is FALSE. g_return_val_if_fail()

is similar but allows you to return some retval. These macros are incredibly useful—if
you use them liberally, especially in combination with GTK+’s runtime type check- ing, you’ll halve the time you spend looking for bad pointers and type errors.

Using these functions is simple; here’s an example from the glib hash table imple- mentation:
[code lang=”cpp”]
void
g_hash_table_foreach (GHashTable *hash_table,
GHFunc func,
gpointer user_data)
{
GHashNode *node;
gint i;

g_return_if_fail (hash_table != NULL);
g_return_if_fail (func != NULL);

for (i = 0; i < hash_table->size; i++)
for (node = hash_table->nodes[i]; node; node = node->next)
(* func) (node->key, node->value, user_data);
}
[/code]

Without the checks, passing NULL as a parameter to this function would result in a mysterious segmentation fault. The person using the library would have to figure out where the error occurred with a debugger, and maybe even dig in to the glib code to see what was wrong. With the checks, they’ll get a nice error message telling them that NULL arguments are not allowed.
[code lang=”cpp”]
#include <glib.h>

g_assert(condition);
g_assert_not_reached(void);
[/code]
Figure 2-4. Assertions

glib also has more traditional assertion macros, shown in Figure 2-4. g_assert() is basically identical to assert(), but responds to G_DISABLE_ASSERT and behaves consistently across all platforms. g_assert_not_reached() is also provided; this is

an assertion which always fails. Assertions call abort() to exit the program and (if your environment supports it) dump a core file for debugging purposes.
Fatal assertions should be used to check internal consistency of a function or library, while g_return_if_fail() is intended to ensure sane values are passed to the pub- lic interfaces of a program module. That is, if an assertion fails, you typically look for a bug in the module containing the assertion; if a g_return_if_fail() check fails, you typically look for the bug in the code which invokes the module.

This code from glib’s calendrical calculations module shows the difference:
[code lang=”cpp”]
GDate*
g_date_new_dmy (GDateDay day, GDateMonth m, GDateYear y)
{
GDate *d;
g_return_val_if_fail (g_date_valid_dmy (day, m, y), NULL);

d = g_new (GDate, 1);

d->julian = FALSE;
d->dmy = TRUE;

d->month = m;
d->day = day;
d->year = y;

g_assert (g_date_valid (d));

return d;
}
[/code]

The precondition check at the beginning ensures the user passes in reasonable values for the day, month and year; the assertion at the end ensures that glib constructed a sane object, given sane values.

g_assert_not_reached() should be used to mark “impossible” situations; a com- mon use is to detect switch statements that don’t handle all possible values of an enumeration:
[code lang=”cpp”]
switch (val)
{
case FOO_ONE:
break;
case FOO_TWO:
break;
default:
/* Invalid enumeration value */
g_assert_not_reached();
break;
}
[/code]

All of the debugging macros print a warning using glib’s g_log() facility, which means the warning includes the name of the originating application or library, and you can optionally install a replacement warning-printing routine. For example, you might send all warnings to a dialog box or log file instead of printing them on the console.

Source: Havoc Pennington. 1999. GTK Gnome Application Development. New York: New Riders Publishing

Terbaru

  • Inilah Alasan Kenapa Sinkhole Sering Muncul di Indonesia dan Cara Mengenali Tanda-Tandanya Supaya Kalian Tetap Aman
  • Inilah Program PJJ 2026 untuk Anak Tidak Sekolah, Cara Mudah Masuk SMA Tanpa Harus ke Kelas Tiap Hari!
  • Inilah Program SPMB 2026 PJJ Khusus Anak Tidak Sekolah, Solusi Buat yang Pengen Balik Belajar!
  • Inilah Cara Kuliah di Al-Azhar Mesir Lewat Jalur Kemenag 2026, Lengkap dengan Syarat dan Jadwalnya!
  • Inilah Jadwal Lengkap Jalur Mandiri Unud 2026, Persiapkan Diri Kalian Sebelum Menyesal!
  • Inilah 8 Universitas Swasta Terbaik di Indonesia Versi THE Asia University Rankings 2026 yang Bisa Jadi Pilihan Kuliah Kamu
  • Inilah Jadwal Terbaru SSU ITB 2026 yang Diperpanjang, Lengkap dengan Syarat dan Rincian Biayanya!
  • Inilah 10 Jurusan Kuliah Paling Dicari Perusahaan Tahun 2026, Cek Daftarnya Biar Nggak Salah Pilih!
  • Inilah Cara Daftar Beasiswa Tut Wuri Handayani 2026, Kesempatan Emas Buat PNS Kemendiktisaintek Tingkatkan Karier!
  • Inilah Ketentuan Lengkap TKA Susulan 2026 SD dan SMP, Cek Syarat dan Jadwal Resminya Di Sini!
  • Inilah Kurikulum Berbasis Cinta Madrasah: Panduan Lengkap dan Link Download PDF Terbaru 2026
  • Inilah Kronologi Mencekam Kecelakaan KA Argo Bromo Anggrek Tabrak KRL di Bekasi Timur yang Bikin Jalur Kereta Lumpuh Total
  • Inilah Alasan Kenapa Hari Libur dan Tanggal Penting Selalu Ditulis Pakai Warna Merah di Kalender
  • Inilah Cara Daftar Jalur Prestasi Politeknik PU Semarang 2026, Kesempatan Kuliah di Kampus Kementerian PU!
  • Inilah Cara Cek Bansos PKH dan BPNT 2026 Lewat HP, Lengkap dengan Jadwal Cair dan Besaran Dananya!
  • Inilah Alasan Kemdiktisaintek Bakal Tutup Banyak Jurusan Kuliah yang Nggak Relevan dengan Industri
  • Inilah Status Libur Hari Pendidikan Nasional 2026 dan Sejarah Penting di Baliknya
  • Inilah Daftar Libur Mei 2026 yang Bikin Full Senyum, Siapkan Rencana Liburan Kalian Sekarang!
  • Inilah Daftar Universitas Terbaik di Jepang Versi THE Asia University Rankings 2026, Kampus Mana yang Jadi Incaran Kalian?
  • Inilah Alasan Kenapa Kemdiktisaintek Bakal Tutup Sejumlah Prodi dan Fokus ke 8 Industri Strategis
  • Inilah Sosok Richard Aldrich McCurdy, Penguasa Asuransi yang Terjerat Skandal di Masa Gilded Age
  • Inilah Alasan Suhu Bumi Naik Drastis dan Cara Kita Menghadapi Ancaman Cuaca Ekstrem
  • Apa itu Pasukan Perdamaian PBB?
  • Inilah 25 Universitas Paling Internasional di Dunia 2026, Ternyata Kampus di Asia Mulai Merajai!
  • Inilah 10 PTS Terbaik di Indonesia Versi Webometrics 2026 yang Bisa Jadi Referensi Kalian
  • Inilah Cara Daftar Kuliah di Universitas Al-Azhar Mesir 2026 Lewat Jalur Resmi Kemenag
  • Inilah Daftar 20 PTN Terbaik Indonesia Versi Webometrics 2026, Kampus Impian Kalian Ada Nggak?
  • Inilah Profil Donny Sucahya, Sosok Pengusaha Muda yang Viral Karena Bisnis dan Pernikahannya
  • Inilah Alasan Kenapa Belalang Daun Bisa Berubah Warna dari Pink ke Hijau, Ternyata Mirip Daun!
  • Inilah Kenapa eBay Error dan Mengenal The Hacktivist Group 313 yang Mengklaim Bertanggung Jawab Atas Gangguan Global Tersebut
  • How to Level Up Your PC Gaming Experience with the New Valve Steam Controller and Its Advanced Features
  • Is it Time to Replace Nano? Discover Fresh, the Terminal Text Editor You Actually Want to Use
  • How to Design a Services Like Google Ads
  • How to Fix 0x800ccc0b Outlook Error: Step-by-Step Guide for Beginners
  • How to Fix NVIDIA App Error on Windows 11: Simple Guide
  • How to create high-quality cinematic AI videos and realistic avatars using HeyGen and the Seedance 2.0 model
  • How to build an AI chatbot for your business in just minutes without writing a single line of code
  • How to Master Answer Engine Optimization with HubSpot AEO Tool
  • How to Use GPT-5.5 and Claude Opus 4.7 Together to Maximize Your Workflow Productivity and Code Quality
  • Claude Tutorial: How to Build Your First SaaS Business Using AI Without Coding
  • Apa itu Spear-Phishing via npm? Ini Pengertian dan Cara Kerjanya yang Makin Licin
  • Apa Itu Predator Spyware? Ini Pengertian dan Kontroversi Penghapusan Sanksinya
  • Mengenal Apa itu TONESHELL: Backdoor Berbahaya dari Kelompok Mustang Panda
  • Siapa itu Kelompok Hacker Silver Fox?
  • Apa itu CVE-2025-52691 SmarterMail? Celah Keamanan Paling Berbahaya Tahun 2025

©2026 emka.web.id | Design: Newspaperly WordPress Theme