Stack around the variable 'xx' was corrupted

このQ&Aのポイント
  • 異常系の文字列処理で発生するエラーメッセージ「Stack around the variable 'xx' was corrupted」について質問します。
  • ビルド後の実行結果で問題が発生する場合もあり、try-catch文では例外をキャッチすることができないため、正常終了しているように見えることがあります。
  • Visual C++ 2008 Expressを使用している開発環境での対処方法を教えてください。
回答を見る
  • ベストアンサー

Stack around the variable 'xx' was corrupted

お世話になっております。 異常系に関して質問させてください。 想定内のサイズの文字列の処理では問題なく処理されておりますが、異常系のテストを行おうとして、想定外のサイズの文字列を処理しようとすると以下のメッセージが出力されます。 Stack around the variable 'xx' was corrupted 想定外なのでこのメッセージが出力されるのは良いのですが、ビルドを行い EXE を実行すると、return 0 で戻ってくる場合がある為、一見正常終了しているように見える場合があります。 「try {} catch (...) {}」で囲んでみましたが、Stack around は例外では無い為、catch する事ができません。 Stack around が出ないように組む!が正しいのでしょうが、Stack around が出た場合 return 1 で返却する方法はありますでしょうか? 開発環境は Visual C++ 2008 Express になります。 宜しくお願いします。

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

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

ごめん、下記回答的外れだったかも。 異常系でreturn 0で戻ってくるときがある、というのは、 いわゆるバッファオーバーラン攻撃な状態になってて、 プログラム側では検出できないのではないのかな。 Stack around…は、VC++のセキュリティチェック機能で検出されてる例外だと思うので、 http://msdn.microsoft.com/ja-jp/library/cc465512.aspx の13.1.1を参照して、独自のセキュリティエラーハンドラを定義して return 1を返すように実装できると思います。 ただ、繰り返しになりますが、このチェックをすり抜けるケースには、どうやっても対処できないのではないのではないかと。

mikami532
質問者

お礼

返信が遅れましてすみません。 >バッファオーバーラン攻撃な状態 まさしくそんな状態です。 リンク先参考にさせていただきます。 それでも全てキャッチできるわけではないのですね。。。 そこも含めて検討いたします。 回答ありがとうございました。

その他の回答 (2)

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

どうも、_set_security_error_handlerってのは、VC++2005からは削除されたみたいですね。 http://www.codeproject.com/KB/tips/seccheck.aspx?display=Print のサンプルと、 構造化例外 http://www.ne.jp/asahi/hishidama/home/tech/vcpp/seh.html を参考にすれば、やりたいことの一部は実現できそうです。 でも、やはり、 > Stack around が出ないように組む!が正しい でしょうね。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

関連するQ&A

  • エラー Stack around the variable 'tmp' was corrupted.

    MFC7.0でプログラミングしています。 下記2のサブルーチンを出る時(fcloseの後)に 下記1のようなランタイムエラーが どうしても出てしまいます。 このルーチンがメインの関数なので、 これ以外の場所のコーディングはほとんどありません。 スタックと出ているので、 メモリ関連であることは分かるのですが、 それ以上進みません。 どなたかアドバイスよろしくお願いします。        記1 Run-Time Check Failure #2 - Stack around the variable 'tmp' was corrupted.        記2 } int i,j; FILE* fp; m_filename += ".lst"; fp = fopen(m_filename,"w"); char tmp[1]; itoa(m_num,tmp,10); CString num = tmp; m_url.Replace("%","%%"); CString sout = m_url + m_head for(i = m_start ; i<= m_end ; i++){  fprintf(fp,sout,i); } fclose(fp); }

  • Run-Time Check Failure?

    Run-Time Check Failure #2 - Stack around the variable 'x' was corrupted. と表記されました。 どういったエラーのことなんでしょうか?

  • エラー Run-Time Check Failure #2 - Stack around the variable 'ps' was corrupted.

    五目並べのプログラムを作っているのですが、 下記2のサブルーチンを出る時に 下記1のようなランタイムエラーが どうしても出てしまいます。 原因が分からなく自分の力ではどうにもできないので、 どなたかアドバイスよろしくお願い致します。        記1 Run-Time Check Failure #2 - Stack around the variable 'ps' was corrupted.        記2 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id, x, y; static int nTe = 0; PAINTSTRUCT ps; HDC hdc; char szBuf[64], szSashite[16]; static HMENU hMenu; switch (msg) { case WM_CREATE: hMenu = GetMenu(hWnd); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); MyMakeBan(hdc); MyStoneDraw(hdc); if (bSente) strcpy_s(szSashite, "先手●"); else strcpy_s(szSashite, "後手○"); wsprintf((LPWSTR)szBuf, TEXT("差し手 = %s"), szSashite); TextOut(hdc, 30, SHUI + KANKAKU * 14 + 30, (LPCWSTR)szBuf, strlen(szBuf)); wsprintf((LPWSTR)szBuf, TEXT("第 %02d 手終了 現在 %02d 手目待ち"), nTe, nTe + 1); TextOut(hdc, 30, SHUI + KANKAKU * 14 + 50, (LPCWSTR)szBuf, strlen(szBuf)); EndPaint(hWnd, &ps); break;

  • プログラムが落ちる。

    VisualStudio2005を使用しています。 ダイアログを作成し、配置したコントロールに手動で変数を追加していたんですが、 22個めの変数を追加したところ、プログラムが落ちるようになりました。(ビルドは通ります) エラー内容は、 Run-TimeCheckFailure #2 - Stack around the variable 'dlg' was corrupted DoModalから帰って来たところでエラーが発生しているようですが… 変数の追加作業しかしていませんし、同じ作業の繰り返しだったのに、22個になったとたん落ちる理由がわかりません。 コントロール変数はいくつまで・など、数の制限でもあるのでしょうか。 このエラー内容は、どういった場合に(何が悪いと)発生するのでしょうか。

  • 文字列操作(終端と抽出)について

    こんばんは お時間等ございましたら、ご指摘よろしくお願いします。 <背景>メインプログラムからサブプログラムに複数の数値を渡して、     文字列として編集します。     そして、その文字列から特定の文字のみを抽出し、     ファイルに出力したいと考えています。     ※下記にソースイメージを記しました。      ただ、While文の指定がうまくなく、      想定どおり処理を抜けれません。 <質問>サブプログラムでファイルに出力する文字のうち、     抽出する文字と抽出しない文字はランダムで、     メインプログラムから、渡されてきます。     ※文字列の文字数は、     メインから渡され編集した文字数>=ファイルに出力する文字数。     サブプログラムの先頭で出力する文字列の大きさを     指定しているのですが、抽出しない文字があった場合、     抽出しない文字数分ゴミが出力されてしまうのを     防ぎたいと考えています。 <イメージ> #include <stdio.h> void sub( int a, int b, int c, FILE *fp ); int main(){ FILE *fp; fp = fopen("c:\\0511.txt","w"); int a;int b;int c; a = 1; b = 0; c = 1; sub( a, b, c, fp ); fclose(fp); } void sub( int a, int b, int c, FILE *fp ){ int j = 0; char moji[4];char moji2[4]; sprintf(moji,"%d%d%d%s",a,b,c,"\0" ); while( moji[moji[*moji]] != '\0' ){ switch( moji[moji[*moji]] ){ case '1' : moji2[j] = moji[moji[*moji]]; break; case '0' : j -= 1; break; default :;break; } moji[*moji] += 1;j += 1; } fprintf(fp,"%s\n",moji2 ); }// Run-Time Check Failure #2 - Stack around the variable 'moji' was corrupted. もし宜しければ、ご指摘の程よろしくお願いします。

  • TRANSACT-SQLでのシステムエラーの検知

    TRANSACT-SQLで下記のような処理を記述したとき、 (1)~(3)で起きたシステムエラーの検知はCATCHで共通的に行えますか? TRY  SELECT処理  ↓  エラー発生(1)  ↓  INSERT処理  ↓  エラー発生(2)  ↓  UPDATE処理  ↓  エラー発生(3) CATCH  GOTO 異常終了処理 END COMMIT :異常終了定義 ログ出力(エラーメッセージ) ロールバック ※エラー処理は、テーブルがDROPされていた、ディスクが破損したなどの通常は発生しないエラーが起きた場合を想定しています。 ※エラーメッセージはステートメントが最終の処理の結果を持ってくれていて、その取得方法があると思っています。 もし実現できなかったり、実現出来たとしても問題があるようであればご指摘頂きたく存じます。

  • 例外処理がエラーを…(泣)

    C++のプログラムを勉強しているのですが 例外処理の部分でエラーをはいてしまいます。 #include<iostream> using namespace std; void Xhandler(int test){ try{ if(test)throw test; else throw "Value is zero"; } catch(int i){ cout << "Caught One! Ex. #: " << i << "\n"; } catch(char *str){ cout << "Caught a string: " ≪ str << "\n"; } } int main(){ cout << "start\n"; Xhandler(1); Xhandler(2); Xhandler(0); Xhandler(3); cout << "end"; return 0; } 実行結果 start Caught One! Ex. #: 1 Caught One! Ex. #: 2 7[sig] 1705 3752 _cygtls::handle_exceptions: Error while dumping state(probably corrupted stack) Segmentation fault (core dumped) catch の char *str を str にして "Value is zero" を 'a' にしたら 予測通りの動作をしたのですが… catch に *str を使って文字列を投げてはいけないのでしょうか? よろしくお願いします。

  • 配列

    /*10個の数字を受け取り,その中に一致する2つの数字があるかどうかを報告するプログラム*/ #include<stdio.h> int main(void) { int i,j,k; int item[9]; printf("10個の数字を入力してください\n"); for(i=0;i<10;i++) scanf("%d",&item[i]); for(j=0;j<10;j++) { for(k=j+1;k<10;k++) { if(item[j]==item[k]) printf("%dが2つ存在します.\n",item[j]); } } return 0; } というプログラムでエラーが出てしまいました. エラー内容は Stack around the variable 'item' was corrupted というものです. 原因を知りたいです.よろしくお願いします.

  • ログの解析プログラム

    perlにてログの解析プログラムを作成しております。 ログは各データの区切り文字がスペースで出力されます。 その為、例えば文字列で「プログラムの異常が発生しました (発生ノード)」が出力されている場合split関数によって配列に格納しようとすると「プログラムの異常が発生しました」と「(発生ノード)」に分解されて格納されてしまい後ほどの処理に影響が出てしまいます。ログの仕様として文字列を出力するときには直前に文字列の長さを提示しております。例えば「43 プログラムの異常が発生しました (発生ノード)」のような形で出力されます。これらの条件で文字列を一つの配列に格納するにはどのようなプログラムを組めばよろしいでしょうか。 現時点で考えているのは文字列の長さが出ているのでその回数分文字を1文字づつ読み込むことを考えております。ただし全角と半角の区別が自動でついてしまうと厄介なので全部半角として取り込めないかなどを検討しております。 なにか他にいいアイデアがありましたら教えてください。

  • C言語win32api、エディットボックスから文字列を取得しメッセージ

    C言語win32api、エディットボックスから文字列を取得しメッセージボックスへ出力 質問1 エディットボックスからフォーカスが外れると その中の文字列を取得しメッセージボックスに出力したいのですが 思った通りに出力されません。 フォーカスが外れるとメッセージボックス自体は出てくるのですが エディットボックスに入力した文字列が出力されません。 いろいろ試したんですが文字化けしたり文字列自体が表示されなかったします。 取得と出力の方法を教えていただけませんでしょうか。 kwt[3]=CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("EDIT"), NULL , WS_CHILD | WS_VISIBLE | WS_BORDER |ES_LEFT | ES_AUTOHSCROLL , 90 , 85 , 110 , 25 , hAdd ,(HMENU)EDIT_ID02 ,((LPCREATESTRUCT)(lp))->hInstance , NULL); LPSTR testtex=NULL; LRESULT CALLBACK SubProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { LPSTR testtex=NULL; switch(msg) { case WM_COMMAND: switch(LOWORD(wp)) { case EDIT_ID02: if(HIWORD(wp)==EN_KILLFOCUS) //フォーカスが外れたら次の処理をする。 { strText = (LPSTR)malloc(GetWindowTextLength(hwnd) + 2); //文字数分のメモリを確保 if(testtex) //testtexがゼロでなければ次の処理をする { GetWindowText(hwnd , testtex , GetWindowTextLength(hwnd) + 2); //エディットのテキストを取得。問題個所 MessageBox(hwnd , testtex , TEXT("") , MB_OK); //取得したテキストをメッセージボックスで出力。問題個所 } free(strText); //メモリを解放 return 0; } return 0; } return 0; } return (CallWindowProc(SubP1, hWnd, msg, wp, lp)); } 質問2 エディットボックスに0~9と「.」(ドット)のみを入力できるようにしたいのですが ウインドウスタイルでES_NUMBERを指定すると「.」が入力できなくなってしまいます。 どのように回避したらいいのでしょうか。 質問3 win32apiとは直接関係ありませんが、たとえば計算結果が1000億を超えるような場合 int型とかの変数ではとても入りきれません。 こういった場合どのようにするのでしょう。

専門家に質問してみよう