On Wed, Jan 28, 2004 at 12:57:41PM -0500, Gene C. wrote:
Do the cast warning messages I see when compiling previously 32 bit applications on the amd64 really mean all that much?
It depends. They range from "hard to avoid noise" to "indicators of killer bugs". You can tell only on a case-by-case basis.
Now I understand that you do not want to store an 8 byte pointer into a 4 byte variable or get a 8 byte pointer from a 4 byte variable. If the code underlying the calls does the "right thing" ...
If the code does really then "right thing" then you do not have a warning; but sometimes it may be difficult to do that without extensive rewrites.
That is, is it worth the pain to go fix things so that the cast messages do not occur?
Usually yes, in my experience; to an extent. It helps immensly to catch remaining bugs if a code is clean. Very often doing that just simply fixes nasty bugs.
Some "fun" things to trip you include a global variable for which some library provided only an 'int' storage but you are writing 'long' there. You will crash, or not, in an unrelated place depending on what and when you overwrote in "other" four bytes. Or things which change size in a way hard to notice across a function call boundary, or places which rely implicitely and silently on a sign extension which will not work the same in 32 and 64 bits. Or ... If you are using C++ then opportunities for various size abuses, and difficulties of finding these, go up exponentially.
I went to some effort to clean up nessus so building it had no cast messages. But was it worth it.
Here you are. :-)
For example, you have a function which extracts something from an array/table and may return a pointer sometimes and other times an integer.
Then really union should have been used; but sources of X, for example, are chock-full of such junk and that's life.
Michal