タグ付けされた質問 「undefined-behavior」

言語の規則に違反するプログラムのコンパイルまたは実行の予期しない結果は、コンパイラー、インタープリター、ランタイムシステムのいずれも強制する必要はありません。「未定義」のデータ型または戻り値に関する質問には、このタグを使用しないでください。そのような場合は、代わりに[undefined]タグを使用する必要があります。

1
非常に単純なコードからの「違法なハードウェア命令」
疑わしい主張を調査しながら、私はこの小さなテストプログラムを書きましたnoway.c int proveit() { unsigned int n = 0; while (1) n++; return 0; } int main() { proveit(); return 0; } これをテストすると、私は得ます: $ clang -O noway.c $ ./a.out zsh: illegal hardware instruction ./a.out ワット。 最適化せずにコンパイルすると、期待どおりにハングします。私はアセンブリを見て、すべてのベルとホイッスルがないと、main関数は次のようになります。 _main: ## @main pushq %rbp movq %rsp, %rbp ud2 どこud2が明らかに未定義の動作専用の命令です。前述の「決して戻ることのない機能はUBです」という疑わしい主張が強化されています。まだ信じられないけど。本当に!?あなたは安全にスピンループを書くことができないのですか? だから私は私の質問だと思います: これは何が起こっているのか正しい読みですか? もしそうなら、誰かがそれを検証する公式のリソースを私に示すことができますか? このタイプの最適化を実行したい状況は何ですか? …

2
無効なポインターを生成する関数参照をキャストしますか?
私はサードパーティのコードのエラーを追跡しており、それを何かに沿って絞り込みました。 use libc::c_void; pub unsafe fn foo() {} fn main() { let ptr = &foo as *const _ as *const c_void; println!("{:x}", ptr as usize); } 安定した1.38.0で実行すると、関数ポインタが出力されますが、ベータ版(1.39.0-beta.6)で毎晩「1」を返します。(遊び場) _推論されているものは何ですか?なぜ動作が変更されましたか? これをキャストする正しい方法は単にであるとfoo as *const c_void思いますが、これは私のコードではありません。

1
std :: ptr :: writeは、書き込むバイトの「初期化されていない状態」を転送しますか?
FFIの境界を越えてポインターサイズのintに収まるトランザクション型を支援するライブラリを開発しています。次のような構造体があるとします。 use std::mem::{size_of, align_of}; struct PaddingDemo { data: u8, force_pad: [usize; 0] } assert_eq!(size_of::<PaddingDemo>(), size_of::<usize>()); assert_eq!(align_of::<PaddingDemo>(), align_of::<usize>()); この構造体には、1データバイトと7パディングバイトがあります。この構造体のインスタンスをaにパックしusize、FFI境界の反対側でアンパックします。このライブラリーは汎用なので、私はMaybeUninitand を使用していptr::writeます: use std::ptr; use std::mem::MaybeUninit; let data = PaddingDemo { data: 12, force_pad: [] }; // In order to ensure all the bytes are initialized, // zero-initialize the buffer let mut packed: …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.