[cffi-devel] requesting help debugging error in libclang bindings

Eric Schulte eric.schulte at gmx.com
Sat Jun 30 17:15:36 UTC 2012


Hello,

I'm working to write CFFI binding for libclang [1], I've used swig to
generate CFFI declarations of all libclang bindings, and I'm hoping to
wrap those in a nice CLOS-based interface (my code is up here [2]).

However I've run into an error which I'm having trouble getting past.
Although the following simple C code [3] compiles and runs w/o problem.
A direct translation into lisp [4] using the swig-generated cffi
bindings throws this error [5].  For some reason the
`clang_getTranslationUnitCursor' function always throws an error.  FWIW
I'll include the original C function headers [6] and the swig-generate
CFFI declarations [7] below.

I'm using SBCL version 1.0.57 and CFFI version 0.10.6 installed with
quicklisp.

Any idea what could be causing this error?  Could the problem lie in
SBCL, in CFFI, or possibly in some difference in state between the C
world and the lisp world?

Thanks,

Footnotes: 
[1]  http://clang.llvm.org/doxygen/group__CINDEX.html

[2]  https://github.com/eschulte/cl-libclang

[3]  hello-cursor.c
     // -*- C -*-
     #include "clang-c/Index.h"
     #include <stdio.h>

     int main(int argc, char *argv[])
     {
       // declare
       CXIndex Idx;
       CXTranslationUnit TU;
       CXCursor CU;
       enum CXCursorKind Kind;

       // initialize
       Idx  = clang_createIndex(0, 0);
       TU   = clang_createTranslationUnit(Idx, "hello.ast");
       CU   = clang_getTranslationUnitCursor(TU);
       Kind = clang_getCursorKind(CU);

       // is the cursor null
       if(clang_Cursor_isNull(CU)) return 1;
       else                        printf("cursor is not null\n");

       // cursor Kind (should be 300 for 'root')
       if(Kind != 300) return 1;
       else            printf("kind of cursor is %d\n", Kind);

       // cleanup
       clang_disposeTranslationUnit(TU);
       clang_disposeIndex(Idx);
       return 0;
     }

[4]  hello-cursor.lisp
     ;; -*- lisp -*-
    (require :libclang)
    (in-package :libclang)

    (defvar idx  nil "CXIndex")
    (defvar tu   nil "CXTranslationUnit")
    (defvar cu   nil "CXCursor")
    (defvar kind nil "CXCursorKind")

    (setf idx  (clang_createIndex 0 0))
    (setf tu   (clang_createTranslationUnit idx "etc/hello.ast"))
    (setf cu   (clang_getTranslationUnitCursor tu))
    ;; we never get this far
    (setf kind (clang_getCursorKind cu))

[5]  error running with SBCL 1.0.57

     CORRUPTION WARNING in SBCL pid 30785(tid 140737353975552):
     Memory fault at 7841 (pc=0x7ffff57edb4a, sp=0x7ffff6e37508)
     The integrity of this image is possibly compromised.
     Continuing with fingers crossed.

     debugger invoked on a SB-SYS:MEMORY-FAULT-ERROR in thread
     #<THREAD "main thread" RUNNING {1002998D93}>:
       Unhandled memory fault at #x3E800007841.

     Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

     restarts (invokable by number or by possibly-abbreviated name):
       0: [ABORT] Exit debugger, returning to top level.

[6]  from Index.h
     // -*- C -*-
     CINDEX_LINKAGE CXIndex clang_createIndex(int excludeDeclarationsFromPCH,
                                              int displayDiagnostics);
     // ...
     CINDEX_LINKAGE CXTranslationUnit clang_createTranslationUnit(CXIndex,
                                                  const char *ast_filename);
     // ...
     CINDEX_LINKAGE CXCursor clang_getTranslationUnitCursor(CXTranslationUnit);

[7]  from libclang-swig.lisp
     ;; -*- lisp -*-
     (cffi:defcfun ("clang_createIndex" clang_createIndex)
         :pointer
       (excludeDeclarationsFromPCH :int)
       (displayDiagnostics :int))
     ;; ...
     (cffi:defcfun ("clang_createTranslationUnit" clang_createTranslationUnit)
         :pointer
       (arg0 :pointer)
       (ast_filename :string))
     ;; ...
     (cffi:defcstruct CXCursor
       (kind CXCursorKind)
       (xdata :int)
       (data :pointer))
     ;; ...
     (cffi:defcfun ("clang_getTranslationUnitCursor" clang_getTranslationUnitCursor)
         CXCursor
       (arg0 :pointer))

-- 
Eric Schulte
http://cs.unm.edu/~eschulte




More information about the cffi-devel mailing list