2011-06-28 7 views
2

コード:http://paste.pocoo.org/show/422081/(リンクが404個ありません)。GCC +インラインアセンブリー - 予期しないSegfault on notl

私はメモリの一般的なチャンクを使わないようにしようとしていて、扱いにくいキャストでやっかいになったと判断し、インラインアセンブリに落としたと思った。私はこのセグメンテーションを特定の機能に絞り込んだ。それはペーストの22行目です。

しかし、それは常にsegfaultsです。ご覧のように、strはargv [1]として渡されます。

私は手動でargvをするものを行うことができます[1](たとえばargv[1][0] = 'q'ため)ので、私は特に、以前notsで、それが正常にnot8not2を実行することを考えると、それが動作しないではない理由は全くわかりません。私が知りませんが、何かファンキーなことが起こっていますか?ここで何がうまくいかないの?

また、一般的なコードレビューもいいでしょう。私はかなり新しいです。

+0

これはどのコンピュータで実行されていますか? eaxをポインタとして使用しますが、64ビットのコンピュータ/システムを使用している場合は、raxを使用する必要があります(多分not8とnot2は誤ってsegfaultしないでください)。 – flolo

+0

あなたのnot13関数が文字列のバイト(バイト12)を見逃してしまった場合は、それが意図せずに修正したいかもしれません。 – Necrolis

+0

@flolo私はそれをしたと思います!さて、私はそれを邪魔させ、私のアルゴリズムが動作するかどうかを見てみましょう。 @Necrolis Eep!良い目。 –

答えて

2

あなたの問題はpasswordです。要素を1つだけ割り当てた後、forループでpassword++を実行します。だから、ループを2回目にすると、あなたはどこにもいません。

このコードは、あなたが現在マスターしている概念よりもはるかに複雑な概念を使用していることを示しています。

  • あなたが ポインタをどのように扱うかはまだ分からない インラインアセンブラをしないでください。
  • mallocの返品をキャストしないでください。
  • unsigned charは、オブジェクトの個々の バイトを検査するために、一般的には 正しいタイプです。
+0

ああ。私はpasswdの増分を単なる長いlongの時から変更するのを忘れていました。ありがとうございます:\(私はデバッガですべてを踏んだはずです)。 mallocの返り値をキャストすることについては、void *を返しませんか?マニュアルページにはこう書かれています。なぜあなたはそれをキャストする必要はありませんか?私はunsigned charにスワップします、ありがとう。 –

+0

@corey:Cでは、キャストなしでポインタ型に 'void * 'を割り当てることができます。しかし、キャストはこのような状況では有害ではありません(コンパイラは無視しなければなりません)。 – Necrolis

+0

@Corey、Cでは、他のデータポインタ型に 'void * 'を割り当てることができます。それはこれのために作られています。 'malloc'をキャストすると、正しいインクルードファイルを忘れてしまった可能性があるので、' malloc'の戻り値の型は 'int'になります。 –