为什么应用程序无法访问来自共享库的malloc内存?

我维护一个用C语言编写的库,用户可以在Linux上直接从Python使用加载共享库和调用函数的模块访问。 该模块是非常常用的,正如这个版本的共享库一样,人们在做一个流行的教程 。

用户正在获得分段错误。 在gdb下运行他的Python脚本,他发现它位于共享库中,在一个函数内,为一个结构的mallocs内存并返回指针。 他正在返回指针,但当他尝试在后续调用共享库时使用它时,会发生分段错误,因为内存不可访问。

如果他以root身份运行Python脚本,则不会发生此问题。 它也不会出现在备用Linux安装中。

所以回顾一下:

  • 他的Python代码加载了共享库。
  • 然后它调用一个函数,该函数返回指向共享库中分配的内存的指针。
  • 然后他调用共享库中的另一个函数,并传入它返回给他的指针,共享库扼杀它自己的指针。
  • 它只发生在“4.0.7-2-ARCH x86_64 GNU / Linux”上作为普通用户运行时。 当他切换到root并运行它时,该操作系统上不会发生这种情况。
  • 当他试图在Ubuntu机器上重现问题时不会发生这种情况。

是什么赋予了? 这是一些ARCH错误吗? 或者是否存在可以清除的编程细微差别?

您可以在这里阅读细节,其中包含足够的细节来重现问题,如果问题对于具有比我更多Linux编程经验的用户来说不是不言而喻的。

指向共享库函数的快速链接:

  • TCOD_map_new的源代码。
  • TCOD_map_set_properties的源代码。

他的Python代码摘录为后代和易于访问:

#!/usr/bin/env python2 import curses import libtcodpy as libtcod def main(stdscr): curses.start_color() curses.use_default_colors() map = libtcod.map_new(10, 10) # any numbers work libtcod.map_set_properties(map, 0, 0, True, True) # any in bounds integer coordinates fail stdscr.getch() curses.wrapper(main) 

我遇到了同样的问题。 我的解决方案是我在调用函数中声明了字符串(malloc()),而不是传递给被调用者函数,并填充内容。