2017-07-16 30 views
1

私は、Cコードの断片を確実にセグメント化するというのが最善の方法だろうと思っていましたか?コードを強制的にsegaultにするにはどうすればよいですか?

私は、これは悪い行動であり、ソフトウェアの一部に使用してはならないことを十分に承知しているが、私はconsistantly起こるためにそれを強制することができるか知りたいと思いました。

EDIT:。好ましくプラットフォームに関係なく。

EDIT2:SIGSEGVが興味深いソリューションですが、私が信号を使用していない答えを好むだろう。議論のために、理由の中でオペレーティングシステムをLinux /その他のUNIXベースのディストリビューションに制限することができます。

+1

あなたの特定のプラットフォームに関して、あるいはプラットフォームに依存しない方法で信頼できますか? –

+3

'*((char *)0)= '\ 0';' –

+0

@Mad物理学者がプラットフォームに依存しないようにしてください – Erich

答えて

2

それはセグメンテーションフォールト未定義のプラットフォーム上でプログラムにメソッドを定義するのは難しいです。 セグメンテーションフォールトは、すべてのプラットフォーム(単純な小型コンピュータなど)では定義されていない緩やかな用語です。

プロセスをサポートするオペレーティングシステムのみを考慮すると、プロセスはセグメンテーション違反が発生したという通知を受け取ることができます。

最もクロスプラットフォームの問題の場合のようにまた、OSの「のようなUNIX」にオペレーティングシステムを制限する、SIGSEGV信号を受信するプロセスのための信頼できる方法がkill(getpid(),SIGSEGV)

あり、各プラットフォームできる(通常い)は、seg-faultingの定義が異なります。

しかし、実用的で、かつEDIT2、現在のMACに答えて、LINとのOSを勝つためには、さらに

*(int*)0 = 0; 

にセグメンテーションフォールトなり、それがセグメンテーションフォルトを引き起こす悪い行動ではありません。 assert()の実装によっては、コアファイルを生成するSIGSEGV信号が発生します。剖検が必要なときに非常に便利です。

try 
{ 
    anyfunc(); 
} 
catch (...) 
{ 
    printf("?\n"); 
} 

エラーの原因を隠し、あなたが上に行くために持っているすべてがある::

? 

セグメンテーションフォルトがそれを隠している原因より悪い何

+0

*セグメンテーションフォールトとは* https://stackoverflow.com/questions/2346806/what-is-a-segmentation-fault –

0

だけ読み取りまたは違法なメモリ位置への書き込みをしてみてください。例:

memset(NULL, 1, 1); 

ここでは、アドレス0に1を書き込んでいますが、間違いは違法です。

+0

実際にはゼロサイズの配列ですが、無効なメモリ位置です。 –

+0

ええ、そうです、私は眠すぎますxD – hedgar2017

+0

@RetiredNinjaよくすべてのプラットフォームでsegfaultを強制する方法はありません。明らかにこれに対する答えは、いくつかの状況のサブセットでしか動作しません。 –

1

C言語自体は、セグメンテーション違反については何も指定しません。あなたが無効なメモリにアクセスしようとすると、その動作は未定義です。セグメンテーションフォルトまたはSIGSEGVは、いくつかの基礎となるプラットフォームからの無効なメモリアクセスを示す共通信号です。しかし、明らかに、基盤となるプラットフォームは、そのようなエラーでどのように動作するかを決めることができます。

あなたはCについて厳しく、「プラットフォームに関係なく優先的に」という方法であれば、これを強制する方法はなく、世界中のすべてのプラットフォームで動作します。

関連する問題