問題タブ [strict-aliasing]
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.
wireshark - tshark を実行可能にする方法
Wireshark 1.7.1 をダウンロードして解凍した後、gtk を無効にして構成を行いました。しかし、その後、「make」を行うことができません。次のエラーがスローされます。
cc1: 警告はエラーとして扱われます packet-h248_annex_e.c:679: 警告: 型がパニングされたポインターを逆参照すると、厳密なエイリアス規則が破られます。
このwiresharkバージョンの構築とインストールを手伝ってくれる人はいますか?
c++ - aligned_storage と厳密なエイリアシング
現在、Align_storage を使用して、boost::optional と同様の「オプション」タイプを実装しています。これを達成するために、私は次のようなクラスメンバーを持っています:
オブジェクトを作成するために新しい配置を使用しますが、返されたポインターをどこにも保存しません。代わりに、次のようにすべてのメンバー関数でオブジェクトの基になる型にアクセスします (明らかに、Optional 型にも格納されているブール値フラグを介してオブジェクトが有効であることを確認します)。
私の質問は、これが安全かどうかです。私の理解では、placement new を使用すると、オブジェクトの「動的タイプ」が変更されます。そのタイプを使用してメモリにアクセスし続ける限り、問題はありません。ただし、新しい配置から返されたポインターを保持する必要があるかどうか、またはアクセスする必要があるときはいつでも基になる型にキャストできるかどうかは明確ではありません。私は C++11 標準のセクション 3.10 を読みましたが、確かに標準語に堪能ではありません。
可能であれば、回答で標準を参照していただければ幸いです(夜の睡眠に役立ちます:P)。
c - 厳密なエイリアシング ルール、偽陽性または偽陰性?
C の厳密なエイリアシングに問題があります。GCC 4.7.1 を使用しています。
例 1:
-fstrict-aliasing -Wstrict-aliasing=3 を指定してこのコードをコンパイルすると、「警告: 型がパニングされたポインターを逆参照すると、厳密なエイリアス規則が破られる」というメッセージが表示されます。
例 2:
このコードは、-fstrict-aliasing および -Wstrict-aliasing=3 または -Wstrict-aliasing=2 または -Wstrict-aliasing=1 を指定しても警告を出さない
どちらの例も正しく機能します。
ユニオンの使用も未定義の動作であり、私の場合、 memcpy() の使用は遅すぎます。
では、最初の例は安全 (偽陽性) でしょうか、それとも 2 番目の例も安全ではありません (偽陰性) でしょうか? それとも ...?
ありがとう。
c - const へのポインタから const を削除すると、C の厳密なエイリアシングに従い、同じオブジェクトを参照しますか?
次の C のコードには動作が定義されていますか?
6.5/7 では、有効なエイリアスとして「オブジェクトの有効な型と互換性のある修飾された型のバージョン」がリストされているため、質問します。しかし、オブジェクトの有効な型は であり、修飾されたバージョンではconst int
ないと思います(ただし、逆は真です)。どちらも互換性がありません(6.7.3/10)。int
const int
int
const int
さらに、6.3.2.3/2 は、修飾子を追加することでポインター型を変換できること、および結果のポインターが等しいことを示しています。6.3.2.3/7 は、任意の 2 つのポインター型を変換できることを示しています (したがって、キャスト(int*)(&i)
自体が許可されます)。しかし、結果のポインターが同じオブジェクトを参照しているとは言っていません。元の型 (この場合は ) に戻すことができるということだけconst int*
です。つまり、エイリアスが合法であっても、ポインター変換が実際に を参照するポインターになることを標準が保証していることは明らかではありませんi
。
それで、標準は実際に私のコードの動作を定義していますか?もしそうなら、これはどこで定義されていますか?
コードが実際に機能することは承知しています。私は、それが機能しない架空の(そして奇妙な)実装を念頭に置いています。その実装が標準に準拠しているかどうか (および、準拠していない場合はどの部分に違反しているか) を尋ねることはできますが、私の想像上の実装が準拠していない他の点がある場合は、水を濁したくありません。誰かが質問に答えるのに役立つと思う場合は、実装について説明します。
c - インプレース浮動小数点型のプロモーションループを作成する正しい方法は?
単精度データの配列を、余分なバイトを処理するために配列が適切なサイズになっていることを使用して、倍精度にプロモートするルーチンがあります。
入口にx
はn
float
sが含まれ、出口にはn
double
sが含まれます。
なぜ私はこれをしているのですか?数値が多いコード内の混合精度の反復的な改良。この質問の目的のために、あなたはその理由を本当に無関係であるとして無視することができます。
複数のコンパイラはdpromote
、厳密なエイリアシングが有効になっているさまざまな積極的な最適化レベルのロジックで問題ありません。最近、あるコンパイラベンダー(名前は不明のまま)は、ループのインデックスを再作成して、後方トラバーサルではなく、メモリを介した前方トラバーサルになるようにすることを決定しました。コードを30分見つめると、ループ変換によってまったくのゴミが発生することがわかります。
すべてのC99厳密なエイリアスのベルとホイッスルが有効になっているdpromote
ロジックは、未定義の動作に依存していますか?コードが未定義のことをしていない限り、コンパイラがループのインデックスを変更しても問題ないと考える理由がわかりません。
c++ - プリミティブ型ポインター間のキャスト
以下は明確に定義されていますか?
が適切に配置されていません(intPtr
少なくとも 2 つのケースのうちの 1 つで)。持っているだけで違法ですか?UBはどの段階で使用していますか?どのように使用でき、どのように使用できないのですか?
c++ - C++ の厳密なエイリアス規則を回避する
限られた数のアイテムをコンテナに格納したい。不要なオブジェクト コンストラクターの呼び出しを避けたいので、配列を使用したくありません。std::vector
暗黙的な呼び出しのため、使用したくありませんmalloc
(最大のキャッシュ コヒーレンスのためにヒープへのアクセスを最小限に抑えたい)。
そこで、次のような独自のカスタム コンテナーを定義することにしました。
しかし、実際にこのコンテナーを使用しようとすると、厳密なエイリアス規則に違反しているというコンパイラの警告が表示されます。厳密なエイリアシングについて読み、コンパイラの最適化によって上記のコードが壊れる理由を理解しました。
どうすればこれを回避できますか?
奇妙なことに、私のコンパイラーは私のカスタムobject_pool
クラスについて何の不満も持っていません。特に、連想 STL データ構造のカスタム アロケーターとして使用しています。そのクラスは上記のものと非常によく似ています ( achar[]
を使用し、同様のキャストを行います)。2つの違いが何であるかわかりません。
c - 制限ポインターを使用した GCC エイリアシング チェック
次の 2 つのスニペットを検討してください。
関数をコンパイルするとgcc-4.7.2 -Ofast -march=native -std=c99 -ftree-vectorizer-verbose=5 -S test.c -Wall
、GCC が 2 番目の関数のエイリアシング チェックを挿入することがわかりました。
fn1
の結果のアセンブリが のアセンブリと同じになるように、これを防ぐにはどうすればよいfn0
ですか? (パラメータの数が 3 から、たとえば 30 に増えると、引数を渡すアプローチ ( fn0
) は扱いにくくなり、アプローチのエイリアシング チェックの数はfn1
ばかげたものになります。)
アセンブリ (x86-64、AVX 対応チップ); .LFB10 でのエイリアシング クラフト