segfault dup'ing string through C++ (via swig) module

Discussion in 'Python' started by David Eger, Jul 11, 2003.

  1. David Eger

    David Eger Guest

    I'm trying to make a very simple extension which will return a new copy
    of a C++ string object to python, and I'm segfaulting in the process.
    I'm using Python 2.2.2, SWIG 1.3.17 and g++ 3.3.
    Am I getting something very basic wrong? See code below.

    -David


    /* file: dups.cxx */
    #include "dups.h"
    string * dupstring(string s) {return new string(s);}


    /* file: dups.h */
    #ifndef __DUPS_H__
    #define __DUPS_H__

    #include <string>
    using namespace std;
    string * dupstring(string s);

    #endif


    /* file: dups.i */
    %module dups

    %{
    #include "dups.h"
    %}

    /* Convert from C++ --> Python */
    %typemap(out) string {
    $result = PyString_FromString($1.c_str());
    }

    /* Convert from Python --> C++ */
    %typemap(in) string {
    $1 = PyString_AsString($result);
    }

    string * dupstring(string);


    /* file: makefile */

    CFLAGS = -gstabs+ -O3 -fpic

    _dups.so: dups.o dups_wrap.o
    g++ -shared -o $@ $?

    %.o: %.cpp
    g++ -c $(CFLAGS) -o $@ $?

    %.o: %.cxx
    g++ -I/usr/include/python2.2 -c $(CFLAGS) -o $@ $?

    %_wrap.cxx: %.i
    swig -c++ -python $?

    clean:
    rm -f *.o dups_wrap.* *.so dups.py dups.pyc



    /* file: session_crash */

    Python 2.2.2 (#1, Mar 21 2003, 23:40:29)
    [GCC 3.2.3 20030316 (Debian prerelease)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import dups
    >>> a = dups.dupstring("foo")

    Program received signal SIGSEGV, Segmentation fault.
    [Switching to Thread 16384 (LWP 22607)]
    0x0fcc87ec in strlen () from //lib/libc.so.6
    (gdb) bt
    #0 0x0fcc87ec in strlen () from //lib/libc.so.6
    #1 0x0fb41324 in _wrap_dupstring (self=0x0, args=0x0)
    at /usr/include/c++/3.3/bits/char_traits.h:143
    #2 0x100ba9e8 in PyCFunction_Call ()
    #3 0x1003c000 in Py_MakePendingCalls ()
    #4 0x1003cd4c in PyEval_EvalCodeEx ()
    #5 0x1003fdcc in PyEval_EvalCode ()
    #6 0x1006cd34 in PyRun_FileExFlags ()
    #7 0x1006c19c in PyRun_InteractiveOneFlags ()
    #8 0x1006bf1c in PyRun_InteractiveLoopFlags ()
    #9 0x1006d984 in PyRun_AnyFileExFlags ()
    #10 0x1000c4c8 in Py_Main ()
    #11 0x1000bf28 in main ()
    #12 0x0fc62da4 in __libc_start_main (argc=1, ubp_av=0x7ffff9f4, ubp_ev=0x0, auxvec=0x7ffffa5c,
    rtld_fini=0x30026b38 <_rtld_local>, stinfo=0x1000bf18, stack_on_entry=0x7ffff9e0)
    at ../sysdeps/powerpc/elf/libc-start.c:186
    (gdb)
     
    David Eger, Jul 11, 2003
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. arnuld
    Replies:
    13
    Views:
    519
    Ben Pfaff
    Apr 14, 2009
  2. ObiWanKinobi
    Replies:
    0
    Views:
    707
    ObiWanKinobi
    Jun 6, 2010
  3. Andrey Vul
    Replies:
    8
    Views:
    687
    Richard Bos
    Jul 30, 2010
  4. François Beausoleil

    :s.respond_to?(:dup) && :s.dup raises

    François Beausoleil, Apr 5, 2007, in forum: Ruby
    Replies:
    1
    Views:
    101
    Tim Hunter
    Apr 5, 2007
  5. Luka Stolyarov
    Replies:
    10
    Views:
    295
    Thomas Sondergaard
    Sep 11, 2010
Loading...

Share This Page