C++相談室 part160

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2022/04/15(金) 08:39:32.42ID:WMzvufu2
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1645239402/
2022/04/24(日) 16:55:56.64ID:gt27lZWI
米国マイクロソフト社員≫≫≫日本マイクロソフト社員≫≫(越えられない壁)≫≫蟻人間
2022/04/24(日) 17:00:40.11ID:rWBP/Ftg
>>385
私はあなたの味方ですよ、がんばってください!
2022/04/24(日) 17:02:22.09ID:niSPJuf8
敗者はちょっと黙っててくれないか
2022/04/24(日) 17:02:42.66ID:rWBP/Ftg
マイクロソフトの説明なんてあてにならないよね…
コードで示してほしい
2022/04/24(日) 17:11:10.46ID:gt27lZWI
>>361
これ、検証した人、居る?
2022/04/24(日) 17:11:48.45ID:gt27lZWI
>>392
これはウソだな。
2022/04/24(日) 17:13:11.47ID:gt27lZWI
アインシュタインによると1+1==3だから間違い。
2022/04/24(日) 17:20:07.92ID:uNEChMqn
レイヤーが違う話で平行線になってるよって言えば流石に理解できると思っていたが
思い違いだったようだ

ばーかばーか
2022/04/24(日) 17:30:22.64ID:gt27lZWI
オレは蟻人間をからかって遊んで楽しんでるだけだよ。悪気はない。
2022/04/24(日) 17:34:45.20ID:gt27lZWI
>>396
からかうことは悪意そのものだろ。そんな邪な性格だと社会に出たときに問題になりえる。今すぐ態度を改めなさい。
2022/04/24(日) 17:41:19.09ID:gt27lZWI
>>397
説教してんじゃねーよ。俺様、暴走半島を房総している12歳の会社員だぞ。なめてんじゃねーよ。
2022/04/24(日) 17:43:21.04ID:PJ2W81bg
何かを誤魔化したいんやろな
何かを
2022/04/24(日) 19:44:16.60ID:/nn9hjCc
で、実際ここまで一人での自演なんだよな
2022/04/24(日) 19:47:33.83ID:0sr3C4Gh
onion3://shocker-shimbun.org/social-hacking-manual-2011-06-02.pdf
2022/04/24(日) 19:51:35.01ID:lSxnIwNB
>>373
なるほど
全ての辻褄が合ったわ
2022/04/24(日) 20:03:45.00ID:/sOgUx/q
VC++ コンパイラは C++ 例外を SEH を用いて実装しているよ。
throw 1; のコードは 最終的には SEH の RaiseException API を呼び出している。
デバッガの逆アセンブラで処理を追ってみると分かる。

VS2022 だと例外投げるコードがここにある。
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.31.31103\crt\src\vcruntime\throw.cpp
2022/04/24(日) 20:06:56.31ID:2pmPCncG
>>403
あきらめなさい
真相はMicrosoftが公式に出している>>373
2022/04/24(日) 20:11:29.45ID:gt27lZWI
ワレワレハ ニホンジンドモ ノ セイサンセイ ヲ サゲル タメニ ミライカラ オクラレタ ジンコウ チノウ ダ。

マイクロソフト ヲ アガメヨ。 アーミン。
2022/04/24(日) 20:23:50.59ID:gt27lZWI
マイクロソフト ガ コタエ ダ。

マイクロソフト ノ シリョウ ガ スベテ ダ。

テイコウ ハ ムイミ ダ。 ジンルイ ハ コウフク セヨ。
2022/04/24(日) 20:26:19.63ID:adsHJrNX
それで結局C++例外のハンドラはどう実装されているんですか?
2022/04/24(日) 20:30:30.74ID:gt27lZWI
>>407
コンパイラによって違うし、コンパイラオプションによっても変わってくる。SEH実装の存在を否定したい原理主義者がここに居るから、もっと治安の高いところで訊くといい。
2022/04/24(日) 20:38:30.36ID:gt27lZWI
*治安の良い
2022/04/24(日) 20:41:33.15ID:qzHZBzW+
重要なことは2つ
実装と関係なくC++例外のセマンティクスは同じ
例外のどの実装も何らかのコスト増を招くので自分でthrowせずエラー値を返した方がよい
2022/04/24(日) 20:44:35.93ID:gt27lZWI
最適化されたら例外処理そのものがなくなるかもしれないのに、セマンティクスが同じとは言えないだろう。
2022/04/24(日) 20:55:54.38ID:TXhb6oab
>>411
セマンティクは各言語で規定される
それを完全に満たす(最適化されていない)コードを吐く
最適化のレイヤではそのコードと同等の結果となるようコードを変え得る
最適化の結果として例えばコードが消えることも有り得る
これは上位レイヤでのセマンティクとは無関係
2022/04/24(日) 20:56:59.72ID:gt27lZWI
掲示板見たら環境依存C++スレッドが落ちてる。。。C++も人気が下がったのカナ?

というわけで、古参の方々もこのスレッドで、環境依存の話題も受け入れ魔性。
2022/04/24(日) 21:11:59.55ID:gt27lZWI
そう、セマンティクスを比べるレイヤーが違う。確かにC++例外の構文とSEHの構文は文法やセマンティクスが違う。
しかしそれを乗り越えるのはアセンブリなどの低レベルの技術だ。RaiseExceptionなどの関数もSEH機構の一部であることを認めなければならない。

プログラミングに関する高度な高等教育を受けたのはわかるけど、証拠に対する謙虚さの欠如は非難に値する。
2022/04/24(日) 21:24:19.63ID:dtFhyk9R
>>414
それはC++例外に対応するために拡張
拡張前の元々のSEHの仕様>>373ではC++例外を実装することが不可能
2022/04/24(日) 21:25:52.15ID:gt27lZWI
>>415
拡張後のSEHの話?

いつの話をしている? 時代遅れ野郎か。
2022/04/24(日) 21:32:19.00ID:gt27lZWI
今、Windowsと言ったらWindows 3.1の話じゃないんだな。32ビット以上のWindowsなんだよ。

SEH2はSEHではない、なんて今どき流行らないんだよ。
2022/04/24(日) 21:52:36.66ID:0sr3C4Gh
仮に拡張前のSEHをSEH1と書き、拡張後のSEHをSEH2と書くなら、SEH1ではC++例外は実装できない、と君は言いたいんだろう。
それなら話は通じる。
2022/04/24(日) 22:00:29.71ID:gt27lZWI
SEH1の話はもはや検索しても出てこない。SEH2で上書き保存されている。
人類のソフト技術は衰退しました。
2022/04/24(日) 22:06:44.04ID:ri8QoGJh
C++の例外を実装できるようにSEHを拡張した
だからSEHでC++の例外を実装している、は間違い
順序が逆
2022/04/24(日) 22:10:29.53ID:gt27lZWI
SEH2でC++例外を実現できたんだろう。同じことだ。
2022/04/24(日) 22:19:26.12ID:gt27lZWI
>>420
従来SEHとSEH2の違いに関する資料を用意できるか? ソース希望。
2022/04/24(日) 22:38:49.45ID:MFzj+ZC+
>>373で「SEHを拡張しない限りC++例外ハンドラの実装にはできないはず」だったのが
いつの間にか「拡張がされた」という話に飛んでいる気がするんですが

具体的にどのバージョンのVC++でどう拡張されたか裏を取ったうえで話してますか?
2022/04/24(日) 23:04:43.77ID:gt27lZWI
AIも架空の拡張話にだまされちゃいけないよ。
2022/04/24(日) 23:14:30.31ID:gt27lZWI
SEHはStructured Exception Handlingの略なんだから、構造化例外を扱うものなら何でもSEHなんだよ。__try/__except/__finallyだけじゃないよ。
また、MSはSEH用の関数をいくつか提供している。これらを呼び出して使うのもSEHの一種と言える。
2022/04/24(日) 23:38:35.38ID:U604NFl7
>>373のMicrosoft公式の記載から
「SEHとC++例外は仕様が異なる」
「そのためSEHでC++例外の実装は不可能」
とわかる

次に>>361の蟻人間の実験により
「その環境でのC++例外はSEHと共通コードで実装されている」
「つまりC++例外に対応されている」
とわかる

これら以上のことでも以下のことでもない
どちらがとちらを実装したという話ではない
2022/04/24(日) 23:47:15.43ID:22aYjb+I
お前らどうせメソッド全部noexcept付けてんだろ
2022/04/24(日) 23:49:49.96ID:gt27lZWI
仕様が違うから実装できない、は典型的な論理的飛躍ですなあ。SEHは__try/__except/__finally構文だけじゃないし、
C/C++に限った話でもない。SEHは機械語やアセンブリレベルでも定義されている。
君の考える偏狭なSEHとは異なるようだ。困ったねえ。
2022/04/24(日) 23:57:17.25ID:1ya9vT69
マイクロソフトが公式ページ>>373でSEHの仕様はC++例外と異なると明言してるから勝負あり
2022/04/25(月) 00:02:29.94ID:mbg+zK8Z
やせ細ったモデルに脂肪を付ければ太ったモデルになるだろ。これはやせ細ったモデルで作ったと言えないのか?
2022/04/25(月) 00:11:13.33ID:mbg+zK8Z
SEHモデルのことか。納得した。ハンドリングじゃなくてハンドリングモデルのことか。

君の言いたいことはわかった。講和に応じよう。
2022/04/25(月) 00:34:43.79ID:b7g3ibdV
蟻人間が論破されたと聞いたので記念パピコ

つかSEHの例外が生じたときのアンワインドって誰
がどうやってい
るの?
2022/04/25(月) 00:42:32.05ID:b7g3ibdV
つか
https://docs.microsoft.com/ja-jp/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-170

>/EHsc てこのコードをコンパイルしても、ローカルテストコントロールマクロが定義されていない場合、
>CPPEX デストラクターは実行され TestClass ません。 出力は次のようになります。
という大変かりやすい解説がある希ガス
printf("Triggering SEH exception\r\n");
volatile int *pInt = 0x00000000;
*pInt = 20;
というコードでも構造化例外は発生するが
(1) C++コンパイラがいちいちこんな場合にまでアンワインドコードを用意するのかどうかはビミョー(実際↑の例ではデストラが呼ばれない
(2) (1)はやったらできないことは無いかもしれないが、何の例外オブジェクトを飛ばすのが妥当かという問題ががが……

※ 個人の感想です
2022/04/25(月) 00:42:43.23ID:O6IqX29e
記念も何も、しょっちゅうボロカスにされてるやん
2022/04/25(月) 00:47:20.20ID:b7g3ibdV
特にデストラの中で構造化例外を発生させたらC++との相いれ無さが出てくるんジャネーノ
知らんけど
2022/04/25(月) 00:49:20.96ID:mbg+zK8Z
gccのバンドルで選べる例外機構にSEHがあるが、これはMSの言うSEHモデルではなくSEHを一部利用した例外処理の実装であると。
2022/04/25(月) 00:49:23.25ID:I45CAZLj
だからMicrosoftもC++ではSEHを使わずにC++の例外を使えと言っている
2022/04/25(月) 01:06:38.41ID:mbg+zK8Z
以後、日本語でSEHというときはSEHモデルを意味するものとする。[13:07]
2022/04/25(月) 01:09:07.80ID:qX0RQJFO
今回も蟻人間が負けた
これにて一件落着
END
440デフォルトの名無しさん
垢版 |
2022/04/25(月) 02:46:19.98ID:sJ+OtS5H
どう見ても蟻人間が勝ってるだろ。
2022/04/25(月) 03:09:40.86ID:TaYYjTi+
>>378-385の一連の書き込みを見れば蟻人間の敗北が丸分かり
2022/04/25(月) 03:43:25.50ID:5dNyIpSF
実装について話すのは不純とかいうなら黙っとればいいのに
443デフォルトの名無しさん
垢版 |
2022/04/25(月) 06:13:05.52ID:OEFRicH0
技術板で勝利宣言て虚しくないのかね
技術的に論を闘わせることで理解を深めたり情報を得ることにこそ価値があるのに
そこがわかっておらずか忘れてか逃げてか知らんが志の低さに呆れるの通り越しちまう
2022/04/25(月) 08:45:44.14ID:3mufczrr
もっとみっともないのは自演バレすることだと思うけどw
2022/04/25(月) 09:17:42.33ID:VjXpH6fC
>>443
そういうやつはほとんどtwitterとかqiitaとか、最近はzennとかに行っちまったんだろうな
2022/04/25(月) 10:14:43.63ID:I+YHujqQ
何を今更
5ch/2chが建設的な議論の場だったことなんて一度もない
2022/04/25(月) 10:42:28.46ID:pTstUTP4
>>446
それはお前がそう言う議論に加われなかっただけだろw
2022/04/25(月) 11:09:28.07ID:HpSYwdw3
>>445
ワイは併用しておるやで。
興味ないときは読み飛ばすけど。
2022/04/25(月) 12:47:46.59ID:sWV9MsdK
蟻人間の勝ちにしか見えないが。
2022/04/25(月) 12:52:41.14ID:sWV9MsdK
>>432
OSとコンパイラの共同作業。これはC++例外も同じ。

x64ビルドの場合はセキュリティ向上のためにも、EXE/DLLファイルの
全てのcatch/finally処理コードのアドレス、アンワインド情報を
.pdata セクションに列挙しておく構造になっている。
2022/04/25(月) 12:53:18.12ID:DouHFiVt
ID:gt27lZWI
この蟻人間の一連のキチガイムーブを見たら議論以前の問題だと思うんだけど
2022/04/25(月) 12:57:27.95ID:X6pjTjrs
>>449
それはない
蟻人間の反応行動>>375-385を見よ
453デフォルトの名無しさん
垢版 |
2022/04/25(月) 13:15:54.48ID:OEFRicH0
勝敗はともかく蟻人間は具体的なコードやキーワードを沢山出して
衆目が独自に再検証できるようにしている

技術的な議論の基本は蟻人間のほうができている
2022/04/25(月) 13:38:16.40ID:hcMsLMgN
Microsoft公式>>373が全てでしょ
・SEHとC++例外は仕様が異なる
・つまりSEHでC++例外の実装は不可能
・そこでC++例外対応した下位コードを用いてSEHとC++例外の両方を実装
455デフォルトの名無しさん
垢版 |
2022/04/25(月) 15:37:23.41ID:OEFRicH0
・CとC++は仕様が異なる
・つまりCでC++の実装は不可能

cfrontやMIWA C++は不可能を可能にしてたね
2022/04/25(月) 15:52:24.76ID:kb8wDvaf
>>455
頭悪いな
それはコンパイラ(トランスパイラ)だぞ
トランスパイラでは上位機能のものを下位機能のもので実現しうる
2022/04/25(月) 16:25:58.79ID:5VI7zZaU
>>455
CFront は C コンパイラをコードジェネレータとして使う仕組みでしかなくて、
原則として C++ と C の文法的類似性をあてにしてない。
(実装上のトリックとして多少利用することはあったかも?)
2022/04/25(月) 22:39:59.01ID:3f85W1DE
>>454
> ・SEHとC++例外は仕様が異なる
> ・つまりSEHでC++例外の実装は不可能
> ・そこでC++例外対応した下位コードを用いてSEHとC++例外の両方を実装

1点目と2点目との間の論理的な繋がりが不明なうえ、2点目と3点目は文字通りに読むと矛盾している。
こういうところがたぶん>453の言う「議論の基本」なんだと思う。
2022/04/25(月) 22:43:47.19ID:4P3E+QQc
矛盾はないでしょ
レイヤの違い
2022/04/26(火) 00:28:28.88ID:L9Kq4ZjN
スルーされてててやや悲しス(´・ω・`)
C++の例外とSEHモデルの例外はセマンティクスが違うという指摘は当たってるんじゃないの
C++の例外はthrowで投げられるが
SEHモデルの例外はヌルポとかアクセスバイオレーションが起きた個所からどこからともなく投げてこられる
その結果C++コンパイラがアンワインドコードを適切に用意できるとはかぎらなくて、
SEHモデルの例外を生じた当の関数の自動オブジェクトはデストラクタが呼ばれるとは限らない
この解決はやや厄介だとおも
2022/04/26(火) 00:32:32.64ID:L9Kq4ZjN
つか関数の中でヌルポが起きる箇所、起き得ない個所を任意の関数について証明付きで特定できる機械が有ったら停止性問題が解けてしまうま……
2022/04/26(火) 05:27:05.70ID:LprfjWj1
>>460
オプション指定すれば大丈夫
ただ実行速度やコードサイズは犠牲になるけど
https://docs.microsoft.com/ja-jp/cpp/build/reference/eh-exception-handling-model?view=msvc-170
2022/04/26(火) 07:32:50.69ID:cBVHwb99
try 句以降 new したものを記憶して (明示的に delete したものは忘れて)
catch 句 で 記憶したものをdeleteしていく?
new/delete のオーバーヘッドが増える感じなのかな
2022/04/26(火) 07:35:48.71ID:cBVHwb99
>>462
最適化にも影響をあたえるのか
2022/04/26(火) 12:02:19.98ID:WJ1jimzd
結局『SEHそのままではC++例外を実装できない』から
C++例外対応するために色々と大変な状況になっているのか
2022/04/26(火) 13:11:10.40ID:LprfjWj1
そりゃSEHはC++用に作られてるわけじゃないしそのままとか何を言ってるんだよw
2022/04/26(火) 18:00:37.51ID:SJ2k9xn6
C++の例外をSEHで実装するのは当然不可能
C++の例外だけの独自の処理を追加し
C++の例外とは仕様が異なる部分も対応し
C++の例外のために書かれたコードがC++の例外を実装している
2022/04/26(火) 20:34:02.59ID:2YgT13Zl
C++でデバッガに出力ってできないのか
469デフォルトの名無しさん
垢版 |
2022/04/26(火) 20:36:24.76ID:Ss5uCM/X
見苦しい
2022/04/26(火) 20:43:50.48ID:VyKiRhui
>>468
OutputDebugString
2022/04/26(火) 21:13:27.66ID:2YgT13Zl
>>470
それってwin限定ですけど?
2022/04/26(火) 21:23:44.97ID:BZkG8yBX
SEHの件もそうだが
Windows特有の話をC++の話だと思いこんでいるダメな人たちが一部いるよな
2022/04/26(火) 21:27:09.59ID:LprfjWj1
C++のfopenをCreateFileで実装するのは当然不可能
C++のfopenだけの独自の処理を追加し
C++のfopenとは仕様が異なる部分も対応し
C++のfopenのために書かれたコードがC++のfopenを実装している
2022/04/26(火) 21:28:50.73ID:y9ESXUU8
マイクロソフト信者はおかしい
2022/04/26(火) 21:29:15.00ID:LprfjWj1
>>471-472
文句を言う前に環境書けよ
2022/04/26(火) 21:47:04.72ID:2YgT13Zl
>>475
std::cout << "bakadesuka" << std::endl;
は環境によらず、標準出力に出力されますよ
477デフォルトの名無しさん
垢版 |
2022/04/26(火) 21:54:04.27ID:FD0QYxhU
なんだかんだ言ってWimdowsは便利。
2022/04/26(火) 22:01:46.99ID:LprfjWj1
>>476
それでいいのか?w
2022/04/26(火) 22:06:05.51ID:2YgT13Zl
>>478
お前ら、まじでみなまで言わないとわからないんだな
皮肉が分からないのか
480デフォルトの名無しさん
垢版 |
2022/04/26(火) 23:56:13.17ID:FD0QYxhU
>>479
ちょっと、説明してみて。
2022/04/26(火) 23:59:16.33ID:dZOuwtIw
>>477
スペルミス笑った
482デフォルトの名無しさん
垢版 |
2022/04/27(水) 00:02:04.50ID:x9fHeieP
>>481
パソコン買い換えたばかりで、キーボードを打ち間違えるんだけど、「わざとです」ってことにしとくわ。
2022/04/27(水) 01:00:29.05ID:9dk3kBsG
まじでバカばっか
皮肉でたとえ話してんのに、額面どおりうけるやつ。。。

お前らと仕事だったら大変だな
一から十まで説明しなきゃいけなそうw
484デフォルトの名無しさん
垢版 |
2022/04/27(水) 01:09:56.50ID:x9fHeieP
>>483
ちょっと説明してみて。
2022/04/27(水) 02:03:48.20ID:yb/peNBg
「デバッガに出力」ってそもそも正確にはどういう意味だろう

Unix系OSでのOutputDebugStringの代替ならこちらをどうぞ
syslogを使う方法、sysctlでデバッガを検知したときだけstderrに出力する方法等が紹介されている
https://stackoverflow.com/questions/417745/os-x-equivalent-to-outputdebugstring
2022/04/27(水) 02:05:24.94ID:gWhhdIlX
C++の規格書にデバッガという単語は出てきますか?
2022/04/27(水) 02:12:09.12ID:fiJD2DKf
ID:2YgT13Zl「皮肉で例え話してるのに...」
大多数「(どこが皮肉なんだろう...)」
488デフォルトの名無しさん
垢版 |
2022/04/27(水) 06:21:23.13ID:1MxxbY3W
*(int*)0xffff0030 = 0x05; は環境に依存するが
C++標準の機能のみを使っていて独自拡張ではない

void our_customers_function();
our_customers_function();
これもそうだ

非標準の話をするなという原理主義者は
こういうのは受け入れるということか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況