問題タブ [assign]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - libstdc++。so.6のstd::string ::assign()メソッドでの奇妙なSIGSEGVセグメンテーション違反
私のプログラムは最近、実行中に奇妙なセグメンテーション違反に遭遇しました。 誰かが以前にこのエラーに遭遇したことがあるかどうか、そしてそれをどのように修正できるか知りたいです。 詳細は次のとおりです。
基本情報:
- CentOS 5.2、カーネルバージョンは2.6.18です
- g ++(GCC)4.1.2 20080704(Red Hat 4.1.2-50)
- CPU:Intelx86ファミリー
- libstdc++。so.6.0.8
- 私のプログラムは、データを処理するために複数のスレッドを開始します。スレッドの1つでセグメンテーション違反が発生しました。
- マルチスレッドプログラムですが、segfaultはローカルのstd::stringオブジェクトで発生しているようです。これについては、後でコードスニペットで示します。
- プログラムは、-g、-Wall、および-fPICを使用してコンパイルされ、-O2またはその他の最適化オプションは使用されません。
コアダンプ情報:
segfaultはbasic_string::operator =()内で始まることに注意してください。
関連するコード:( 必要とされるよりも多くのコードを示しました。今のところ、コーディングスタイルについては無視してください。)
そして、これがこのFormatTimeStampメソッドのプロトタイプです。
このような文字列代入操作は、一般的に使用される操作の一種であると思いますが、ここでセグメンテーション違反が発生する理由がわかりません。
私が調査したこと:
私は答えをウェブで検索しました。ここを見ました。応答には、_GLIBCXX_FULLY_DYNAMIC_STRINGマクロを定義してプログラムを再コンパイルしてみてくださいと書かれています。試しましたが、それでもクラッシュが発生します。
私もここを見ました。また、_GLIBCXX_FULLY_DYNAMIC_STRINGを使用してプログラムを再コンパイルするように指示されていますが、作成者は私の別の問題を扱っているようです。したがって、彼の解決策は私にはうまくいかないと思います。
2011年8月15日に更新
これがこのFormatTimeStampの元のコードです。コーディングがあまり見栄えが良くないことは理解していますが(たとえば、魔法数が多すぎるなど)、最初にクラッシュの問題に焦点を当てましょう。
2011年8月19日に更新
この問題は最終的に解決され、修正されました。FormatTimeStamp()関数は、実際には根本的な原因とは何の関係もありません。セグメンテーション違反は、ローカル文字バッファの書き込みオーバーフローが原因で発生します。
この問題は、次のより単純なプログラムで再現できます(今のところ、いくつかの変数の間違った名前を無視してください)。
(「g ++ -Wall -gmain.cpp」でコンパイル)
先に進む前に覚えておくべき2つの事実があります:1)。私のマシンはIntelx86マシンであるため、リトルエンディアンルールを使用しています。したがって、値がたとえば10であるint型の変数 "m"の場合、メモリレイアウトは次のようになります。
2)。上記のプログラムはメインスレッド内で実行されます。overlay_it()関数に関しては、スレッドスタックの変数レイアウトは次のようになります(重要な変数のみが表示されます)。
私の分析:
1)。mはoverflow_it()のカウンターであり、その値はforループごとに1ずつ増加し、最大値は6以下であると想定されます。したがって、その値はm(byte#1)(リトルエンディアンであることを思い出してください)に完全に格納できます。たまたま臨時雇用者3です。
2)。バグのある行:tが109などの3桁の整数の場合、数値109を文字列「109」にシリアル化するには実際には4バイトが必要なため、sprintf()呼び出しはバッファオーバーフローを引き起こします:「1」 、「0」、「9」および終了する「\0」。temp []は3バイトのみで割り当てられるため、最後の'\0'は間違いなくtemp3に書き込まれます。これは、残念ながらmの値を格納するm(byte#1)にすぎません。その結果、mの値は毎回0にリセットされます。
3)。ただし、プログラマーの予想では、overflow_it()のforループは6回だけ実行され、各時間mは1ずつ増加します。mは常に0にリセットされるため、実際のループ時間は6回をはるかに超えます。
4)。overlay_it()の変数iを見てみましょう。forループが実行されるたびに、iの値が2ずつ増加し、A15Result[i]にアクセスします。ただし、このプログラムをコンパイルして実行すると、i値が最終的に24になることがわかります。これは、overflow_it()がA15Result[0]からA15Result[23]の範囲のバイトにデータを書き込むことを意味します。オブジェクトstrはA15Result[0]からわずか16バイト遅れているため、overflow_it()はstrを「スイープスルー」し、正しいメモリレイアウトを破棄していることに注意してください。
5)。std :: stringは非PODデータ構造であるため、正しい使用法は、インスタンス化されたstd::stringオブジェクトが正しい内部状態を持っている必要があることに依存していると思います。しかし、このプログラムでは、strの内部レイアウトが外部から強制的に変更されています。これが、assign()メソッドの呼び出しが最終的にセグメンテーション違反を引き起こす理由です。
2011年8月26日に更新
2011年8月19日の前回の更新で、セグメンテーション違反は、メモリレイアウトが壊れて「破壊された」オブジェクトになった、ローカルのstd::stringオブジェクトに対するメソッド呼び出しが原因であると述べました。これは「常に」実話ではありません。以下のC++プログラムについて考えてみます。
Hello()呼び出しは成功します。明らかに悪いポインタをpaに割り当てても成功します。その理由は、C ++オブジェクトモデルによると、クラスの非仮想メソッドがオブジェクトのメモリレイアウト内に存在しないためです。C ++コンパイラは、A :: Hello()メソッドを、たとえばA_Hello_xxx(A * const this、...)のようなものに変換します。これは、グローバル関数である可能性があります。したがって、「this」ポインタを操作しない限り、状況はかなりうまくいく可能性があります。
この事実は、「不良」オブジェクトがSIGSEGVセグメンテーションフォールトを引き起こす根本的な原因ではないことを示しています。Assign()メソッドはstd :: stringで仮想化されていないため、「不正な」std::stringオブジェクトによってセグメンテーション違反が発生することはありません。最終的にセグメンテーション違反を引き起こした他の理由があるに違いありません。
セグメンテーション違反は__gnu_cxx::__ exchange_and_add()関数からのものであることに気付いたので、次のWebページでそのソースコードを調べました。
__exchange_and_add()は、最終的に__sync_fetch_and_add()を呼び出します。このWebページによると、__ sync_fetch_and_add()はGCC組み込み関数であり、その動作は次のようになります。
そこにそれがある!渡されたptrポインタはここで逆参照されます。2011年8月19日のプログラムでは、ptrは、実際には、assign()メソッド内の「不良」std::stringオブジェクトの「this」ポインタです。実際にSIGSEGVセグメンテーション違反を引き起こしたのは、この時点での参照違反です。
次のプログラムでこれをテストできます。
map - golangでのマップへの割り当て
次のgoスニペットでは、何が間違っていますか?
コンパイルすると、次のエラーが発生します。
ダブルエウェテフ?
delphi - オブジェクト参照を変数に割り当てる
ここで割り当てについて質問があります。知りたいです
Assign
オブジェクト全体のコピーを作成するかどうかFTEA.Objects[0]
も解放されているのか知りたいです。
のコピーを作成したいのですが、FTEA.Objects[0]
解放するときは、解放ObjCur
するつもりはありませんFTEA.Objects[0]
- これを行う正しい方法がわからないため、助けが必要です。ありがとう :
jquery - Jqueryを使用して別のファイル入力値を割り当てる方法は?
次のような要素があります。
私の質問は次のとおりです:jqueryを使用して「偽の」入力の値を「本物の」入力に割り当てることは可能ですか? 送信ボタンを押すと、「実際の」ファイル入力がアップロードされるようにします。
r - 1 行で LHS に複数の新しい変数を割り当てる
Rで1行に複数の変数を代入したいのですが、このようなことは可能でしょうか?
通常、複数行ではなく、1 行で約 5 ~ 6 個の変数を割り当てたいと考えています。代替手段はありますか?
r - あるリストから別のリストに名前を割り当てる
と呼ばれるいくつかのリストに保存された、動的に作成された回帰をたくさん取得しましたregressions
。ここで、係数の名前を効率的に変更したいと思います。私がこれまでに持っているのは、機能するこのループです:
関数の助けを借りて、これをもう少し一般的に行うためにかなり長い間試みてきました。これは、私が持っている回帰の唯一のリストではありません。しかし、他に何も機能させることができませんでした。基本的にlapplyに基づいた他のいくつかの試みを次に示します。
別の試みは、出力が示すように内部的にも機能するが、名前をグローバルに割り当てない (回帰リストが保存される場所) for ループを使用して関数を作成することでした。
あ、ちょっと休憩。
asp.net - テキスト値を割り当てるときにaspxとコードビハインドの間に違いはありますかasp.net4.0c#
これはaspx.csの割り当ての背後にあるコードです
これはaspxの割り当てです
これら2つの間にパフォーマンスの違いはありますか?
xcode - XCode: 分割文字列値のチェックと textField への割り当て
だから私はこれをテストしようとしています。基本的に、rawData.txt という名前のテキスト ファイルが含まれています。次のようになります。
行を分割してから、個々の行を分割して最初の部分 (9 桁) を確認したかったのですが、まったく機能していないようです (ウィンドウが閉じます) このコードに問題はありますか?
c - ポインタに値を割り当てる際の問題
ポインタに値を割り当てたいとします。
出来ますか?
私は混乱しています。それについて教えてください。すべての行をチェックしましたが、ポインタの割り当てだけが間違っているようです。それで、ここに問題コードがあります(見るのは複雑かもしれませんが、コメントで単純化しています。コメントを見てください):
主な機能の内部:
python - Pythonでキーとしてインデックスを使用するにはどうすればよいですか?
私はリストを持っています:v = [1,2,2,3]
。このリストをキーにしたいと思います。私はそれを「手動で」行うことができます:
だが
x [v] = 7
動作しません。私がする必要があることをする最も簡単な方法は何ですか?
追加した
私はその解決策をそのようなものとして想像します: