Compiling Guppy-PE extension modules

Sverker Nilsson sverker.is at home.se
Fri Dec 2 05:08:09 EST 2005


"Claudio Grondi" <claudio.gro... at freenet.de> wrote:

> but the problem with sets.c remains:
>
> C:\VisualC++NET2003\Vc7\bin\cl.exe /c /nologo /Ox /MD /W3 /G7 /GX
> /DNDEBUG -IE:\Python24\include -IE:\Python24\PC /Tcsrc/sets/sets.c
> /Fobuild\temp.win32-2.4\Re
> lease\src/sets/sets.obj
> sets.c
> src\sets\sets.c(68) : error C2099: initializer is not a constant
> src\sets\sets.c(68) : warning C4047: 'initializing' : 'PyTypeObject *'
> differs in levels of indirection from 'NyHeapDef_SizeGetter'
> src\sets\sets.c(69) : error C2099: initializer is not a constant
> src\sets\sets.c(69) : warning C4028: formal parameter 1 different from
> declaration
> src\sets\sets.c(70) : error C2099: initializer is not a constant
> src\sets\sets.c(70) : warning C4047: 'initializing' : 'PyTypeObject *'
> differs in levels of indirection from 'int (__cdecl *)(PyObject *)'
> src\sets\sets.c(70) : warning C4028: formal parameter 1 different from
> declaration
> src\sets\sets.c(70) : warning C4028: formal parameter 1 different from
> declaration
> error: command 'E:\VisualC++NET2003\Vc7\bin\cl.exe' failed with exit status
> 2
>
> The MSDN help gives a simple example of code raising compiler error C2099:
> // C2099.c
> int j;
> int *p;
> j = *p;   // C2099, *p is not a constant
>
> The example code shows to me, that there is a good reason  compiler
> generates an error in that case.
> j = *p; leads to an assignment of a random (and therefore maybe leading to a
> non deterministic crash of the executable during runtime) value to a
> variable, what can't be intended in a deterministic program.

This is confusing, because the problem of the example code is not that
*p is not constant but rather that p is undefined aka uninitialized.

Humm..

Compiling the following program:

#include <stdio.h>
int main(void) {
    int j;
    int *p;
    j = *p;
    printf("%d\n",j); /* Makes sure the optimizer doesnt remove the
previous code */
    return 0;
}

with

gcc -O3 -Wall main.c

gives me:

main.c: In function `main':
main.c:4: warning: `p' might be used uninitialized in this function

(And I get a Segmentation fault from running the executable.)

The -Wall flag enables, umm, as it is saying 'all' warnings
though perhaps not really all, and this flag + others is used
by the compilation command generated by distutils when
building with gcc.

I don't see any warnings when building Guppy.

So there should be no case (as easy to discover) as that in the
example.

So I am confused.

I was beginning to wonder if we were talking about the same file/code.
This code is from sets.c lines 66..71

static NyHeapDef nysets_heapdefs[] = {
    {0, &NyMutBitSet_Type, (NyHeapDef_SizeGetter) mutbitset_indisize},
    {0, &NyCplBitSet_Type, 0, cplbitset_traverse},
    {0, &NyNodeSet_Type, nodeset_indisize,  nodeset_traverse,
nodeset_relate},
    {0}
};

I can't see how there can be problems with initializers not being
constants here unless, perhaps if the compiler has a problem since
those functions (mutbitset_indisize etc) and the types that are used
as initializers are in separately compiled files. But gcc -Wall
-pedantic handles it and doesn't warn. I don't have the ANSI standard
but I have the 2nd edition of The C Programming Language by Kernighan
and Ritchie (1988, 'Based on Draft-Proposed ANSI C'), and it is saying

- quotes -

A8.7 Initialization
...

All the expressions in the initializer for a static object or array
must be constant expressions as described in &A7.19
...

A7.19 Constant Expressions

Syntactically, a constant expression is an expression restricted to a
subset of operators...
...

More latitude is permitted for the constant expressions of
initializers...  Initializers must evaluate either to a constant or to
the address of a previously declared external or static object plus or
minus a constant.

- end quotes -

If this means the Microsoft .NET compiler is perhaps not compliant
with standard/ANSI C then since it was from 2003 maybe they have come
out with an update now that fixes this problem. I know, it may not
really help you because it may cost money, I don't know how long one
can get updates without paying. Alternatively, I think GCC is
available for Microsoft Windows although I don't know how it handles
the .NET architecture.

For me, if the case is according to hypothesis, and I would have to
rewrite the code to put all the functions and type objects in a single
file, it would be.. umm.. painful. (Though I could get around
it with #include trickery but it is still painful.)

Sverker




More information about the Python-list mailing list