使用 python ctypes 在 libc.so.6 中调用 iswctype 函数时出现分段错误

Segmentation Fault when call iswctype function in libc.so.6 using python ctypes

我正在 python 学习 ctypes 模块。我有以下代码:

代码

import sys
print(sys.version)
import ctypes
libc = ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6")
print(libc)
for x in "我学Python!":
    print("'%s'" % x, libc.iswalpha(
       ord(x)
    ))

libc.wctype.argtypes = [ctypes.c_char_p]
alpha_wctype = libc.wctype(b'print')
print(type(alpha_wctype))
libc.iswctype.restype = ctypes.c_int
print(libc.iswctype(ord("我"), alpha_wctype))

输出

3.7.7 (default, May  7 2020, 21:25:33) 
[GCC 7.3.0]
<CDLL '/lib/x86_64-linux-gnu/libc.so.6', handle 7f1d5b9e24f0 at 0x7f1d5a498f10>
'我' 1
'学' 1
'P' 1024
'y' 1024
't' 1024
'h' 1024
'o' 1024
'n' 1024
'!' 0
<class 'int'>
Fatal Python error: Segmentation fault

Current thread 0x00007f1d5b9dd740 (most recent call first):
  File "test2.py", line 15 in <module>
[1]    12178 segmentation fault  python -X faulthandler test2.py

那么为什么最后一行产生了分段错误,我如何使用 ctypes 正确使用 iswctype?

wctype 不是 return 一个 int,而是一个 wctype_t。 Python 没有可移植的 ctypes 类型,但它可能是您系统上的 unsigned longlibc.wctype.restype = ctypes.c_ulong 也是如此。同样,您需要为 iswctype 指定参数类型,如下所示:libc.iswctype.argtypes = [ctypes.c_uint, ctypes.c_ulong]。如果不做这些事情,您将截断 alpha_wctype 值,这会导致段错误。