www.digitalmars.com         C & C++   DMDScript  

c++ - [bug?] compiler option -a4 causes abnormal program termination on

reply Anton Sekeris <no.spam inter.nl.net> writes:
Walter,

A bit of my code recently started causing grief. The minimum 
reproduction I eventually whittled it down to looks like this:

	#include <sstream>

	void f() {
	  std::stringstream str;
	}

	#include <iostream>
	
	int main () {
	  return 0;
	}

If you compile this with 'dmc test.cpp', all is well. Compile it with 
'dmc test.cpp -a4' and you get abnormal program terminations. The 
additional plethora of command line options I normally have make no 
difference, the alignment option is the culprit it seems.

I hadn't compiled this code a while and am not sure when it last worked 
(or even if the -a4 was recently added in my makefiles), but I am 
currently updated to the latest beta (8.49).

I don't particularly require struct alignment, so for me its just 
removing -a4 and I'm okay for now.

Kind regards,
Anton Sekeris.
Jun 02 2006
parent reply Walter Bright <newshound digitalmars.com> writes:
Anton Sekeris wrote:
 Walter,
 
 A bit of my code recently started causing grief. The minimum 
 reproduction I eventually whittled it down to looks like this:
 
     #include <sstream>
 
     void f() {
       std::stringstream str;
     }
 
     #include <iostream>
     
     int main () {
       return 0;
     }
 
 If you compile this with 'dmc test.cpp', all is well. Compile it with 
 'dmc test.cpp -a4' and you get abnormal program terminations. The 
 additional plethora of command line options I normally have make no 
 difference, the alignment option is the culprit it seems.
 
 I hadn't compiled this code a while and am not sure when it last worked 
 (or even if the -a4 was recently added in my makefiles), but I am 
 currently updated to the latest beta (8.49).
 
 I don't particularly require struct alignment, so for me its just 
 removing -a4 and I'm okay for now.

What is likely happening is you're linking with iostream, which is compiled with default alignment. Compiling the app with -a4 will cause the class members to not line up with the object code in the library. Generally, it's a very bad idea to use the -a switch. Use the #pragma align around individual structs that need special alignment.
Jun 02 2006
parent reply Anton Sekeris <no.spam inter.nl.net> writes:
Walter Bright wrote:
 Anton Sekeris wrote:
 Walter,

 A bit of my code recently started causing grief. The minimum 
 reproduction I eventually whittled it down to looks like this:

     #include <sstream>

     void f() {
       std::stringstream str;
     }

     #include <iostream>
         int main () {
       return 0;
     }

 If you compile this with 'dmc test.cpp', all is well. Compile it with 
 'dmc test.cpp -a4' and you get abnormal program terminations. The 
 additional plethora of command line options I normally have make no 
 difference, the alignment option is the culprit it seems.

 I hadn't compiled this code a while and am not sure when it last 
 worked (or even if the -a4 was recently added in my makefiles), but I 
 am currently updated to the latest beta (8.49).

 I don't particularly require struct alignment, so for me its just 
 removing -a4 and I'm okay for now.

What is likely happening is you're linking with iostream, which is compiled with default alignment. Compiling the app with -a4 will cause the class members to not line up with the object code in the library. Generally, it's a very bad idea to use the -a switch. Use the #pragma align around individual structs that need special alignment.

Noted, the -a switch is out the window here, thanks. I figured out where something went wrong though. Some of our makefiles were generated by ultraedit/uemake. We recently switched to uestudio. Both applications support sc/dmc, which is cool. It seems uestudio by defaults adds a -a directive to the makefiles. I'll let the author of that program know that he may need to do something with this.
Jun 03 2006
parent Walter Bright <newshound digitalmars.com> writes:
Anton Sekeris wrote:
 Noted, the -a switch is out the window here, thanks. I figured out where 
 something went wrong though. Some of our makefiles were generated by 
 ultraedit/uemake. We recently switched to uestudio. Both applications 
 support sc/dmc, which is cool. It seems uestudio by defaults adds a -a 
 directive to the makefiles. I'll let the author of that program know 
 that he may need to do something with this.

It is common for makefiles to include lots of switches for which the reason they are there has been lost or is no longer relevant. They accumulate like rust <g>.
Jun 03 2006