アプリ版:「スタンプのみでお礼する」機能のリリースについて

windows 10
gcc version 5.2.0 (Rev4, Built by MSYS2 project)
の環境で主にアルゴリズムの勉強をしております。
通常は-Wallオプションのみ使用してコンパイルしていました。

あるソースをコンパイルしたところ正常動作しなかったので、いろいろ調べたところ最適化オプション(-On, n=1,2,3,s)を使用すると正常動作する実行ファイルができることが分かりました。

これはgccのバグなのでしょうか?
それとも、最適化オプションは必ず使用するという前提なのでしょうか?

ご教示をお願いします。

質問者からの補足コメント

  • >「正常動作しなかった」というのが、「具体的にどうせ異常でなかったのか?」すら不明なので

    失礼しました。対象ソースは
    https://oshiete.goo.ne.jp/qa/9343826.html のNo.11で提示されているものです。

    正常な動作結果は、当該質問欄に「出力例」として提示されている内容です。
    私の環境で最適化オプションをつけず-Wallのみつけて、コンパイルした結果は下記になります。
    ※関数char** read(void)内で、2箇所のfgets()の前にfflush(stdout);を追加しています。

    $ gcc -Wall test.c
    $ ./a.exe
    比較元:ABCDEFG
    比較対象:AVCEFZG
    A(挿入)G(脱落)
    編集距離:0.429

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/07/18 11:50

A 回答 (4件)

>>これはgccのバグなのでしょうか?


それとも、最適化オプションは必ず使用するという前提なのでしょうか?

状況からして、gccのバグってことのように思えますね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
gccのバグではなかった様でホッとしています。

お礼日時:2016/07/18 18:32

「正常動作しなかった」というのが、「具体的にどうせ異常でなかったのか?」すら不明なので、想像するしか有りませんが、最適化オプションの有無で結果が変わるなら、一般的にはソースのどこかがおかしいのだと思います


本来
・必要な変数初期化をしていない
・バッファ・オーバー・フローも含めて、変数のサイズが不適切
等です
この回答への補足あり
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました。
真っ先にコンパイラのバグを疑ってしまいましたが、確かに仰るとおりでした。
今後は注意するようにします。

お礼日時:2016/07/18 18:31

char** read(void) {


> char buf0[BUF_SIZE];
> char buf1[BUF_SIZE];
> static char* string_pair[2];
fputs("比較元:", stdout);
fgets(buf0, BUF_SIZE, stdin);
fputs("比較対象:", stdout);
fgets(buf1, BUF_SIZE, stdin);
> string_pair[0] = buf0;
> string_pair[1] = buf1;
> return string_pair;
}

>の付いた部分はいいんでしたっけ?
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました。
ただ、ポイントのご提示のみですと、私が独力で原因をみつけるのは難しかったと思います。

お礼日時:2016/07/18 18:30

> char **


> read (void)
> {
>  char buf0[BUF_SIZE];
>  char buf1[BUF_SIZE];
>  static char * string_pair[2];
>
>  fputs ("比較元:", stdout);
>  fgets (buf0, BUF_SIZE, stdin);
>  fputs ("比較対象:", stdout);
>  fgets (buf1, BUF_SIZE, stdin);
>  string_pair[0] = buf0;
>  string_pair[1] = buf1;
>
> return string_pair;
> }

この関数には1つ推奨できない点と1つの間違いがあります。
read はある処理系において予約関数です、この名前は使用すべきでなないです。(←余談です)
問題は、変数 buf0 と buf1 です。この変数は、ローカル変数でスタック上に記憶領域がとられます。よって、この変数はこの関数から戻ったら無効になります。

最適化した場合にうまく動作するのは、恐らくインライン展開のような最適化が行われ、結果的に変数の記憶領域がスタック上に置かれない、もしくはmain () と同一のスタック上に置かれるためと思われます。

確認するには、最適化した時のアセンブラーコードを確認する必要がありますが。
    • good
    • 0
この回答へのお礼

詳しいご説明をありがとうございました。
ご説明いただいた内容に納得です。
なお、buf0とbuf1をstaticにしたところ、最適化しなくても正常動作することを確認しました。
出力したアセンブラーソースを読み取るのは、能力的に無理でしたw

とりあえず自分の使用しているコンパイラのバグでないことが判りホッとしました。
C言語の、この手の間違いは一旦ハマると見つけるのは大変なのでしょうね、簡単に見つけ出せる方法があると良いのですが。

お礼日時:2016/07/18 18:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!