I recently created bindings to the C libary shapelib.
http://shapelib.maptools.org/
I generated my own bindings by hand, and another set of bindings
with DStep.
I created a small test program to test my bindings. My current
test program in its entirety is:
import std.stdio;
import std.string;
import std.conv;
import shapefil;
int main( string args[] )
{
const char* filename = std.string.toStringz( args[1] );
SHPHandle hShp = SHPOpen(filename, "rb");
int num_entities;
int shp_type;
double pad_min_bound;
double pad_max_bound;
SHPGetInfo( hShp, &num_entities, &shp_type,
&pad_min_bound, &pad_max_bound);
writeln("Shapefile contains " ~ to!string(num_entities) ~ "
entities.");
writeln("Of type " ~ to!string( SHPTypeName( shp_type) ));
writeln("Bounds = [" ~to!string(pad_min_bound) ~ ","
~ to!string(pad_max_bound) ~ "]");
SHPClose( hShp );
return 0;
}
It simply reads a Shape File, the name for which is passed from
the command line.
When I execute this I get the following message:
./shapetest data/dresden/gis.osm_water_v06.shp
Shapefile contains 799 entities.
Of type Polygon
Bounds = [13.5274,50.9632]
Segmentation fault
The first three lines output are what I expected, but then it
segfaults on exit.
Running it in GDB I get the following error message:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000443fc7 in rt.dmain2._d_run_main() ()
Printing the backtrace provides no additional information. The
same problem occurs whether I used my hand-rolled binds or the
DStep version.
So my two questions are:
1. Does anyone have any idea why my program is segfaulting. It
seems to crash at exit and I read somewhere (can't recall where)
that uncollected C style strings may cause the GC to fail.
Perhaps this is my problem. I tried commenting out some of the
statements (eg. the SHPTypeName( shp_type) line, which returns a
"const char *", but I still get a segfault. Any ideas on how to
find the root cause?
2. Once I think my bindings are stable I would like to add them
to Deimos or DUB registries. Are there any recommendations for
testing bindings? I checked through some other bindings on GitHub
and didn't see any unit tests or the like. Are there any 'best
practices' out there for testing bindings?