On Monday 20 March 2017, Andi Vajda wrote: > On Mon, 20 Mar 2017, Ruediger Meier wrote:
> >> Someone with access to Windows, please help test/fix/finish > >> support for Python 3 on Windows, both with the MSVC and Mingw > >> compilers. I have no access to Windows anymore. > > > > I know already about one MSVC issue: > > https://github.com/rudimeier/jcc/issues/1 > > > > probably fixed by > > https://github.com/rudimeier/jcc/commit/764ed0dc1f77c68e4a6998688d2 > >e8340704fd237 (But this fix is also not tested yet.) > > I changed strhash to use Py_hash_t. This is now wrong and I could reproduce a segfault on OSX 10.11, xcode 8. The buffersize "hexdig + 1" has to match the type we are printing. We can't calculate the size from Py_hash_t but print ulong. Most safely and without precision loss we could do it like the patch below. Notes: 1. "static const" was required to actually fix MSVC's VLA issue. 2. The macro PRIxMAX is the same as "%jx". I've choosed the macro because it should be compatible to Visual Studio >=2013 while "%jx" would need Visual Studio >=2015. Moreover when using incompatible compilers the macro would give an error at compile time rather than "%jx" would just crash at runtime. -------- diff --git a/jcc3/sources/jcc.cpp b/jcc3/sources/jcc.cpp index 8c12f00..90baa8b 100644 --- a/jcc3/sources/jcc.cpp +++ b/jcc3/sources/jcc.cpp @@ -15,6 +15,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <inttypes.h> #include <jni.h> #ifdef linux @@ -194,11 +195,11 @@ static PyObject *t_jccenv_isShared(PyObject *self) static PyObject *t_jccenv_strhash(PyObject *self, PyObject *arg) { - Py_hash_t hash = PyObject_Hash(arg); - size_t hexdig = sizeof(Py_hash_t) * 2; + uintmax_t hash = (uintmax_t) PyObject_Hash(arg); + static const size_t hexdig = sizeof(hash) * 2; char buffer[hexdig + 1]; - sprintf(buffer, "%0*lx", (int) hexdig, (unsigned long) hash); + sprintf(buffer, "%0*"PRIxMAX, (int) hexdig, hash); return PyUnicode_FromStringAndSize(buffer, hexdig); } -------------- cu, Rudi