On Wednesday, 31 January 2024 at 16:19:17 UTC, Hipreme wrote:
> On Wednesday, 31 January 2024 at 15:25:44 UTC, Don Allen wrote:
> As mentioned in previous posts, I've written a personal finance manager in D (ported from the original C) that works well when compiled with dmd.
When compiled with ldc, however, it segfaults when I try to perform an operation that involves a call to a varargs function in gtk3. The segfault occurs in the
bowels of gtk3, but a backtrace in gdb shows that the last thing that happened in my code was the call to the varargs function that I refer to above. At this point I am assuming, but do not know, that the issue is related to the varargs nature of the called gtk function.
This is disappointing. Has anyone experienced a similar issue with ldc or knows of known varargs problems with ldc? I did check the ldc github repository and did not find an open issue that sounds similar to what I'm seeing.
This problem occurred on an up-to-date Arch Linux system with the latest release of ldc installed.
/Don Allen
Works well in DMD, crashes on LDC, arguments issue. Take a look if you're using the correct extern(C)
and extern(D)
in the right places. Depending on the compiler you're using, extern
does more than name mangling, it also changes the order in which the argument are received.
The called gtk function has this prototype, which I believe is correct:
extern (C) GtkListStore* gtk_list_store_new (gint n_columns, ...);
The call site looks like
writefln("debug: %d", NMktStore.num_cols);
store = gtk_list_store_new(NMktStore.num_cols,
g_type_string, // date
g_type_string, // num
g_type_string, // description
g_type_boolean, // r
g_type_string, // transaction guid
g_type_string, // value
g_type_string); // balance
The debugging writefln prints "debug: 7", which is correct.
> Also, on a related note: I don't know if you're doing it or not, but always mark vararg as scope
. That means you can't save them anywhere, why? Because you really can't. varargs are stack allocated so it may also cause a segfault if you try to access them after the function exits its scope.
I'm not sure what you mean here. Maybe you can be more explicit after seeing the extern and call above.
> Also, you should post this on Learn instead.
I thought of that, but wanted a wider audience for my question.