問題タブ [compiler-bug]

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.

0 投票する
6 に答える
14260 参照

c# - (this == null)C#で!

C#4で修正されたバグのため、次のプログラムが出力しtrueます。(LINQPadで試してみてください)

リリースモードのVS2008では、InvalidProgramExceptionがスローされます。(デバッグモードでは、正常に動作します)

VS2010 Beta 2では、コンパイルされません(Beta 1は試していません)。私は難しい方法を学びました

this == null純粋なC#で作成する他の方法はありますか?

0 投票する
4 に答える
2674 参照

c++ - 関数ローカルの typedef は C++0x ラムダ内に表示されますか?

私は奇妙な問題に遭遇しました。次の簡略化されたコードは、MSVC 2010 の問題を再現します。

関数でローカルに作成したtypedefは、ラムダでは表示されないようです。typedefを実際の型に置き換えると、期待どおりに機能します。

その他のテストケースは次のとおりです。

現在、テストに使用できる g++ がありません。これは C++0x の奇妙なルールですか、それともコンパイラの単なるバグですか?

上記の結果から、私はバグに傾いています。クラッシュは間違いなくバグですが。


今のところ、2 つのバグ レポートを提出しました。

上記のすべてのコード スニペットをコンパイルする必要があります。このエラーは、ローカルで定義されたスコープでスコープ解決を使用することに関係しています。(dvideによって発見されました。)

そして、クラッシュバグは... 誰が知っている. :)


アップデート

バグ レポートによると、これらは両方とも Visual Studio 2010 の次のリリースで修正されています。

0 投票する
1 に答える
592 参照

objective-c - メソッドパラメータとして NSError ** を渡すときのコンパイラ警告

私はこの 4 時間、あらゆる種類の小さな実験を試みながら、これについて頭を悩ませてきましたが、何が問題なのか理解できていないようです。これはコンパイラのバグでしょうか?

Test.m:

main.m:

コンパイラの警告は次のとおりです (main.m から):

警告: 互換性のない Objective-C 型 'struct NSError **'、予期される 'initWithContentsOfURL:error:' の引数 2 を個別の Objective-C 型から渡すときに 'struct NSDictionary **'

Xcode と Snow Leopard の最新バージョンを使用しています。

0 投票する
3 に答える
646 参照

c++ - C++ テンプレート関数が誤ったデフォルト値を取得する

私は C++ で本当の脳を焼き尽くすものに出くわしました。

問題の要点は、私の(テンプレート)関数の呼び出し時に、デフォルトを定義した引数の値がスクランブルされることです。デフォルトで関数を呼び出した場合にのみ発生します。

私のテンプレート関数は次のように宣言されています:

後で、同じヘッダーで、次のように定義されます。

これを defaults ( transform(vector2<double>(0, 1), view_transform)) で呼び出すと、期待する値が得られません。transformVC++ デバッガーに足を踏み入れると、「おかしな」値が表示さzwます (私の経験では、何かが正しく初期化されていないことを意味します)。

面白い値の例: 0.0078125000000000000 および 2.104431116947e-317#DEN

今、私は C++ FAQ Lite で答えを見つけようとしました。シューベルトで自分を落ち着かせようとさえしましたが、私は一生それを理解することができません. 私はそれが本当に単純で、ある種のテンプレートのおふざけが働いているのではないかと推測しています。

私が期待し、望んでいるデフォルト値を取得する方法はありますか?なぜそれが私にこれを行うのですか?

編集1:

代わりにフロートを使用するように変更呼び出しを行うと ( transform(vector2<float>(0, 1), view_transform))、問題は解決します。これはT=の場合にのみ発生するようdoubleです。

編集2:

と の 2 つの専門分野がある場合にのみ発生doublefloatます。ある場所で float 特殊化を使用すると、double 特殊化が奇妙なデフォルト値になります。関数が呼び出されるすべての場所を変更すると、問題が2倍になり、「なくなる」。zw. _

編集3:

C++ クリプトの物語:

matrix4.hpp では:

それを実行すると、double-specialization のデフォルト引数は正しくなりますが、float バージョンは両方のデフォルト引数をゼロ (0.000000) として取得しz = 0ますw = 1

編集4:

接続の問題を作成しました。

0 投票する
1 に答える
1581 参照

excel - VBA: ParamArray に渡されたこの文字列引数が数値に変更される原因は何ですか (疑わしいポインターのように見えます)?

最終編集:実際にはコンパイラのバグのようです-受け入れられた回答を参照してください。

Excel 2007 内で VBA を使用すると、「Class1」に次のコードがあります。

モジュール内のいくつかのモードコード:

次のようにイミディエイト ウィンドウから「outer」を呼び出す場合:

奇妙に思える出力が返されます。

呼び出されたルーチンがクラス モジュール内にあるかどうか、Sub か Function か、初期引数があるかどうかが問題のようです。VBA がどのように機能するかについて、何か不足していますか? 何か案は?

奇妙な数は実行ごとに変化します。これを呼び出すと、「疑わしいほどポインタのように見える」と言います。

そのようです:

次のような出力が返されます。

疑わしいのは 16 の増分ですが、実際にはわかりません。また、次のように呼び出して、値を渡します。

うまく動作します。

編集:もう少し情報...「c.strange」からの戻り値を捨てるのではなく何かに割り当てると、同じ動作が得られます:

興味深いことに、上記のように、'Array' を呼び出した結果の引数を使用してテスト ルーチンを呼び出すと、想定されるポインター値が変更されます。ただし、次のように呼び出すと:

何度かけても同じ番号にかかってきます。(ブラウザなど、Windowsの別のアプリに切り替えると、数値が変わります。)したがって、Excelエバリュエーター(括弧で呼び出される)が結果をキャッシュしているように見えることに興味をそそられます...

0 投票する
1 に答える
961 参照

c#-4.0 - C#4.0コンパイラエラーの可能性がありますが、他の人が確認できますか?

エラーの原因となる部分だけが正確にはわからないため、ラベルを付ける方法が完全にはわかりません。

この質問は、SO質問の副産物です。c#コードは、オブジェクト値がnullになるように無効な方法で最適化されているようです。これは、昨日の夕方にGaryを支援しようとしました。彼は問題があることを知った人でした。私は問題をより単純なプロジェクトに減らしたところです。さらに先に進む前に検証が必要なので、ここでこの質問をします。

他の人もこの問題を抱えていることを確認できる場合は、Microsoft Connectにメモを投稿します。もちろん、Jon、Mads、Ericのいずれかが問題を確認してくれることを願っています:)

これには以下が含まれます。

  • 3つのプロジェクト。そのうちの2つはクラスライブラリで、そのうちの1つはコンソールプログラムです(この最後のプロジェクトは問題を再現するために必要ではありませんが、これを実行するだけで問題が表示されますが、リフレクターを使用してコンパイルされたコードを確認する必要があります追加しない場合)
  • 不完全な参照と型推論
  • ジェネリック

コードはここから入手できます:コードリポジトリ

手を汚したい場合は、プロジェクトの作り方を以下に説明します。

この問題は、単純な汎用リストを返す前に、メソッド呼び出しで無効なキャストを生成し、それを返す前に奇妙なものにキャストすることによって現れます。元のコードは、ブール値へのキャストで終了しました。はい、ブール値です。コンパイラーはList<SomeEntityObject>、結果を返す前に、からブール値へのキャストを追加し、メソッドのシグニチャーは、を返すと述べましたList<SomeEntityObject>。これにより、実行時に奇妙な問題が発生し、メソッド呼び出しの結果が「最適化された」(元の質問)と見なされたり、同様の例外のいずれBadImageFormatExceptionかまたは1つでクラッシュしたりします。InvalidProgramException

これを再現する作業中に、へのキャストを確認しました。void[]現在のバージョンのコードはにキャストされていTypedReferenceます。あるケースでは、Reflectorがクラッシュするため、その場合、コードが期待を超えていた可能性があります。マイレージは異なる場合があります。

これを再現するために行うことは次のとおりです。

注:問題を再現する最小限のフォームがもっとある可能性がありますが、すべてのコードを1つのプロジェクトに移動するだけで問題は解決しました。クラスからジェネリックを削除すると、問題も解消されます。以下のコードは毎回問題を再現しているので、そのままにしておきます。

以下のコードでエスケープされたhtml文字をお詫びします。これはMarkdownが私をだましていることです。誰かが私がそれを修正する方法を知っている場合は、私に知らせてください。または質問を編集してください。

  1. .NET4.0用のコンソールアプリケーションを含む新しいVisualStudio2010ソリューションを作成します
  2. 2つの新しいプロジェクトを追加します。どちらもクラスライブラリであり、.NET 4.0でもあります(ClassLibrary1とClassLibrary2という名前であると想定します)
  3. クライアントプロファイルだけでなく、完全な.NET4.0ランタイムを使用するようにすべてのプロジェクトを調整します
  4. コンソールプロジェクトの参照をClassLibrary2に追加します
  5. ClassLibrary2の参照をClassLibrary1に追加します
  6. デフォルトでクラスライブラリに追加された2つのClass1.csファイルを削除します
  7. ClassLibrary1で、System.Runtime.Cachingへの参照を追加します
  8. ClassLibrary1に新しいファイルを追加し、それをDummyCache.csと呼び、次のコードを貼り付けます。

    /li>
  9. ClassLibrary2に新しいファイルを追加し、それをDummy.csと呼び、次のコードを貼り付けます。

    /li>
  10. コンソールプロジェクトのProgram.csに次のコードを貼り付けます。

    /li>
  11. ビルドし、コンパイラエラーがないことを確認します

  12. プログラムを実行してみてください。これは、より恐ろしい例外の1つでクラッシュするはずです。キャストの結果に応じて、InvalidProgramExceptionとBadImageFormatExceptionの両方を見てきました
  13. Reflectorで生成されたDummy.GetDummiesのコードを見てください。ソースコードは次のようになります。

    ただし、リフレクターは次のように述べています(私にとっては、選択したキャストが異なる場合があり、場合によってはリフレクターがクラッシュすることもあります)。

    /li>

さて、ここにいくつかの奇妙なことがあります、上記のクラッシュ/無効なコードは別として:

  • を持つLibrary2は、Dummy.GetDummiesLibrary1からクラスのデフォルトのキャッシュポリシーを取得するための呼び出しを実行します。型推論を使用var policy = ...し、結果はCacheItemPolicyオブジェクトになります(コードではnullですが、型は重要です)。

    ただし、ClassLibrary2にはSystem.Runtime.Cachingへの参照がないため、コンパイルしないでください。

    実際、Dummyで名前が付けられたメソッドをコメントアウトするとTryCommentingMeOut、次のようになります。

    タイプ'System.Runtime.Caching.CacheItemPolicy'は、参照されていないアセンブリで定義されています。アセンブリ'System.Runtime.Caching、Version = 4.0.0.0、Culture = neutral、PublicKeyToken=b03f5f7f11d50a3a'への参照を追加する必要があります。

    なぜこのメソッドが存在するのか、コンパイラーが幸せになるのか、私にはわかりません。また、これが現在の問題に関連しているかどうかさえわかりません。おそらくそれは2番目のバグです。

  • に同様のメソッドがありDummyCacheます。でメソッドを復元しDummyて、コードを再度コンパイルし、DummyCacheその上に「これをコメントアウトしてみてください」というコメントが付いているメソッドをコメントアウトすると、同じコンパイラエラーが発生します。

0 投票する
3 に答える
20224 参照

c# - 「デリゲート 'System.Action' は 0 引数を取りません。」これは C# コンパイラのバグ (ラムダ + 2 つのプロジェクト) ですか?

以下のコードを検討してください。完全に有効な C# コードのように見えますよね?

'Delegate 'Action' does not take 0 arguments.' というコンパイラ エラーが発生します。(Microsoft) C# 4.0 コンパイラを使用して、示された位置で。このエラーが発生するには、別のプロジェクトで ActionSurrogate を宣言する必要があることに注意してください。

もっと面白くなります:

ここで C# コンパイラのバグに遭遇しましたか?

これは、ラムダの使用が好きで、将来の使用のためにデータ構造ライブラリを作成しようとしている人にとってはかなり厄介なバグであることに注意してください... (私)

編集:誤ったケースを削除しました。

これを実現するために、元のプロジェクトを最小限にコピーして削除しました。これは文字通り、私の新しいプロジェクトのすべてのコードです。

0 投票する
2 に答える
414 参照

java - なぜこれがコンパイルされるのですか?コードは型パラメーターの制約を破っているようです

次のテストでは、TesterClassは2つの型パラメーター間の関係に制約を課します。メソッドfunc2()はその制約を破っているようで、どこかでタイピングコンパイルエラーが発生することを期待しています(func2の定義上、またはクラスがString以外の2番目のパラメーターで使用されるときはいつでも)が、そうではありません!

さらに、func2を呼び出して結果を適切に型指定された変数に保存すると、(その変数の型で)コンパイルが失敗します。ただし、関数の戻り型はどちらの場合も(アップキャストの前に)同じ型である必要があるという事実にもかかわらず、同じことを行い、より一般的な型(Objectなど)に保存することは成功します。

何が起きてる?

ありがとう!

編集:これはjavacではコンパイルされません(以下に報告されているバージョン)。私はEclipseを使用していて、実際に実行されているコンパイラーを調べようとしています。更新されます。JDT(Eclipseコンパイラ)のバグである可能性があります。

Eclipseのjdtのバグレポートを開きました: https ://bugs.eclipse.org/bugs/show_bug.cgi?id = 333503

0 投票する
2 に答える
1423 参照

visual-c++ - 64ビットポインタの減算、符号付き整数のアンダーフロー、およびコンパイラのバグの可能性はありますか?

私は最近、このコードのデバッグをやめました(プレゼンテーションを簡単にするために少し変更しました)。

もちろん、2つのポインターの差(std::upper_bound検索された配列の先頭を引いた結果)をptrdiff_tではなくintに割り当てることは、64ビット環境では間違っていますが、結果として生じた特定の悪い動作は非常に予想外でした。[indexBegin、indexEnd)の配列のサイズが2GBを超えると、これが失敗すると予想されます。そのため、差がintをオーバーフローしました。しかし、実際に起こったことは、indexBeginとindexEndの値が2 ^ 31の反対側にある場合のクラッシュでした(つまり、indexBegin = 0x7fffffe0、indexEnd = 0x80000010)。さらに調査したところ、次のx86-64アセンブリコード(MSVC ++ 2005によって生成され、最適化されています)が明らかになりました。

このコードは、減算されるポインターを符号付き32ビット値として扱い、64ビットレジスターに符号拡張してから減算し、結果に別の符号拡張32ビット値を乗算してから、別の配列に64でインデックスを付けます。その計算のビット結果。頑張ってみてください。これがどのような理論で正しいのか理解できません。ポインターが64ビット値として減算された場合、またはimulの直後に、edxをrdxに符号拡張する別の命令があった場合(または最後のmovがrax + edxを参照した場合、それはx86-64)、すべてが正常です(名​​目上危険ですが、[indexBegin、indexEnd)の長さが2GBに近づくことは決してないことを私は知っています)。

私の実際のバグは、ポインターの違いを保持するために64ビット型を使用するだけで簡単に修正できるため、質問はやや学術的ですが、これはコンパイラーのバグですか、それともコンパイラーが想定できる言語仕様のあいまいな部分がありますか?減算のオペランドが個別に結果型に適合することは?

編集:私が考えることができる唯一の状況は、コンパイラが大丈夫だと思うことです。整数のアンダーフローが決して起こらないと仮定できる場合です(したがって、2つの数値を減算して結果をに割り当てるとsigned int、コンパイラは次のようになります。より大きな符号付き整数型を実際に自由に使用できますが、この場合は間違っていることがわかります)。それは言語仕様で許可されていますか?

0 投票する
3 に答える
207 参照

c++ - このプライベート テンプレート関数がコンパイルされるのはなぜですか? -> コンパイラのバグ VS 2009

これはVS 2009で問題なくコンパイルされますか? 私は愚かですか?GCC は、テンプレートが非公開であるという警告を出します....? 私は何が欠けていますか?