gccでセグメンテーションフォルトが起きます

このQ&Aのポイント
  • gccでセグメンテーションフォルトが起きています。STLのコードで問題が起きているようです。
  • gdbでデバッグした結果、STLのコードの中でセグメンテーションフォルトが発生しています。
  • 質問者は何かわかる方にアドバイスを求めています。
回答を見る
  • ベストアンサー

セグメンテーションフォルトが起きます。

gccでセグメンテーションフォルトが起きます。 gdbでデバッグしたのですがどうもSTLのコードでセグメンテーションフォルトがおきているようなのです。 そんなことってあるのでしょうか。 何かわかる方アドバイスお願いします。 以下はgdbで実行した結果です。 Program received signal SIGSEGV, Segmentation fault. CNFLiteral::CNFLiteral (this=0x16eec0, cnf=@0x16ef80) at /usr/include/c++/3.3.3/bits/stl_iterator.h:642 642 base() const { return _M_current; }

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

STL内部でセグメンテーションフォルトがおきたとしても 恐らく原因は外部にあるでしょう。 たとえばメモリ破壊を行っている。 int a[2]; std::vector v; for( int i = 0 ; i <= 2 ; i++ ) a[i] = 0; この後にvにアクセスにいった等が考えられます。 もちろんSTLでも std::vector v; v.resize(10)としときながら v[100]にアクセスしても問題です。

nagata20000
質問者

お礼

回答ありがとうございます。 メモリ破壊は起こしていないつもりなのですが、、、 ちなみにCNFLiteral::CNFLiteralは次のような ソースなのですが何かわかることはありますでしょうか。 class CNFLiteral { private: map<short,vector<Clause> > table; public: CNFLiteral(CNF &cnf) { CNF::iterator p; CNF::iterator e=cnf.end(); for(p=cnf.begin();p!=e;++p) { Clause::iterator l; for(l=(*p).first.begin();l!=(*p).first.end();++l) { table[*l].push_back((*p).first); } } } …

nagata20000
質問者

補足

解決しました。 おっしゃるとおり確保していないメモリに アクセスしていました。 失礼しました。

関連するQ&A

  • Objective-cでNSLogが使えない

    Objective-cのNSLogで標準出力に出力したいのですが、 どうにもうまくいきません。 ソース $ cat oshiete.m #import <Foundation/Foundation.h> int main(int argc,const char * argv[]) {   NSLog(@"Hello World!");   return 0; } コンパイル $ clang -lgnustep-base -lobjc -I/usr/include/GNUstep -I/usr/lib/gcc/i486-linux-gnu/4.4/include -g -Wall oshiete.m -o oshiete 実行 $ ./oshiete Segmentation fault OSはUbuntu 10.04.1 LTSで、コンパイラはclangを使用しています。 gdbでステップ実行すると、NSLog実行時に以下のエラーが得られました。 Program received signal SIGSEGV, Segmentation fault. 0xb7c52e46 in __objc_get_forward_imp () from /usr/lib/libobjc.so.2 Objective-cが良く理解できてないのですが、Gnustepライブラリとリンクして 動作しているはずなので、そこの動きがよくない?? コンパイルでのエラーや警告は0件です。 自力での解決が困難です。 どなたかお力添えをお願いいたします。

  • 構造体へのポインタの動的確保について

    構造体へのポインタを動的確保しようとmalloc関数を使用すると segmentation faultが起きます。 typedef struct cell{ char *word; int count; struct cell *next; }node_t; という構造体で node_t *ptr=(node_t*)malloc(sizeof(node_t)*num); という風に動的確保しようとするとsegmentation faultが起きました。 gdbを使って調べると Starting program: /home/programII/week05/a.out file1 file2 Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7b4ce36 in ?? () from /lib/x86_64-linux-gnu/libc.so.6 というメッセージが返ってきます。 これはライブラリとのリンクが正しく行われていないということでしょうか? しかし、ポインタの動的確保以外でmalloc関数を使用すると 正常に動作するのでライブラリ自体が無いわけではないようです。 ptr[2]といった風にポインタを参照したいのですが上手くいきません。 よろしくお願いします。

  • Cygwinのデバッグがうまくできません。

    学校の課題でデバッグを使ってプログラムのエラーを取り除くものが出されました。 Cygwinを使ってデバッグ(gdb)をしたのですが、エラーの場所が表示されません。 プログラムは1つ目のデータと2つ目のデータを比較するプログラムです。(スペルチェッカー) dic1とtext1には両方xという文字が入っています。 (gdb) run dic1 text1 Starting program: /home/*****/a.exe dic1 text1 [New Thread 16764.0x4180] [New Thread 16764.0x43b0] Program received signal SIGSEGV, Segmentation fault. 0x6113a4b7 in getc () from /usr/bin/cygwin1.dll 何行目が違うのか出てきません。(学校ではCygwinを使ってやったわけではないのですが、行番号が出てきました。) 原因がわかりません。 詳しい方よろしくお願いします。

  • netstatコマンドでセグメンテーション違反

    Linux初心者です。 くだらない質問かどうかさえもわかりませんが、困っています。 netstatコマンドを実行すると「セグメンテーション違反です」とだけが結果として表示されてしまい、 必要な情報が何も出力されません。 ---こんな感じ----------------------- [root@centos ~]# netstat セグメンテーション違反です ------------------------------------ とりあえず少しくらいは頑張ろうと、gdbでcore dumpを取ってみました。 (これが正しい原因調査方法かはわかっていません。) そして出てきた情報がこんなのです。 ---こんな感じ----------------------- [root@centos ~]# gdb netstat -c core.3166 GNU gdb Red Hat Linux (6.5-25.el5rh) Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu"... (no debugging symbols found) Using host libthread_db library "/lib/libthread_db.so.1". warning: Can't read pathname for load map: 入力/出力エラーです. Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done. Loaded symbols for /lib/ld-linux.so.2 (no debugging symbols found) Core was generated by `netstat'. Program terminated with signal 11, Segmentation fault. #0 0x00923ac0 in strcpy () from /lib/libc.so.6 (gdb) bt #0 0x00923ac0 in strcpy () from /lib/libc.so.6 #1 0x08051274 in strcpy () #2 0x081707a8 in ?? () #3 0x00000000 in ?? () ------------------------------------ 意味も分からず悪戦苦闘した結果、コイツ(/lib/libc.so.6)が悪さをしているのか?と 思ってきましたが、そもそも何者か?などがわからず、 viで開いてみてもなんだかバイナリファイルでギブアップでした。 どなたか、原因・解決方法をご存知の方がいらっしゃいましたらご教授ください。 ディストリビューションは CentOS release 5 (Final) ちなみに、そもそもの目的はipablesの設定をしようと思って、 内部ネットワークアドレス取得を行おうとしたところで思った出力が できなかったのが事の発端です。。。 ---iptabels----------------------- [root@centos ~]# vi iptables.sh #!/bin/bash #---------------------------------------# # 設定開始 # #---------------------------------------# # インタフェース名定義 LAN=eth0 #---------------------------------------# # 設定終了 # #---------------------------------------# # 内部ネットワークのネットマスク取得 LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` # 内部ネットワークアドレス取得 LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '` ★★★ここ★★★ LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK

  • セグメンテーション・フォールト

    UNIXで、CよりOracleのSQL*Loaderを使用しています。 CSVファイル->Oracleのテーブル でデータを挿入する際に、テーブルのカラムサイズが 足りずにエラーが発生し、最大エラー件数を超えたので 処理がエラーで終了しました。 その際に、 セグメンテーション・フォールト(coredump) というメッセージが表示されます。 ついでに補足するならば、Cのプログラムを直接起動すると、 上記エラーメッセージ出力後、プロセスは終了しますが、 別プログラムより起動した場合(UID=root)、 プロセスが終了してくれません。 上記メッセージの意味と、なぜrootからだと プロセスが終了しないのか、が分かりません。 どなたかお分かりになる方、よろしくお願いします。

  • malloc呼び出し時のセグメンテーションフォルト

    UNIX(HP-UX)上でCプログラムを組んでおります。 その際、mallocでセグメンテーションフォルトが起こりました。 mallocでセグメンテーションフォルトが起こった場合、どのように調査するのか、また実際どのような原因で起こりうるのか教えていただけますでしょうか?

  • 演算子のオーバーロード

    座標を表すクラスとして class Point { public:  double *buf;  Point(double, double) {   printf("new :%p ", buf);   buf = new double[2];   buf[0] = x1;   buf[1] = x2;   printf("-\n");  }  ~Point() {   printf("delete :%p ", buf);   delete [] buf; // ※1   printf("- \n");  }  Point operator +(Point){   Point a(0.0, 0.0);   a.buf[0] = this->buf[0] + p.buf[0];   a.buf[1] = this->buf[1] + p.buf[1];   return a;  }  Point operator =(Point){   this->buf[0] = p.buf[0];   this->buf[1] = p.buf[1];   return *this; // ※2  } }; int main() {  {   Point a(1.0, 2.0);   Point b(3.0, 4.0);   a = a+b; //(1)   a = a+b+a+b; //(2)   a = (a=b) + (b+b); //(3)   printf("(%f, %f)\n", a.buf[0], a.buf[1]);  }  return 0;  } を作成し、(1),(2),(3)のいずれかを記述して実行したところ、 (1) 正常に動作(4,6) (2) セグメンテーションフォルト ※1 を削除すると(8,12) (3) セグメンテーションフォルト ※1 を削除すると(9,12) という結果になりました。 Deleteで(同じアドレスを開放しようとして)失敗しているようなのですが、思った動作をさせるためにはどうすればよいでしょうか。 標準出力を載せたいのですが、文字数制限により無理のようなので、後ほど補足致します。 環境 Windows XP SP2 Cygwin 1.5.19(0.150/4/2) GCC 3.4.4

  • C言語 Segmentation fault

    program SPROGRAM 17 4 pas104 SIDENTIFIER 43 4 ( SLPAREN 33 4 上記のようなファイルを読みこんで、1行づつ各トークン(programとか17とか)を構造体に格納する関数reader()を作りましたが、これを以下のparser.cで呼びだすと「Segmentation fault(core dumped)」となってしまいます。gdbのrunコマンドでプログラムを実行すると、関数を呼び出す所で Program received signal SIGSEGV, Segmentation fault. 0x0040140f in reader () と表示されました。が,どうすればよいか全然分かりません・・・ どうすれば正しく動作してくれるのか、どなたか教えてください・・・ 以下ソース /*read.c*/ #include "head.h" void reader(void) { fprintf(stdout,"check"); char buf[BUF_LEN]; if (fgets(buf,sizeof(buf),fp) == NULL)/*ここで1行読みこむ*/ {/*いきなりNULLの場合*/ strcpy(t.str, ""); t.num = SEOF; t.line = 1; } else { 省略 } return; } /*parser.c*/ #include "head.h" struct tokenbox t; FILE *fp; int main(int argc, char *argv[]) { if (argc != 2)/*引数チェック*/ { fprintf(stderr,"Usage: (./parser) (file.ts)\n"); return -1; } int len; len = strlen(argv[1]);/*file.ts の長さ取得*/ if((argv[1][len-1] == 's') && (argv[1][len-2] =='t') && (argv[1][len-3] == '.'))/*tsファイルが指定されているかどうか*/ { fp = fopen(argv[1],"r");/*ファイルオープン*/ if (fp == NULL) { fprintf(stderr,"Such ts file is not exist\n"); return -1; } fprintf(stdout,"authenticate ts file!\n");//←これは出力される reader(); //←ここでSegmentation faultと思われる printf("t.str = %s\n", t.str); printf("t.str[0] = %c\n", t.str[0]); printf("t.num = %d\n", t.num); printf("t.line = %d\n", t.line); fclose(fp); return 0; } else { fprintf(stderr,"the file is not ts\n"); return -1; } } ヘッダファイル一部抜粋 /*head.h*/ #include <stdio.h> #include <string.h> #include <stdbool.h> #define BUF_LEN 128 #define TOKEN_LEN 128 struct tokenbox {/*tsファイルの各情報を格納する構造体*/ char str[TOKEN_LEN]; int num; int line; }; extern struct tokenbox t;/*構造体をtと置く*/ extern FILE *fp; /*ファイルポインタ*/

  • 動的に領域確保した三次元配列のbus error

    現在c言語でプログラミングをしているのですが、動的に領域確保した三次元配列に値”0”を入れようとすると、bus error が発生してしまいます。使用しているのはMac OS X 10.5.8 powerPC G5です。 ソースは以下のようになっています for(i=0;i<M*J;i++){ for(j=0;j<N;j++){ for(k=0;k<Q;k++){ BETA[i][j][k]=0.0; ALPHA[i][j][k]=0.0; } } } このとき、M、J、N、Qはそれぞれint型の定数です。 gdbしてみると結果はこのようになります。 Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_PROTECTION_FAILURE at address: 0x00000000 0x00004208 in sum_product_decode (H=0x1001f0, y=0x100880, transH=0x1002c0, get=0x100760, get_ve=0x100790, snr=6, count=0, matrix=0xbffff140, vector=0xbffff020, synd=0xbffff130) at n_b_LDPC.c:626 626 BETA[i][j][k]=0.0; ご指摘よろしくお願いします。

  • Insightでデバックする際にSIGBUSでエラーになりデバックが進みません

    初めて質問します。 マイコン初心者です。 現在、GCC Developer Liteを使用してSH7144の勉強をしているのですが、付属のデバッカのInsight(GDB6.1)でデバックしようとすると、"Program received signal SIGBUS, Bus error"というエラーが出てデバックが進まなく困っています。コンパイルしたソースを実機で動かすと動いている為、コンパイルの方法が悪いのか、Insightが悪いのかわからない状態です。 下記にソースファイルを示します。 #include <7144.h> void initIO(void) { PFC.PEIORL.WORD = 0x0003; } void wait(void) { long int t=1000000; while(t--); } void main(void) { initIO(); while(1) {  PE.DRL.BIT.B0 = 1;  wait();  PE.DRL.BIT.B0 = 0;  wait();  PE.DRL.BIT.B1 = 1;  wait();  PE.DRL.BIT.B1 = 0;  wait(); } } プログラムはマイコンに接続したLEDを点滅させるプログラムです。 GCC Developer Liteでのコンパイルオプションはデフォルト、マイコンは"SH7144F 内蔵フラッシュROM"を選択しています。 御教授の程よろしくお願いいたします。

専門家に質問してみよう