Patch for new gnu compiler warning: deprecated conversion from
string constant to 'char*'
Kevin Glynn
kevin.glynn at gmail.com
Sun Apr 27 17:48:41 CEST 2008
And now with the promised files :)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mozart.hh
Type: application/octet-stream
Size: 22 bytes
Desc: not available
Url : http://lists.gforge.info.ucl.ac.be/pipermail/mozart-hackers/attachments/20080427/4064342c/mozart.obj
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mozart.cc
Type: application/octet-stream
Size: 89 bytes
Desc: not available
Url : http://lists.gforge.info.ucl.ac.be/pipermail/mozart-hackers/attachments/20080427/4064342c/mozart-0001.obj
-------------- next part --------------
A non-text attachment was scrubbed...
Name: hello.cc
Type: application/octet-stream
Size: 94 bytes
Desc: not available
Url : http://lists.gforge.info.ucl.ac.be/pipermail/mozart-hackers/attachments/20080427/4064342c/hello.obj
-------------- next part --------------
keving writes:
>
> Raphael Collet writes:
> > Kevin,
> >
> > Thanks for doing that dirty job. I had a look at the changes you
> > propose, and I have a few remarks.
> >
>
> Thanks for looking through it.
>
> > Kevin Glynn wrote:
> > > Unfortunately, the fix isn't as straightforward as we would like. For
> > > uses internal to the emulator we just change variables declared 'char
> > > *'to be 'const char *'. This has the same semantics and just adds more
> > > compiler checking. However, there are interfaces defined in mozart.h
> > > and mozart_cpi.hh (I believe these are the only header files that
> > > external native functors should compile against) that have declared
> > > 'char *' arguments that we pass string constants too. If we change
> > > them to be 'const char *' then pre-compiled functors will fail to link
> > > to them (shame! why won't the linker allow something declared 'char *'
> > > to link to something declared 'const char *'?).
> >
> > I don't understand the above explanation. Do you have a reference on
> > that specific issue? In my understanding, making a function take a
> > "const char*" instead of a "char*" should not change anything in the
> > binary. It is perfectly legal to assign a "char*" to a "const char*";
> > the const modifier simply enforces that the latter cannot be used to
> > modify the string. Note that the "conversion" is a no-op.
> >
> > char* p = "..."; // the string is modifiable through *p
> > const char* q = p; // one cannot use *q to modify the string
> >
> > However, the opposite is illegal. Assigning a "const char*" to a
> > "char*" gives you write access to the string; this violates the const-
> > correctness of the program.
> >
> > If my understanding is correct, we should be able to modify most
> > functions in the Mozart API without causing compilation/linking issues.
> >
>
> The problem is the linker. Try it with the attached files.
>
> @twiglet:tmp 4Q> g++ -c mozart.cc
> @twiglet:tmp 4Q> g++ -c hello.cc
> hello.cc: In function ?int main()?:
> hello.cc:6: warning: deprecated conversion from string constant to ?char*?
> @twiglet:tmp 4Q> g++ -o hello mozart.o hello.o
> @twiglet:tmp 4Q> ./hello
>
> Now change the signature of myout in mozart.hh and mozart.cc to be
> const char * and try:
>
> @twiglet:tmp 4Q> vi mozart.hh
> @twiglet:tmp 4Q> vi mozart.cc
> @twiglet:tmp 4Q> g++ -c mozart.cc
> @twiglet:tmp 4Q> g++ -o hello mozart.o hello.o
> hello.o: In function `main':
> hello.cc:(.text+0x192): undefined reference to `myout(char*)'
> collect2: ld returned 1 exit status
> (1)@twiglet:tmp 4Q>
>
> oh dear, that was the reason for my shame comment above.
>
> > > *** mozart.h
> > >
> > > _FUNDECL(OZ_Term ,OZ_mkTupleC,(char *label,int arity,...));
> > > +_FUNDECL(OZ_Term ,OZ__mkTupleCConstLabel,(const char *label,int
> > > arity,...));
> > >
> > > Added new OZ__mkTupleCConstLabel function, a copy of OZ__mkTupleC with
> > > const char* label.
> >
> > Ouch! We should avoid duplicating functions. OZ_mkTupleC() can be
> > modified to take a "const char*" instead of a "char*", because its
> > implementation does not modify the string. Calls to OZ_mkTupleC()
> > should not be affected in practice.
> >
> > The same holds for OZ_typeError(): it calls oz_typeError(), which is a
> > macro that calls oz_typeErrorInternal(), which takes a "const char*"!
> > Putting a const OZ_typeError's signature is only making justice to its
> > implementation...
> >
> > Idem for OZ_raiseC(), etc. All these functions do not modify their
> > char* parameters.
> >
>
> The reason I duplicate these is because of the linker problem above.
> I assume that users may have code compiled against the previous
> signatures of these functions and I assume we don't want to break
> these until a new, major mozart release.
>
> >
> > I propose to take a closer look at this with Boriss & Yves tomorrow. I
> > would be very happy if we can propose an alternative patch that does not
> > duplicate functions. Too many of them are *already* duplicated!
> >
>
> I would also be very happy if you can find a better solution :)
>
> k
>
>
>
More information about the mozart-hackers
mailing list