2

標準ライブラリのエラー処理の既存のバグのパッチに取り組んでおり、次のshutil.rmtree()コードに遭遇しました。

try:
    orig_st = os.lstat(path)
except Exception:
    onerror(os.lstat, path, sys.exc_info())
    return
try:
    fd = os.open(path, os.O_RDONLY)
except Exception:
    onerror(os.lstat, path, sys.exc_info())
    return

実装を容易にするために変更を適用する前に、次のように単純化したいと思います。

try:
    orig_st = os.lstat(path)
    fd = os.open(path, os.O_RDONLY)
except Exception:
    onerror(os.lstat, path, sys.exc_info())
    return

2 つのコード サンプル間で動作が異なる場合はありますか?

4

3 に答える 3

4

いいえ

シングルスレッドアプリケーションでは、2つが異なる場合はありません。ただし、マルチスレッドアプリケーションでは、「パス」は2つの試行の間で変更される可能性があります。

このコードは、シンボリックリンク攻撃の脆弱性を修正するパッチで導入されました(http://bugs.python.org/issue4489)。変更後、元のコミッターにコードレビューを依頼する必要があるかもしれません。http://hg.python.org/cpython/annotate/c910af2e3c98/Lib/shutil.py#434によると、これはHynekSchlawackです。

于 2013-03-18T20:21:45.240 に答える
1

2 つのケースは同じだと思いますが、それはreturnそれぞれの例外ブロック内に が存在するためtry...exceptです。つまり、最初のブロックで例外が発生した場合、2 番目のブロックは実際には実行されません。

最初のブロックが実行されtry...exceptなかった場合、最初のブロックで例外が発生した場合でもreturn2 番目のtry...exceptブロックが実行され、2 つのケースは同一ではありません。

于 2013-03-18T20:07:03.827 に答える
0

彼らが分割した理由は、最初の試行で例外をキャッチした場合でも、値を fd に設定するためだと思います。あなたが書いたように、例外がコードの最初のビット (つまり orig_st) でキャッチされた場合、例外が含まれていなくても、既に渡されているため、fd を設定することはありません。

于 2013-03-18T19:59:38.107 に答える