非常に単純なコードからの「違法なハードウェア命令」


9

疑わしい主張を調査ながら、私はこの小さなテストプログラムを書きました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です」という疑わしい主張が強化されています。まだ信じられないけど。本当に!?あなたは安全にスピンループを書くことができないのですか?

だから私は私の質問だと思います:

  1. これは何が起こっているのか正しい読みですか?
  2. もしそうなら、誰かがそれを検証する公式のリソースを私に示すことができますか?
  3. このタイプの最適化を実行したい状況は何ですか?

関連情報

$ clang --version
Apple clang version 11.0.0 (clang-1100.0.20.17)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

3
IIRC、signed intオーバーフローはUBです。
wildplasser

1
^^^^ ie int n = 0===> unsigned int n = 0;またはそれ以上..while (1);
WhozCraig

1
うーん...コンパイラエクスプローラーのclangは、-O gcc.godbolt.org/z/NTCQYTを使用した自己ターゲットジャンプ命令と、それを使用しない行ごとの変換を取得します。多くのバージョンで一貫しているようです。しかし、C規格では、副作用のない場合の非終端はubであると述べていることも(調べませんが)思い出します。ハンスベームは
Gene

1
未定義の動作は、無限ループではなく、符号付き整数オーバーフローです。次のunsigned int
MM

2
@Gene言っているとは思いません。const以外の制御式を使用したSideffect-freeループは終了すると想定される場合があります(port70.net/~nsz/c/c11/n1570.html#6.8.5p6)が、ビジーループは問題ないはずです。UD命令では例を再現できませんが、UBは整数オーバーフローにあります。
PSkocik

回答:


3

現在問題となっているコードのud2を取得した場合、コンパイラーは適合Cコンパイラーではありません。コンパイラのバグを報告できます。

C ++では、このコードは実際にはUBであることに注意してください。スレッドが追加されたとき(それぞれC11とC ++ 11)、マルチスレッドではないプログラムのメイン実行スレッドを含む、すべてのスレッドのフォワードプログレス保証が導入されました。

C ++では、例外なく、すべてのスレッドが最終的に進行する必要があります。ただし、Cでは、制御式が定数式であるループが進む必要はありません。私の理解では、Cがこの例外を追加したのは、組み込みコーディングでwhile(1) {}スレッドをハングさせるためにa を使用することがすでに一般的な慣習だったからです。

より詳細な回答のある同様の質問


はいud2、Cコードから取得しますが、C ++のフォワードプログレス保証に関する情報(調査できるようです)を含めていただき、ありがとうございます。質問を準備していました。
ルキ

標準委員会が言っていたと思うより良い言い方は、特定の操作を過ぎてループ内のすべてを延期してもプログラムの動作に目に見えて影響がない場合、その操作の全体としてループの実行を延期することは、観察可能な行動の変化。
スーパーキャット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.