[Suzaku:01013] mb-gcc で -O0 を指定すると構造体の初期化に失敗する

k800073 email@hidden
2007年 8月 27日 (月) 17:57:54 JST


 昭和電線の藤沢と申します。
 mb-gccの最適化オプションで,-O0を指定すると,構造体の初期化が失敗するようです。
 ソースファイルはこれだけです。
----ここから
#include <stdio.h>
#include <stdlib.h>

static void getip(void);
static void err_exit(char *p, int err_no);

int main(int argc, char *argv[])
{
	getip();
	return 0;
}

static void err_exit(char *p, int err_no)
{
	printf("ERROR! %s\n",p);
	exit(err_no);
}

	enum ip_index_enum {IP, BCAST, MASK, GW};

	struct ip_str_struct{
		unsigned int ip;
		char *str;
	};

static void getip(void)
{
	
	enum ip_index_enum ip_index;
	
	struct ip_str_struct ip_str_table[] = {
		{0,"inet addr"},
		{0,"Bcast"},
		{0,"Mask"},
		{0,"default"},
	};

	
	for(ip_index = IP; ip_index <= GW; ip_index++){
		printf("%s\n",ip_str_table[ip_index].str);
	}
}
----ここまで
 mb-uclinux-gdbを使って,デバッグしたかったので,Makefileに -O0 を追加してコンパイルしたあと、suzakuの/var/tmpに転送して,実行したところ(ファイル名は,ngです),

# ./ng
inet addr
Bcast
ERROR! %s

default
#

となりました。"Mask"のポインタが,err_exitのprintf文の中の文字列を指しているようです。
 Makefileに-O0を追加しないと,-Osが設定されて,このときの結果は,

# ./ng
inet addr
Bcast
Mask
default
#

で、正常でした。開発ツールは,microblaze-elf-tools-20060213.tar.gzです。
コンパイラにバグがあるのでしょうか? それとも,プログラムの書き方が悪いのでしょうか。ちなみに,err_exitをgetipの後に持ってくると,正常に構造体が初期設定されました。




suzaku メーリングリストの案内