コンパイラーは通常、いくつかの巧妙なコードをコンパイルするときにユーザーマシンを呼び出さないように検証されていますか?
一般に、それらは複雑すぎて、しばしばこの特性を証明するのが実用的でない言語を使用して書かれています。
おそらくこの特定の意図ではありませんが、コンパイラのファジーテストの概念は少なくとも知られています(LLVMはそれ自体をファジーテストできるようになりました)。コンパイラーのバグによりコンパイラーをクラッシュさせる入力をキャッチすることを目的としたテストも、悪用可能な欠陥を発見する傾向があります。
当然、潜在的なクラッシュを見つけるために、興味のある特定のコンパイラーがテストまたはファズテストされているかどうか、また、見つかったバグが実際に修正されているかどうかを調べる必要があります。経験則では、メモリ不足の例外よりも深刻なクラッシュが発生した場合、詳細をさらに調査することなく、エクスプロイトに悪用される可能性を深刻に考慮する必要があります。
見知らぬ人からのコードをコンパイルすることはどれくらい安全ですか?
残念ながら、文字列の長さはどれくらいですか。原則として、メールがコンパイラに届く前に、メールがメールクライアントを悪用したり、ソースコードがテキストエディタやcppcheckを悪用したりする可能性があります。オンラインコンパイラを使用するというセバスチャンのコメントの提案はかなり良いものですが、もちろん、コードはコンパイラが受け入れる形式でなければなりません。
一般的なコードをコンパイル時に実行する機能を備えた言語またはコンパイラは、もちろん非常に疑わしいものです。C ++テンプレートは機能的には完全ですが、システムへの(意図された)アクセス権がないため、比較的リスクは低くなります。BЈовићはmake
、非常にリスクが高いと述べています(見知らぬ人のコードを実行しているため、たまたまそのコードがmake
C ++ではなく言語で記述されているためです)。コンパイラが実行される場合、system
同じボートにいます。以前は、アセンブラで作業していたので、正しく覚えていれば、コンパイル時に任意のコードを実行できました。ルックアップテーブルの計算を目的としていましたが、システムコールの実行を妨げるものはないと思います。
実際には、コードに問題がないように見え、理解できると思うなら、コンパイルするのは非常に低いリスクで、「ロックダウンされたブラウザでインターネットを閲覧する」よりもはるかに低いリスクだと思います。私は汎用マシンで日常的に危険なことをしていますが、それらの多くは、たとえばウイルス研究室や重要なサーバーでは行いません。コードがおかしくなったり、明らかに難読化されている場合は、コードをコンパイルするリスクはないかもしれません。読み取り不可能なガーベッジに隠されたエクスプロイトが含まれている可能性があるため、それはゴミコードです。アンダーハンドコードは困難ですが、可能です。コンパイラのエクスプロイトを介してマシンを手渡すアンダーハンドコードには、重要な実行可能ペイロードを含める必要があるため、非常に困難です。
さらに詳しく調べたい場合は、オンラインコンパイラをホストしている人に聞いてみてください。それが彼らに行われていない場合(NSAまたは同等のものの注意を引くことを除いて)、あなたはそれがあなたに行われないと合理的に仮定することができます。彼らはコンパイラを適切なサンドボックスで実行するためにある程度の努力をしましたが、これはあなたが進んで行くよりも多くの努力かもしれませんが、少なくとも、そのサンドボックスがそれらをトラブルから救う頻度を伝えることができるかもしれません。