#define PY_SSIZE_T_CLEAN #include // should error for bad input (not segfault) static PyObject *error_if_not_utf8(PyObject *dummy, PyObject *args) { Py_ssize_t size; PyObject *str; int ok = PyArg_ParseTuple(args, "O", &str); if (!ok) return NULL; const char* result = PyUnicode_AsUTF8AndSize(str, &size); if (result == NULL) return NULL; return str; } static PyMethodDef TestMethods[] = { {"error_if_not_utf8", error_if_not_utf8, METH_VARARGS, "Check if surrogates cause a segfault."}, {NULL, NULL, 0, NULL}}; static struct PyModuleDef testmodule = {PyModuleDef_HEAD_INIT, "libtest", // Name of module NULL, // Documentation -1, // keep state in global variables TestMethods}; PyMODINIT_FUNC PyInit_libtest(void) { return PyModule_Create(&testmodule); }