私はafl-fuzz(Cアプリケーション)をPythonに書き直しています。私はその内部の仕組みを十分に理解していないので、できるだけ近いところでその機能を再現したいと思います。UnitTestのSystemExitハンドラを回避できますか?
私は、Pythonインタープリタをforkするルーチンの機能テストを実行しようとしていますが、execve
を実行し、失敗した場合は42を返して呼び出し元に失敗を報告します。テストはunittestの外でうまく動作しますが、それ:
#!/usr/bin/env python
import os
import sys
import unittest
def run_test():
x = os.fork()
if not x:
sys.exit(42)
waitpid_result, status = os.waitpid(x, os.WUNTRACED)
print(os.WEXITSTATUS(status))
class ForkFunctionalTest(unittest.TestCase):
def test_exercise_fork(self):
run_test()
if __name__ == '__main__':
print('Expecting "42" as output:')
run_test()
print('\nAnd here goes unexpected SystemExit error:')
unittest.main()
ここにそれが失敗した方法は次のとおりです。
Expecting "42" as output:
42
And here goes unexpected SystemExit error:
E
======================================================================
ERROR: test_exercise_fork (__main__.ForkFunctionalTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "afl-fuzz2.py", line 23, in test_exercise_fork
run_test()
File "afl-fuzz2.py", line 15, in run_test
sys.exit(42)
SystemExit: 42
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
1
.
----------------------------------------------------------------------
Ran 1 test in 0.014s
OK
RUN_TEST変更することなく、この機能にunittestの仕事をする方法はありますか? sys.exit()の代わりにos._exitを試しましたが、両方のプロセスでプログラムが終了しました。
ありがとうございました。事は私がそれをキャッチしたくないということです、私は出口コード= 42で実際にフォークされたプロセスが死ぬことを望みます。 – d33tah