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
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
@@ -15,6 +15,7 @@
@@ -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);