問題タブ [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.
c++ - 厳密なエイリアシングはcまたはc++のものですか?
ISO / IEC 9899:TC2では、規格は次のように述べています
6.3.2.3ポインター
- オブジェクトまたは不完全な型へのポインタは、別のオブジェクトまたは不完全な型へのポインタに変換される場合があります。結果のポインタがpointed-toタイプに対して正しく整列されていない場合、動作は定義されていません。それ以外の場合、再度変換すると、結果は元のポインターと同じになります。オブジェクトへのポインタが文字型へのポインタに変換されると、結果はオブジェクトの最下位アドレスバイトを指します。オブジェクトのサイズまでの結果の連続的な増分は、オブジェクトの残りのバイトへのポインターを生成します。
したがって、あるタイプのポインタを別のタイプのポインタにキャストできることは、標準からは明らかではありません。
c++ - C/C++ の厳密なエイリアスを正しく理解していますか?
C/C++ strict aliasing に関するこの記事を読みました。同じことがC++にも当てはまると思います。
私が理解しているように、厳密なエイリアシングは、パフォーマンスの最適化のためにコードを再配置するために使用されます。そのため、異なる (C++ の場合は関連のない) 型の 2 つのポインターが同じメモリ位置を参照することはできません。
これは、メモリが変更された場合にのみ問題が発生する可能性があるということですか? メモリ アラインメントに関する考えられる問題は別として。
たとえば、ネットワーク プロトコルの処理や逆シリアル化などです。動的に割り当てられたバイト配列があり、パケット構造体は適切に配置されています。reinterpret_cast
私のパケット構造体にそれを渡すことはできますか?
c++ - c++の厳密なエイリアシングの問題---私を夢中にさせる
わかりました...厳密なエイリアシングをオン(および-O3)にして、このコードを機能させようと必死になっています。
コードを短くすることができなかったので(sry ...)、かなり長い〜170行です...
この問題は簡単に説明できます。-fstrict-aliasingなしで機能し、問題が発生します。
「ブレーク」とは「クラッシュ」を意味します。どちらの場合も機能させるのを手伝ってください:P
ありがとう!!! 事前に(私は数時間試しました...)
編集:
それはクラッシュします。
基本的に何が悪いのかわからないので、コードパスを取り除いて再試行することで物事を絞り込もうとしました...しかし、それは私をどこにも連れて行きませんでした。
編集:いくつかのコメントを追加しました
c++ - このハックはエイリアシング警告UBを削除しますか?
コンパイラをgcc4.6にアップグレードしたところ、これらの警告がいくつか表示されます。現時点では、コードベースはc ++ 0xでコンパイルできる状態ではなく、とにかく、これをprodで実行したくないので(少なくともまだ)、この警告を削除するための修正が必要でした。
警告は通常、次のような理由で発生します。
後で、これは次のように使用されます
たとえば、読んだり、更新したり、戻ったりするには、次のキャストが発生していました
これは4.4で問題ありませんでした。4.6では、上記は以下を生成します。
警告:型のパンニングされたポインタは厳密なエイリアスルールに違反します
このエラーを取り除くためのクリーンな方法は、を使用することですがunion
、前述のように、c ++ 0x(したがって無制限のユニオン)を使用できないため、以下の恐ろしいハックを採用しました-警告はなくなりました、しかし私は鼻のデーモンを呼び出す可能性がありますか?
これは問題なく機能しているように見え(ここの簡単な例を参照:http ://www.ideone.com/9p3MS )、警告は生成されません。これはc ++ 0xまで使用しても問題ありませんか(様式的な意味ではありません)。
注:私は一般的に使用したくない-fno-strict-aliasing
...
編集:私は間違っていたようです、同じ警告が4.4にあります、私たちは最近これを変更しただけだと思います(コンパイラの問題である可能性は常に低いです)、しかし問題はまだ残っています。
編集:さらなる調査により、いくつかの興味深い情報が得られました。コードが次のように2行に分割されている場合、キャストを実行してメンバー関数を1行で呼び出すことが、警告の原因であるようです。
これは実際には警告を生成しません。その結果、ideoneの簡単な例に欠陥があり、さらに重要なことに、上記のハックでは警告が修正されません。修正する唯一の方法は、キャストから関数呼び出しを分割することです。キャストはとして残すことができますreinterpret_cast
。
c - C メモリ アロケータと厳密なエイリアシング
厳密なエイリアシング規則についてかなり読んだ後でさえ、私はまだ混乱しています。私がこれを理解している限り、メモリは割り当てごとに異なる型を格納するために使用される可能性があるため、malloc は解放されたメモリを再利用できないため、これらの規則に従う適切なメモリ アロケータを実装することは不可能です。
明らかに、これは正しくありません。私は何が欠けていますか?厳密なエイリアシングに従うアロケータ (またはメモリ プール) をどのように実装しますか?
ありがとう。
編集:ばかげた簡単な例で私の質問を明確にしましょう:
gcc - O1 または O2+no-strict-aliasing でのみ gcc 4.4.4 最適化エラー
回答後の承認の概要: 問題は、スコープ外になったスタック変数へのポインターの使用でした。最適化とは何の関係もありませんでした。valgrind がスタックエラーを見つけられないのは残念です...
gcc 4.4.4 (CentOS 5.5) で -O1 レベルの最適化を有効にした場合にのみ表示される segfault があります。他のすべての最適化レベル (0、2、3、s) は問題ありません。縮小したテスト ケースはまだ作成できていませんが、スタックが上書きされる原因となる配列オフセット計算に関連しているようです。
-O1 を有効にして、フラグ ( http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html )を持つすべての最適化を無効にしても、バグは引き続き発生します。
-O2 (またはその他のレベル) を使用しても問題はありません。O2 を使用して厳密なエイリアスを無効にすると-fno-strict-aliasing
、segfault が返されます。
編集:-fstack-protector-all
ビルドフラグ(またはのいずれO1
か)に追加するとO2 -fno-strict-aliasing
、segfaultが消えます。
そのため、厳密なエイリアスによって無効にされている O1 でデフォルトで発生する最適化が原因であると思われます。
これはコンパイラのバグだと思います (しかし、縮小されたテストケースがなければ、それを証明することはできません)。これは、迅速なターンアラウンドが必要な本番サーバーです。通常の最適化レベルは O1 ですが、O2 に変更するのは気が進まないのです。なぜなら、この修正は元の問題よりも危険であると思われるからです。
いくつかの提案をいただければ幸いです。現在、gcc 4.4.6 をコンパイルして、それが修正されるかどうかを確認しようと考えています。しかし、何が問題を引き起こしているのかわからないということは、少し心配です。
編集:サーバーは-Wall -Werror
(およびその他のいくつか)でコンパイルされます。valgrind ではエラーなしで実行されます (valgrind はヒープ アクセスをチェックしますが、これはスタック関連のエラーのようです)。
c++ - 奇妙な C++ 厳密エイリアス警告
unique_pointer
以下は、まだ問題が発生している のようなクラスの実装のための私のコードの簡略化されたバージョンです。
でコンパイルされた g++ 4.4.3 を使用すると-O2 -fstrict-aliasing -Wstrict-aliasing
、dereferencing pointer <anonymous> breaks strict-aliasing rules
上記のタグが付いた行で次のようになります。これはたまたま Ubuntu 64 ビット システム上にあります。Mac OS X Lion で g++ 4.6.1 を使用して同じコードをコンパイルしても、警告は表示されません。
厳密なエイリアス規則は一般的に理解しています (またはそう思う) が、問題の行について不平を言っている理由がわかりません。
g++ 4.4.3 は間違っていますか? それが正しいと仮定すると、どのようにコードを微調整して警告を取り除くことができますか?
c++ - Boost - ビルド時のポインターの逆参照に関する警告
Boost Web サイトの「はじめに」チュートリアルに従っています。次のコマンドを使用して、個別にコンパイルされたライブラリを構築しようとしています。
その後
構築中に、私はこれらの警告をたくさん (数百のように) 受け取っています:
それが私の側に問題があるかどうか、これらの警告を取り除くために何かできるかどうかを知りたいですか?
ありがとう。
(Boost 1.48、Ubuntu 10.04.3 LTS)
c++ - g++で厳密なエイリアシング警告を有効にする
g ++で厳密なエイリアシング警告を有効にする正しい方法は何ですか?VC ++ 10はそれらのルールを実装していますか?
c++ - gcc 4.6.1 のバグに関する厳密なエイリアスリング警告
私はgccで以下をコンパイルしようとしています-pedantic-errors -pedantic -Wall -O2
しかし、厳密なエイリアシングの警告は表示されません。私も有効にしようとしました
しかし、まだ警告はありません。これはバグですか?