PyList_New causes a SEGFAULT

Viewed 26

I tried to compile the code below but it always cause a segmentation fault in any of Py* functions. I don't really know what is happening or if I'm missing something here.

#include <Python.h>
#include <listobject.h>

int main(int argc, char **argv)
{
    PyObject *list;
    PyObject *value;
    
    ssize_t const N = 13;
    list = PyList_New(N);

    if (list)
    {
        value = Py_BuildValue("i", 37);
        PyList_SetItem(list, 0, value);
    }
    return (0);
}

I compiled with the command: $> gcc test.c -I/usr/include/python3.10/ -lpython3.10

And when I run the executable whit strace I get this:

execve("./a.out", ["./a.out"], 0x7ffc3e8d2fe0 /* 56 vars */) = 0
brk(NULL)                               = 0x555e070ba000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffd13395c80) = -1 EINVAL (Invalid argument)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffa0f95e000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=84359, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 84359, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ffa0f949000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpython3.10.so.1.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=5846784, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 6134720, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0f36f000
mprotect(0x7ffa0f3dc000, 5115904, PROT_NONE) = 0
mmap(0x7ffa0f3dc000, 2846720, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6d000) = 0x7ffa0f3dc000
mmap(0x7ffa0f693000, 2265088, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x324000) = 0x7ffa0f693000
mmap(0x7ffa0f8bd000, 286720, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x54d000) = 0x7ffa0f8bd000
mmap(0x7ffa0f903000, 285632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffa0f903000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\237\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0 \0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0"..., 48, 848) = 48
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0i8\235HZ\227\223\333\350s\360\352,\223\340."..., 68, 896) = 68
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=2216304, ...}, AT_EMPTY_PATH) = 0
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
mmap(NULL, 2260560, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0f147000
mmap(0x7ffa0f16f000, 1658880, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x28000) = 0x7ffa0f16f000
mmap(0x7ffa0f304000, 360448, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bd000) = 0x7ffa0f304000
mmap(0x7ffa0f35c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x214000) = 0x7ffa0f35c000
mmap(0x7ffa0f362000, 52816, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffa0f362000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libexpat.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=194872, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 196792, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0f116000
mprotect(0x7ffa0f11a000, 172032, PROT_NONE) = 0
mmap(0x7ffa0f11a000, 126976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4000) = 0x7ffa0f11a000
mmap(0x7ffa0f139000, 40960, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x23000) = 0x7ffa0f139000
mmap(0x7ffa0f144000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2d000) = 0x7ffa0f144000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libz.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=108936, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 110776, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0f0fa000
mprotect(0x7ffa0f0fc000, 98304, PROT_NONE) = 0
mmap(0x7ffa0f0fc000, 69632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7ffa0f0fc000
mmap(0x7ffa0f10d000, 24576, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13000) = 0x7ffa0f10d000
mmap(0x7ffa0f114000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7ffa0f114000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=940560, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 942344, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0f013000
mmap(0x7ffa0f021000, 507904, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe000) = 0x7ffa0f021000
mmap(0x7ffa0f09d000, 372736, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8a000) = 0x7ffa0f09d000
mmap(0x7ffa0f0f8000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe4000) = 0x7ffa0f0f8000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffa0f011000
arch_prctl(ARCH_SET_FS, 0x7ffa0f012480) = 0
set_tid_address(0x7ffa0f012750)         = 110490
set_robust_list(0x7ffa0f012760, 24)     = 0
rseq(0x7ffa0f012e20, 0x20, 0, 0x53053053) = 0
mprotect(0x7ffa0f35c000, 16384, PROT_READ) = 0
mprotect(0x7ffa0f0f8000, 4096, PROT_READ) = 0
mprotect(0x7ffa0f114000, 4096, PROT_READ) = 0
mprotect(0x7ffa0f144000, 8192, PROT_READ) = 0
mprotect(0x7ffa0f8bd000, 24576, PROT_READ) = 0
mprotect(0x555e068fb000, 4096, PROT_READ) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffa0f00f000
mprotect(0x7ffa0f998000, 8192, PROT_READ) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
munmap(0x7ffa0f949000, 84359)           = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x10} ---
+++ killed by SIGSEGV (core dumped) +++
[1]    110487 segmentation fault (core dumped)  strace ./a.out

PS: I have a small knowledge about PyObject and python wrapper functions.

1 Answers

Call Py_Initialize() to initialize the Python interpreter when embedding Python in a C application.

Related