2012-06-27 10 views
6

を生成することが/dev/fullに書き込むことによって、テストスイートの書き込みエラーを発生させるために簡単です。読み取りエラーを生成する良いテクニックはありますか?私は現在、LD_PRELOADを使用してreadをオーバーライドしていますが、それはあまりにも複雑でポータブルではないようです(その/ dev/fullは移植可能ではありません...)。は、読み取りエラー

+0

だけと思ったが、何を000に設定しパーマを持つファイルからの読み込みについてはどうですか? –

+0

@Loadmasterこれは 'read'エラーではなく' open'エラーを引き起こします。 –

+0

EINVALの後ろにいますか? – jpe

答えて

5

(前の回答で述べたように)ディレクトリからの読み取りだけでなく、あなたがエラーを取得するために/proc/self/memを読み取ろうとすることができます(これはあなたのLinux上でEIOを取得する必要があります)。説明については、https://unix.stackexchange.com/a/6302

+0

素敵なトリックですが、 '/ proc/self/mem'はファイルの先頭から読んだ方が良いことに注意してください。プログラムが最初にシークすると、誤ってマップされたゾーンに入る可能性があります。 – Gilles

2

"試みがディレクトリを読み取るように構成されている[A] N。" 場合(OS X)、(2)のマンページを読み取る読み取り(2)エラーを生成するによりますしたがって、(2)ディレクトリを開くことができます(protが書き込みを許可していないことを確認するか、エラーをスローします)。これは、通常の状況(FILE *構造体を故意に壊すようなことをすることなく)で起こりうる唯一のエラーのように見えます。

私はあなたがCのようなread(2)エラーやそのようなことを話していると推測していますが、より高いレベルの言語であっても、ディレクトリを開いて読むことができますあなたにも-EFAULTを返すことになる、読むためにバッファとして違法なポインタを渡すことができます)...

1

を私はPythonのでそれを試みたが、それはあなたがディレクトリを開いてみましょうするにはあまりにもスマートです。 のような何か:

read(fd, (char *)0, cout); 

おかげ 鈴木

+0

これは読み取りエラー(EINVAL)を生成しませんが、バッファは読み取り中にアクセス可能なアドレス空間(EFAULT)の外にあります。しかし、男2によれば、若干の修正を加えてEINVALに行くことができるはずです。しかし、この問題のポイントは、「コードを修正することなくEINVALに到達する方法ですが、すべての興味深いエラー状況をエミュレートするラッパーを作成する」と思われます。 – jpe

+0

実際には、コードを変更すべきではなく、プロセスはファイルを正常に開き、複数のI/O操作(読み込みと書き込みの両方)を実行する必要がありますが、その後の読み込み操作は失敗する必要があります。これは、読み込みをオーバーライドしてシンプルなカウンタを実装することで可能です。これにより、N番目の読み込み操作は失敗しますが、シェルスクリプトから何かを実行するといいでしょう。 'kill -STOP $ pid; chmod 000ファイル。 kill -pid'を実行します。最初の書き込みで/ dev/fullへの書き込みが失敗するので、同様の条件で書き込みエラーを取得する方法が良いでしょう。 –

4

すべての主要なユニコードで動作するアプローチは、小さなFUSEファイルシステムを実装することです。 EIOは、ユーザスペースのファイルシステムドライバが何か間違っているときのデフォルトのエラーコードなので、簡単に達成できます。どちらもPerlPythonバインディングが始めるために例が付属して、あなたはすぐに、主にミラーがファイルを既存のファイルシステムを記述しますが、慎重に選ばれた場所でEIOを注入することができます。

このようなファイルシステムが存在します:petardfsarticle)、それはどのようにうまく動作するのかわかりません。

+0

ああ、+1:petardfsは明らかに正しいことです。 –