• ベストアンサー

g++ だと正常動作 ・ bcc32 だと異常終了

cygwin上で g++ でコンパイルすると正常に動作し、 windows上で bcc32 でコンパイルすると正常に動作しない(おそらく不正メモリアクセスで強制終了してしまう)という現象で困っています。 g++, でも bcc32 でもコンパイルは通ります。 プログラムは長いのでこちらに載せるのは困難ですが、言語がC++のコンソールアプリケーションで、 windows の APIは使っていません。 デバッグを行った結果、停止してしまっているのは与えてやるデータによってまちまちですが、fopen()の内部であったり、rename()であったり、string型の a, b, c, d において、a+b+c+d と連結操作を行った場合などです。ちなみにfopen()やrename()に与える引数は, ちゃんとしたファイルへのパスとなっていることも確認しています。 http://www.nabble.com/-ruby-dev:28230-bcc32-memory-manager-t942132.html にあるように、bcc はメモリ関連のバグがあるようですが、このケースもコンパイラのバグと考えてよいのでしょうか? また、上記URLでは usebormm.lib をリンクすると動作するとありますが、 無償版を使っているためこのファイルが見当たりません。 どう対処してやればよいでしょう。 ソースを載せられないので、わかりにくい質問かとは思いますが、よろしくお願いします。

  • arcsin
  • お礼率46% (194/417)

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

再現コードがないと、なんとも言えないのは確かです。 まず、問題を切り分けるために、 ・(現状の環境なりを保存した) ・内部処理を少しずつ削っていく ・どこがなくなった時点で現象が出なくなるのか確認 などを行ってみてください。 無償版 bcc のメモリ管理が甘いのは、割りと有名な話なのではないかと思いますが(以前別の掲示板でも見たことあり)、 コンパイラ/ライブラリのバグよりは、おそらくご自身のコードのバグではないかと思います。 # もしくは、ご自身のコードが標準仕様に準拠しておらず、 # 特定のコンパイラに依存してるとか。 # (マルチ対応前提ならこれもバグですが)

arcsin
質問者

お礼

ご回答ありがとうございます。 原因はやはりご指摘の通り自分のミスでした。 #1さんのお礼欄にも書いたのですが、かなり初歩的なミスでした。 >・(現状の環境なりを保存した) >・内部処理を少しずつ削っていく >・どこがなくなった時点で現象が出なくなるのか確認 の実践までは至らなかったのですが、今後、こちらの方法を参考にさせていただきます。 お騒がせいたしました。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> ソースを載せられないので、わかりにくい質問かとは思いますが、よろしくお願いします。 これだけではどうしようもありません。 プログラム全体は必要ないので、現象を再現可能な最低限の抜粋だけでも載せていただかないと... > このケースもコンパイラのバグと考えてよいのでしょうか? メモリ関連のバグというのは、ランタイムライブラリの話であって、コンパイラ自体ではありません。 なお、当て推量に過ぎませんが、たぶん質問者さんのプログラムのバグだと思います。

arcsin
質問者

お礼

> たぶん質問者さんのプログラムのバグ まさにその通りでした。 プログラミングのバグにおいて、まずは自分を疑えとはまさにこのことですね(苦笑) 再現性がないバグだったのと、cygwinでは動いた点で自分のせいではない!と高をくくっていました。 デバッグを繰り返した結果、原因は、プログラム本体とは遠く離れた、自前のハッシュテーブルで、キー用のバッファをmallocで得る際に、 if((this->key = (char *)malloc( sizeof(char) * strlen(key))) == NULL){  fprintf(stderr, "memory is busy.");  exit(1); } strcpy(this->key, key); とstrlenに+1を忘れ、char *key のnull文字のスペースを確保していなかったという初歩的なミスでした。 gccでうまくいっていたのは、幸にも(不幸にも)文字列の後ろがnull文字で埋まっていたからで、bcc32でコンパイルしたプログラムはnull文字で埋まっていなかった場合に強制終了してしまっていたようです。 なので、再現性のないエラーだったんだと思います。 お騒がせいたしました。

関連するQ&A

  • g77でコンパイルできない

    cygwinをgcc関連のパッケージだけインストールし、パスも通したのですが、command prompt 上においてg77でコンパイルしようとしても、 'g77'は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません とでてしまい、コンパイルできません。 パスを通したc:\cygwin\bin の中を見ると、g77.exeはあるのですが・・・ 初心者なので、アドバイスよろしくお願い致します

  • cygwinのgccで正常にコンパイルできない。

    cygwinのgccで正常にコンパイルできない。 cygwinのvimで、以下のプログラムを書きました。 ------------------------------------------------------------- #include <stdio.h> int main(void) { int no; printf("Please input something:"); scanf("%d", &no); printf("It is %d that you input it:\n", no); return (0); } ------------------------------------------------------------- それからgccでコンパイルしました。 コマンドは以下の通りです。 $ gcc test.c すると以下のエラーが出ました。 test.c:10:9: warning: unknown escape sequence: '\033' このようにコンパイルできない状態です。 どのようにすると正常にコンパイルできるようになるでしょうか?

  • bcc55のエラー(cox32.obj)

    コンパイルすると、いつも Fatal:ファイルCOX32.OBJが開けません と言うエラーが出てしまいます。 bcc55のbinフォルダーにbcc32.cfgというファイルを作り、中身に -I"c:\Borland\Bcc55\include" -L"c:\Borland\Bcc55\lib" ilink32.cfgには -L"c:\Borland\Bcc55\lib" となっています。 初歩的なことかもしれませんがよろしくお願いします。

  • 正常に動作しなくなり困っています。

    何度も勝手に再起動したり、正常に起動しなかったり、重大なエラーが発生したためWindowsは正常に動作しなくなりました。というメッセージがでたりします。 トラブル診断をしたところ エラーコード:00220003 メモリに機械的なトラブルの可能性がありまあす。 とでました。 何か対処法があるのか、修理が必要なのかどうかわからず質問しました。

  • BCCでコンパイルする際に静的リンク指定が無視される

    GLUTを使用したCプログラムをBCCでコンパイルしたのですが、実行ファイルが生成されてもライブラリが静的リンクされません。 コンパイルオプションとして、 > bcc32 *.c glut32.lib glu32.lib winmm.lib とlibファイル名のリストを与えているのですが…… 当然ながら、bcc32.cfgとilink32.cfgの環境変数でlibファイルへのパスは与えてあります。

  • bccコンパイラ実行エラー? 環境エラー?

    Cのファイルをコンパイルをかけると Fatal: ファイル C・C.OBJが開けません。 というエラーがでてしまいます。 これはどういったエラーなのでしょうか? 実行環境の設定エラー? コードのエラー? 分からないんで分かる方よろしくお願いします。 bcc55はディレクトリC:じゃなく、D:にインストールしてあります。実行環境の設定も本に書いてあるとおりしてありますが、なかなか上手にいきません。 cfgファイル、batファイルの設定です。 この2つのファイルのエラーかどうかもわかりません。 よろしくお願いします。

  • ネスケ4.xメールBCCで宛名誤表示

    ネスケ4.0、4.5を使っています。 メールで、BCC送信をすると、宛名が、どの送信先にも toの宛名になって送られてしまいます。 送信そのものはうまくいっているんですが、バグなんでしょうか? to:A-san BCC:B-san BCC:C-san BCC:D-san ↓ A-san no PC from:xxxx to:A-san B-san no PC from:xxxx to:A-san C-san no PC from:xxxx to:A-san D-san no PC from:xxxx to:A-san

  • bcc32でSJIS以外のヘッダファイルが使えない

    こんにちは。 コマンドプロンプト上で、Borland C++ Compiler 5.5 のbcc32コマンドを使い、エンコーディングがShift_JIS以外、例えばUTF-8のヘッダファイルをインクルードしたソースファイルをコンパイルしようとすると、上手くいきません。 ヘッダファイルがShift_JISなら、それをインクルードしているソースがShift_JISでなくても、コンパイルできました。 bcc32をコンパイルコマンドとして扱う場合は、Shift_JISのヘッダファイルしか使えないのでしょうか? 以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

  • BCCでのFooty2の使用

    Footy2をBCCで利用したいのですが、なぜか正しくコントロールが表示されません。 implib -c Footy2.lib Footy2.dllでlibファイルを生成してリンクもしてあり、dllも実行ファイルと同じフォルダにおいてあります。 コンパイルエラーは出ていないのですが、実行時にコントロールが表示されていません。 (あと、ifでFOOTY2ERR_*が発生していないかを確認したのですが、発生していないみたいです。) マニュアルを読んだ限りではWM_CREATEが送信されて来た時にFooty2Createを親ウィンドウに対して発行するみたいですが、Footy2Createだけでなく他の関数も発行しなければならないのでしょうか。 分かる方がいれば、回答をお願いします。 OS:WindowsMe BCC:5.5.1 + BCC Developer Footy:2.013

  • BCC Developerについて。

    Borland C++ Compiler、BCC Developerを使って #include <stdio.h> void main(){ printf("Hello C world.\n"); } をメイクしてみたのですが、 インクルードファイル 'stdio.h' をオープンできない 、と表示されコンパイルできませんでした。 環境設定は、コンパイラにbbc32.exeを指定すればいいだけなんでしょうか?よろしくお願いします。