[前][次][番号順一覧][スレッド一覧]

mysql:2829

From: 松並 <松並 <matunami@xxxxxxxxxx>>
Date: Thu, 07 Dec 2000 15:36:08 +0900
Subject: [mysql 02829] Re: C言語でのクエリー発行

こんにちは松並@横浜です。
一連のスレッドを読ませていただきました。
CからMySQLを使ったことはありませんがC言語は仕事で使っていますので、
私の感じたことをご参考までに書かせていただきます。

外れているかもしれません。参考になれれば幸いです。

それと以下に、質問の仕方についてテクニックを書いておきました。
文句などではないので、誤解なきようお願いします。
あくまで議論がスムーズに流れるためのテクニックです。:−>

===概要===

結論としては、MySQLの使い方というよりは、C言語での文字列処理などに
不備があるのでは?という感じがしました。

理由としては
(1)ご提示されているmysql関連関数の呼び出し手順については、
   どなたも間違いを指摘されていません。
(2)浅野さんより、問題となっているソースコードそのものの
   ご提示がありません。
です。

MLへの転送を考慮されて、ソースコードを簡素化されてのご提示だと思いますが、
問題の部分を浅野さんが発見されていない以上、浅野さんが簡素化された
ソースコードへの議論は無関係なところを議論していることになりかねません(よね?)

でも巨大なソースコードだと、何かしら考えないといけませんね。^。^

===個別の気になるところ===

On Thu, 07 Dec 2000 11:15:23 +0900
Yoshiyuki Asano <asano@xxxxxxxxxx> wrote:

> ちなみに、Segmentation fault が出るのは、sprintfを実行したときで
> クエリーを発行するところではありません。
> 
> しかしながら、クエリー発行の行をコメントにすると、最後まで問題なく
> 動作しますので、クエリーを発行しているところで何らかのことが起こっている
> ということは予測できるのですが、原因がわかりません。

クエリー発行の行をコメントにすると、最後まで問題なく動作すると
思っていらっしゃいますが、たまたまエラーとして現れないということが
よくあります。特にC言語では。

例えばC言語のローレベルな話をしますと、
mysql_query()を呼ぶ/呼ばないの違いは、スタック上にゴミが書き込まれる・
書き込まれないの違いがあります。具体的には

/* sample untested */
#include <stdio.h>
int function();
int function2();

int function()
{
  char buf[10];
  sprintf(buf, "%s", "12345678901234567890");
  function2();   /* <=== これを呼ぶと次のprintf()の表示文字列が変化します */
  printf("%s\n", buf);
}

int function2()
{
  printf("function2() gets called!\n");
}

通常CPUのメモリ確保はページ単位(4KBなど)で行われますので、
たとえbuf[10]をオーバーして読み書きしたりしても、4KBの壁を越えるまで
Segmentation faultはおきません。
ですので上記sprintf()はbufのサイズをオーバーして書き込んでいますが、
ほとんどの環境ではSegmentation faultは発生しません。
function2()を呼ぶと、戻り番地の記録のため、bufの11バイト以降、
(おそらく12バイトか16バイト)に、戻り番地などが書き込まれます。
このようにbufの領域を越えた部分にゴミが書き込まれます。
もちろんfunction2()をコメントアウトするとbufに書き込んだ文字列は
そのまま変化しません。
printf()文はbufのサイズなぞ関知しませんので\0があるところまで、
表示しようとします。mysql_query()へ渡すquery文もこの例に入るかもしれません。

余談
質問時のテクニックですが、「クエリー発行の行をコメント」という日本語文よりは、
「mysql_query()」のように具体的に書きましょう。グッと誤解が減りますよ!

On Thu, 07 Dec 2000 14:05:54 +0900
Yoshiyuki Asano <asano@xxxxxxxxxx> wrote:

> > > ちなみに、Segmentation fault が出るのは、sprintfを実行したときで
> > > クエリーを発行するところではありません。

(1)クエリー発行するところではなくsprintfのところでSegmentation fault
   になる
(2)クエリー発行しないと、Segmentation faultは起きない(、けどバグが
   露呈されないだけかも?)

といった動きはメモリ破壊、具体的にはmalloc()などで取得したメモリ領域への
アクセス時の不手際、スタック上に確保したバッファへのアクセス時の不手際の
可能性が高いのではと思われます。

===個別その2==

On Thu, 07 Dec 2000 14:05:54 +0900
Yoshiyuki Asano <asano@xxxxxxxxxx> wrote:

> えっと、説明が足りませんでした。

説明より、「具体的なモノ」がもっとも雄弁です。
お仕事で後輩が書いたプログラムが動かない場合に、「とにかくソースを見せろ!」
ということがありますよね! :−>

===個別その3==

> 直接、打ち込んでもなることが確認できましたので、ソースにはそちらを使用しました。
直接、(何処に)(何を)、打ち込んでも(どう)なる

言葉が足りませんよね。というより、説明しようとすると非常に疲れます。
「具体的なモノ」を提示するのが楽&正確ですね。

> クエリーを発行しているところで、メモリ破壊が起こっているのは明らかだと思いましたので。
> ちなみに、sprintfで書き込んでいる、char型のワークをbzeroで初期化しているのですが、
> 初期化するだけでもこけてしまいます。しかもそのワークは初期化以外何もしていないのです

「こける」という表現は
ワークをbzero()で初期化してSegmentation faultがおこるということでしょうか。
ワークはmalloc()やcalloc()などで取得していませんでしょうか?
またbzero()で指定するワークサイズは正しいものでしょうか?

==個別その4==

> 早速、試してみました。
> 結果は Duplicate entry '0' for key 1 とありました。
> プライマリーキーを設定しているので、その関係のエラーだと思うのですが...
> 違います?

私はちょいとこれは分かりません。

==最後に===

PHPならこんなことで仕事の進捗を妨げたりすることは少ないですよ (^。^)

-- 
松並@横浜 <matunami@xxxxxxxxxx>
http://putyou.matwerks.com/


[前][次][番号順一覧][スレッド一覧]

      2788 2000-12-06 14:56 ["Y. Tsutsui" <tutui@] 関東支部会合について                    
      2789 2000-12-06 15:17 ┣[Tatsuo Hiramatsu <ta]                                       
      2790 2000-12-06 15:37 ┃┗["Y. Tsutsui" <tutui@]                                     
      2791 2000-12-06 15:43 ┃ ┗[Michiaki Mitachi <mi]                                   
      2793 2000-12-06 16:35 ┃  ┗[<endo_t@xxxxxxxxxx> ]                                 
      2795 2000-12-06 17:29 ┗[Tatsuo Hiramatsu <ta]                                       
      2796 2000-12-06 17:35  ┣["Y. Tsutsui" <tutui@]                                     
      2798 2000-12-06 17:46  ┃┣[<ikezawa@xxxxxxxxxx>]                                   
      2807 2000-12-06 18:47  ┃┗[Tatsuo Hiramatsu <ta]                                   
      2814 2000-12-06 20:58  ┃ ┗[<ikezawa@xxxxxxxxxx>]                                 
      2815 2000-12-06 21:06  ┃  ┗["Y. Tsutsui" <tutui@]                               
      2880 2000-12-18 17:56  ┃   ┗["Y. Tsutsui" <tutui@]                             
      2881 2000-12-19 10:32  ┃    ┣[Tatsuo Hiramatsu <ta]                           
      2884 2000-12-20 18:19  ┃    ┃┗["Y. Tsutsui" <tutui@]                         
      2885 2000-12-20 21:27  ┃    ┃ ┗[<ikezawa@xxxxxxxxxx>]                       
      2890 2000-12-22 02:41  ┃    ┗["Y. Tsutsui" <tutui@]                           
      2892 2000-12-22 11:50  ┃     ┗[Tatsuo Hiramatsu <ta]                         
      2893 2000-12-22 13:49  ┃      ┗[<ikezawa@xxxxxxxxxx>]                       
      2797 2000-12-06 17:33  ┗[Yoshiyuki Asano <asa] C言語でのクエリー発行              
      2799 2000-12-06 18:12   ┣[Kayama Yoichi <yoich]                                   
      2801 2000-12-06 18:13   ┃┗[Yoshiyuki Asano <asa]                                 
      2803 2000-12-06 18:40   ┃ ┣[Kayama Yoichi <yoich]                               
      2804 2000-12-06 18:33   ┃ ┃┗[Yoshiyuki Asano <asa]                             
      2806 2000-12-06 18:40   ┃ ┗[Kengo Jinno <kengo@x]                               
      2809 2000-12-06 18:51   ┃  ┣[Yoshiyuki Asano <asa]                             
      2810 2000-12-06 18:55   ┃  ┗[荒井 哲三  <tetsumi]                             
      2812 2000-12-06 19:35   ┃   ┗[Kengo Jinno <kengo@x]                           
      2813 2000-12-06 20:04   ┃    ┣[UNO Shintaro <uno@xx]                         
      2830 2000-12-07 15:57   ┃    ┗[荒井 哲三  <tetsumi]                         
      2800 2000-12-06 18:02   ┣[Kengo Jinno <kengo@x]                                   
      2802 2000-12-06 18:20   ┃┣[Yoshiyuki Asano <asa]                                 
      2805 2000-12-06 18:40   ┃┃┗[Kengo Jinno <kengo@x]                               
      2808 2000-12-06 18:49   ┃┃ ┗[Yoshiyuki Asano <asa]                             
      2811 2000-12-06 19:35   ┃┃  ┗[Kengo Jinno <kengo@x]                           
      2843 2000-12-08 11:54   ┃┗[Yoshiyuki Asano <asa] MySQL のC言語用のライブラリって...
      2844 2000-12-08 13:19   ┃ ┗[Kengo Jinno <kengo@x]                               
      2845 2000-12-08 13:52   ┃  ┣[Tomohiro KATO <tomop]                             
      2846 2000-12-08 14:14   ┃  ┃┗[Kengo Jinno <kengo@x]                           
      2847 2000-12-08 15:18   ┃  ┃ ┗[Yoshiyuki Asano <asa]                         
      2852 2000-12-11 10:59   ┃  ┗[Yoshiyuki Asano <asa]                             
      2853 2000-12-11 11:28   ┃   ┗[Kengo Jinno <kengo@x]                           
      2854 2000-12-11 11:54   ┃    ┗[Yoshiyuki Asano <asa]                         
      2856 2000-12-11 12:41   ┃     ┗[Kengo Jinno <kengo@x]                       
      2857 2000-12-11 17:36   ┃      ┗[Yoshiyuki Asano <asa] MySQL サーバーに接続の仕方
      2858 2000-12-11 19:20   ┃       ┗[Tomohiro KATO <tomop]                   
      2873 2000-12-15 11:03   ┃        ┗[Yoshiyuki Asano <asa] MySQL  サーバーにリモート接続
      2874 2000-12-15 14:26   ┃         ┗[Tomohiro KATO <tomop]               
      2886 2000-12-21 11:32   ┃          ┗[Yoshiyuki Asano <asa]             
      2887 2000-12-21 12:27   ┃           ┗[Kengo Jinno <kengo@x]           
      2888 2000-12-21 12:45   ┃            ┗[Yoshiyuki Asano <asa]         
      2889 2000-12-21 13:01   ┃             ┗[Kengo Jinno <kengo@x]       
      2891 2000-12-22 09:18   ┃              ┗[Yoshiyuki Asano <asa]     
      2817 2000-12-06 23:50   ┗[とみたまさひろ <tomm]                                   
      2820 2000-12-07 11:15    ┗[Yoshiyuki Asano <asa]                                 
      2823 2000-12-07 13:21     ┗[Kengo Jinno <kengo@x]                               
      2824 2000-12-07 14:05      ┗[Yoshiyuki Asano <asa]                             
      2826 2000-12-07 14:38       ┣[Kengo Jinno <kengo@x]                           
      2827 2000-12-07 15:31       ┣[Kayama Yoichi <yoich]                           
      2828 2000-12-07 15:34       ┣[Tomohiro KATO <tomop]                           
->    2829 2000-12-07 15:36       ┣[松並 <matunami@xxxxx]                           
      2831 2000-12-07 15:58       ┃┣[松並 <matunami@xxxxx]                         
      2833 2000-12-07 16:11       ┃┣[UNO Shintaro <uno@xx]                         
      2834 2000-12-07 16:39       ┃┗[Yoshiyuki Asano <asa]                         
      2836 2000-12-07 17:46       ┃ ┣[Tomohiro KATO <tomop]                       
      2837 2000-12-07 18:54       ┃ ┃┣[Yoshiyuki Asano <asa]                     
      2839 2000-12-07 21:21       ┃ ┃┗[Satoshi Tatsuoka <sa]                     
      2842 2000-12-08 09:25       ┃ ┃ ┗[Yoshiyuki Asano <asa]                   
      2838 2000-12-07 19:44       ┃ ┣[松並 <matunami@xxxxx]                       
      2841 2000-12-08 09:00       ┃ ┗[UNO Shintaro <uno@xx]                       
      2832 2000-12-07 16:05       ┗[<endo_t@xxxxxxxxxx> ]