問題タブ [static-order-fiasco]

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.

0 投票する
2 に答える
358 参照

c++ - ファイルレベルの静的変数の順序は、特定の翻訳単位内で常に同じですか?

次の 2 つのソース ファイルに分割されたプログラムがあります。

たとえば .cpp

__ main.cpp

このプログラムの出力は次のようになることが保証されていますか?

すべてのプラットフォームとコンパイラで? もしそうなら、標準のどこにこれが書かれていますか?first名前空間を使用していて、別の名前空間に表示されていても問題はありsecondますか? それらが静的ではなく、匿名の名前空間を使用している場合はどうですか?

0 投票する
1 に答える
910 参照

c++ - 静的初期化順序の大失敗: 同じコンパイル単位?

そこで、ANTLR を使用して構文コンパイラを構築しています。生成されたコードの一部は次のようになります。

ご覧のとおり、これは「静的初期化順序の大失敗」の説明に適合します。

問題は、このプロジェクトの目標の 1 つは、生成された C++ コードを、さらなる構文コンパイルのベースとしてできるだけ簡単に使用できることです。

そのため、この場合、「最初の使用時に構築する」パラダイムが問題になる可能性があります。静的変数と静的関数を区別するのははるかに困難です。

これらの静的変数が単一のコンパイル単位で初期化されている場合、問題は存在しないことを何度か読んだことがあります。

したがって、これらの競合する状況をすべて、依存関係順に並べた別の .cpp ファイルに移動するという考えがあります。

これらの競合する状況に対して生成されたコードは、次のようになります。

私の質問は次のとおりです。

0 投票する
3 に答える
2239 参照

c++ - オブジェクト参照を使用して初期化順序の大失敗に遭遇することなく、オブジェクトの静的配列を正しく初期化する

メンバーがキーと値である要素の配列を使用するだけで、軽量マップを実装しようとしています。マップの内容はコンパイル時にわかっているので、次のように固定サイズの配列を使用することを考えています。

私の質問に: コード スニペットは意図したとおりに動作しますが、ItemMapUser::map で使用する前に ITEM1 から ITEM4 のコンテンツを初期化する初期化順序に依存しているように感じます。このトピックに関する多くの質問 (特に static-order-fiasco タグが付いているもの) を検索しましたが、配列の使用に関連するものは見つかりませんでした。

  • 初期化命令の失敗に遭遇する可能性はありますか?
  • いいえの場合、ここでの発生を妨げているのは何ですか?
  • 配列を使用していることは重要ですか? const Item anotherItem = ITEM1;たとえば、単純な変数を初期化しようとすると、どのようになりますか?
0 投票する
2 に答える
1185 参照

c++ - C ++静的初期化順序の大失敗

私は現在 C++ を学んでいますが、いくつか問題があります。

たくさんの を使ってプログラムを開発しましたが、代わりに (collision/type/scopes...)#defineを使用したいと思います。static const

だから、私は今のようなものを持っています:

file1.hpp

file1.cpp

file2.cpp

私のコードは警告/エラーなしでコンパイルされます (-W -Wall -Wextra -Werror フラグでコンパイル)。

ただし、実行しようとすると、segfault が発生します。

valgrind で実行したところ、次の出力が得られました。

そのため、arrayOfString のインスタンス化中に segfault が発生します。問題は、 arrayOfInt が定数の前に割り当てられていることだと思います。しかし、その場合、この目的のために static const を使用することは可能ですか?

この問題にパッチを当てる方法がわかりません。私はそれを間違っていますか?それを行うより良い方法はありますか?この問題を解決するには?

0 投票する
1 に答える
1370 参照

c++ - 静的インスタンスから参照されるクラス テンプレートの静的メンバーへの未定義の参照

以下をご覧ください。

そのため、まだインスタンス化されていないBlob Blob::prototype;ためにクラッシュするように見えるので、次の行でインスタンス化を試みます。Factory<0>::map

ただし、コンパイルされません (GCC 4.8.1 を使用):

0 投票する
3 に答える
6893 参照

c++ - 静的初期化順序「大失敗」を防止、C++

素晴らしいC++ の FAQを読んでいたとき (本当に良かったです!!) 、静的な初期化順序「大失敗」を防ぐ方法についてのトピックを読みました。したがって、著者は、変数の作成順序を維持することで「大失敗」を防ぐために、静的変数を関数にラップすることをお勧めします。しかし、これは失礼な回避策のように思えます。だから私の質問は、この「大失敗」を防ぎ、「静的なもの」を関数にラップする、よりパターン指向の最新の方法はありますか?

0 投票する
1 に答える
79 参照

linker-errors - 静的初期化順序の大失敗: ライブラリ X が Protobuf の完了後にのみリンクされるようにするにはどうすればよいですか?

Google Protobuf (バージョン 4.2) とライブラリ 'X' の 2 つのライブラリがあります。初期化時に X の特定のオブジェクトが protobuf の特定の関数を使用するため、アプリケーションがクラッシュします。ライブラリ X が最初にリンクされ、続いてProtobuf .. ライブラリ X が Protobuf の完了後にのみリンクされるようにするにはどうすればよいでしょうか? 同じことを行うためのリンカーオプション/フラグはありますか?

0 投票する
1 に答える
561 参照

c++ - プログラム内の静的 C++ オブジェクトの初期化順序を表示しますか?

オブジェクト ダンプを取得して、静的 C++ オブジェクトが構築される順序を出力しようとしています。ヘッダーを見つけまし-hたが、objdump をこれ以上進めることができないようです。

なしでコンパイルされたプログラムinit_priority

でコンパイルされたプログラムinit_priority

私の次のステップは と を検査することだと確信して.init.init_arrayますが、それを行うためのオブジェクトダンプを取得できないようです:

コンパイルされたプログラムで静的 C++ オブジェクトの初期化順序を表示するにはどうすればよいですか?


C++静的オブジェクトの初期化順序のinit_priortyを確認する方法から? objdump -hまたはを使用して、それに関する情報を取得できることを知っていますreadelf -S

たとえばinit_priority、オブジェクト ファイルに関連付けられた値を確認できます。

上記ではinit_priority、値がオブジェクト ファイル ( .init_array.00275) に存在することがわかりますが、プログラムにリンクされた変数や最終的な順序については何もわかりません。


最近 GCC の に切り替えたinit_priorityので、QA ステップを追加して、有効なときにオブジェクトの順序が指定どおりであることを確認しようとしています。init_priorityが有効でないときのオブジェクトの順序も見たいです。


これはまだ問題です。新しいセルフテストを追加して以来、特定の文字列を適切なタイミングで初期化することはできません。init_priorityオブジェクト ファイルを初期化する必要がある正確な順序で配置しても、オブジェクト ファイルの順序を尊重するようにリンカーに強制する方法を参照してください。 )。

ライブラリまたはプログラム内の静的 C++ オブジェクトの初期化順序を表示しますか?で、Binutils メーリング リストに未解決の質問があります。

0 投票する
0 に答える
397 参照

c++ - リンカにオブジェクトファイルの順序を強制する方法は?

初期化されていない読み取りで Valgrind の結果をキャッチしています。私はそれがどこから来たのかを正確に知っています -ストレージクラスを持つファイルでstd::string宣言された空のものです。cppstatic

のストレージ割り当てを持つオブジェクト ファイルはstd::string、静的アーカイブの最初にリストされます。

さらに、リンクのレシピを次のように変更しました (ばかげているように見えます)。

上記は、静的初期化子が実行される最初の初期化子であることを確認するためlibrary.aに最初にリストされています。これらはシングルパスリンカーであるため、テストオブジェクトのすべてのシンボルを確実に見つけることができるように、もう一度リストされます。std::stringlibrary.a

OS X と Linux の両方での Valgrind の結果から、リンカーはオブジェクト ファイルの順序と静的初期化を尊重していないようです。

2 つの質問があります。まず、Apple のリンカにオブジェクト ファイルの順序を強制するにはどうすればよいですか? 次に、GNU のリンカにオブジェクト ファイルの順序を強制するにはどうすればよいですか?


リンカー スクリプトは使用できません。GCC の人々は、それらを使用しないように明確に伝えています。さらに、Apple プラットフォームでのフォーマットもよくわかりません。


これは、init_priorityが利用できない場合のフォールバックです。残念ながら、多くのプラットフォームでは利用できません。最新の GNU リンカーだけがそれを持っており、Apple には完全に欠けています。

(私たちのテストは、GCC 3.2 を使用した Fedora 1 から Windows 2000 まで、かなり遡ります)。

0 投票する
1 に答える
181 参照

gnu-make - ランダマイズ ターゲットの目標を立てる

C++ ライブラリがあり、いくつかの C++ 静的オブジェクトがあります。ライブラリは、C++ の静的初期化の大失敗に悩まされる可能性があります。*.oビルド中にファイルの順序をランダム化することで、予期しない翻訳単位の依存関係を精査しようとしています。

GNU マニュアルの2.3 How make Processes a Makefileにアクセスしたところ、次のように表示されました。

目標は、最終的に更新しようとする目標です。コマンドラインを使用してこの動作をオーバーライドできます (目標を指定する引数を参照) ...

9.2 目標を指定するための引数にも従いましたが、治療は提供されませんでした。それは私を驚かせませんでした。

Makeの目標をランダム化することは可能ですか? もしそうなら、どうすればいいですか?

そうでない場合、代替手段はありますか?これはテスト環境にあるため、GNUmake だけでなく、より多くのツールを利用できます。

前もって感謝します。