[Cffi-devel] foreign-free causes stack dump (on CCL) after a repeated calls

Mirko Vukovic mirko.vukovic at gmail.com
Mon Feb 9 20:50:57 UTC 2015


Hello,

I am running 64-bit CCL 1.10 on Windows 7.  I'm writing an interface to a
National Instruments library (dll)
The library was downloaded from the NI site.  It was compiled using
Microsofts C++ compiler.

I get a stack dump when a pointer is being freed using foreign-free.  This
error occurs not in a fresh lisp
session, but after a second or third call to the same function (with same
arguments).

One more detail: the library is used to access data in files in NI's TDMS
format.  This error does not
seem to happen on all files that I am trying to access, only some of them.

I don't have much experience in cross-language library interface building,
and I am wondering if I am making
some kind of mistake.  I am hoping for pointers on how to debug this
further.

I define a pointer of type :uint to access results of a call to a library
function that places them into an
unsigned int variable.  I then retrieve the value using using mem-ref, and
the free the pointer.
This is where the stack dump happens.

What follows is the defcfun, and the lisp function.  I mark with *** the
pointer, and the relevant variable
definitions that pertain to it:

The C-function interface (with the C-documentation included) is
(defcfun (ddc-get-num-channel-group-properties
"DDC_GetNumChannelGroupProperties")
    ddc-code
  "
This function will get numberOfProperites (via a pointer)

int DDC_GetNumChannelGroupProperties (DDCChannelGroupHandle channelGroup,
                                      unsigned int *numberOfProperties);
*******"
  (group-handle group-handle) ;; group-handle is define to be a pointer type
  (num-channel-group-properties :pointer)) ;;*******

The pointer issue arises with the second variable
num-channel-group-properties.

The lisp code where the error occurs is below (relevant lines highlighted
with ***).

(defun get-num-channel-group-properties (group-handle*)
  "Get number of file properties

FILE-HANDLE* is a pointer to the file handle"
;;  (trace foreign-alloc)
  (let ((number-of-properties
       (let ((number-of-properties* (foreign-alloc :uint))) ;;******
         (print 'allocated-pointer)
         (print number-of-properties*)
         (ddc-get-num-channel-group-properties group-handle*
                           number-of-properties*)
         (print 'done-with-ddc)
         (prog2
         (print 'acessing-number-of-properties)
         (mem-ref number-of-properties* :uint) ;; ********
           (print 'freeing-pointer)
           (foreign-free number-of-properties*) ;; ********
           (print 'freed-pointer)))))
  ;;  (untrace foreign-alloc)
    (print 'ready-to-return-with-value)
    number-of-properties))

The traceback is:

ALLOCATED-POINTER
#<A Foreign Pointer #x5FFC70>
DONE-WITH-DDC
ACESSING-NUMBER-OF-PROPERTIES
FREEING-POINTER
 1> Calling (FOREIGN-FREE #<A Foreign Pointer #x5FFC70>)

and the debugger traceback is

(#x0000000026479810) #x00000000000F532C : #<Function FREE
#x00000001000F51BF> + 365
(#x0000000026479840) #x0000000001491314 : #<Function (TRACED FOREIGN-FREE)
#x000000210149109F> + 629
(#x0000000026479888) #x000000000139DE14 : #<Function
GET-NUM-CHANNEL-GROUP-PROPERTIES #x000000210139DCDF> + 309

So, to summarize:

I have created a pointer to access results of a library call.  Library
accesses contents of files created with National
Instruments software.  Library is compiled with MS C++.

The pointer free crash occurs on the third call of the lisp function.  The
first two calls (with same arguments)
run OK.

Thanks,

Mirko
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cffi-devel/attachments/20150209/6f7f4fc2/attachment.html>


More information about the cffi-devel mailing list