Octavio, How would you propose addressing this issue? I split my monster patch file and reduced it to 31437 lines (roughly 60,000 lines of the patch turned out to be gettext data that didn't get erased in a make clean) to just insert "(char *)" on the 6727 lines of code producing this warning (yes, I counted). String constants are a fact of life and making everything modifiable is impractical. Just by masking the Char * warnings, I found a handful of compiler warnings that pointed to real problems(I will be submitting those patches soon).
Regards, Paul On Wed, 2011-09-07 at 18:12 -0700, Octavio Alvarez wrote: > On Wed, 07 Sep 2011 17:08:08 -0700, Paul Taggart <[email protected]> > wrote: > >> It is wrong. You have to use 'const char*' in places where you use > >> these strings. > >> This enables compiler to store only one copy of identical texts and > >> identifie places where someone tries to modify string constant (it is > >> a bug). I have done this in my branch. > > > > No, this is not a bug. the called functions are looking for a pointer to > > a string (char *). By just providing a quoted string, you are providing > > the function with the entire string, not just the pointer. The compiler > > recognizes this discrepancy and automatically creates the pointer > > By providing a string literal you are providing the function with a > pointer to read-only data. If you ever *ever* try to modify any > character in this region, you will get a segmentation fault. > > > but > > unlike gcc which has the default option -Wno-write-strings, g++ defaults > > to -Wwrite-strings which issues a warning message : "warning: deprecated > > conversion from string constant to ‘char*’" for each occurrence. > > The easy fix would be to add -Wno-write-strings to CXXFLAGS in all of the > > Makefiles (can be set in configure.in) but I'm a bit of a purest who > > believes its better to fix the problem than to mask it. > > I think we all agree on that: -Wno-write-strings is just masking the > problem. However, adding (char *) to deprecated conversions from > (const char *) is actually worse, as it will not only mask the problem but > will also allow some functions to modify potentially immutable strings, > and thus make Cinelerra more crash-prone. > > When you code something like this: > > char * x = "abcde"; > x[3] = '4'; > > g++ warns about the mistake. If you just shut it up by casting it to > (char *) like this: > > char * x = (char *) "abcde"; > x[3] = '4'; > > The compiler will not warn you and your program will still crash! > This is bad! > > The correct fix (in this case only) is actually: > > char * x = strdup("abcde"); > x[3] = '4'; > > But you can not abuse this or you will end up wasting memory badly. > >
