Python C API で非常に奇妙な問題が発生しています。PyObject 'device' メンバーを含むグローバル スコープの構造体 'dcon' があります。
static status_t get_mac_addr(uint8_t const ** addr,
size_t * const size){
static uint8_t device_mac_addr[6] = {0};
*addr = device_mac_addr;
*size = sizeof device_mac_addr;
if(PyObject_HasAttrString(dcon.device, "mac_address") == 1){
...
}
return 0;
}
「mac_address」属性が存在する場合はいつでも、コードは正常に実行されるようです。奇妙なことに、「mac_address」が定義済みの属性ではない場合、segault ( Segmentation fault (core dumped)
) が発生します。segfault が発生したときのバックトレースは次のとおりです。
(gdb) bt
#0 0x00000000004ca607 in PyErr_Restore ()
#1 0x00000000004aa29f in PyErr_Format ()
#2 0x000000000049e6ee in _PyObject_GenericGetAttrWithDict ()
#3 0x0000000000486387 in PyObject_GetAttrString ()
#4 0x00000000004ea7d7 in PyObject_HasAttrString ()
#5 0x00007ffff4f2056d in get_mac_addr (size=0x7ffff4f1cd28, addr=<optimized out>) at config.c:165
私は Python C API の初心者です。私の最初の考えは、参照カウントで何か間違ったことをしているということですが、頭を包むことができないようです。