2017-12-03 20 views
17

私のプロジェクトには、大きなC++ライブラリとPythonバインディング(Boost.Python経由)が含まれています。テストスイートは、ほとんどがPythonバインディングの上に書かれています。私はASANから始めて、サニタイザで実行したいと思います。サニタイズBoost.Pythonモジュール

MacOS(10.13.1 FWIW、以前のバージョンでも問題がありました)を実行していて、ASANをPythonモジュールで実行する方法が見つからないようです(これは非常に疑問ですBoostに.Python、私はそれが他のテクニックと同じだと思います)。 (すべてがうまく機能し、牙山なし

// Makefile 
CXX = clang++-mp-4.0 
CXXFLAGS = -g -std=c++14 -fsanitize=address -fno-omit-frame-pointer 
CPPFLAGS = -isystem/opt/local/include $$($(PYTHON_CONFIG) --includes) 
LDFLAGS = -L/opt/local/lib 
PYTHON = python3.5 
PYTHON_CONFIG = python3.5-config 
LIBS = -lboost_python3-mt $$($(PYTHON_CONFIG) --ldflags) 

all: hello_ext.so 

hello_ext.so: hello_ext.cc 
     $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -shared -o [email protected] $< $(LIBS) 

check: all 
     $(ENV) $(PYTHON) -c 'import hello_ext; print(hello_ext.greet())' 

clean: 
     -rm -f hello_ext.so 

だけでなく、あまりにもよく、実際に..:

ここ
// hello_ext.cc 
#include <boost/python.hpp> 

char const* greet() 
{ 
    auto* res = new char[100]; 
    std::strcpy(res, "Hello, world!"); 
    delete [] res; 
    return res; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

はMacPortsのために作られた私が使用したMakefile、次のとおりです。

は簡単なPythonモジュールです)。のはそれをやらせる、

$ make check 
python -c 'import hello_ext; print(hello_ext.greet())' 
==19013==ERROR: Interceptors are not working. This may be because AddressSanitizer is loaded too late (e.g. via dlopen). Please launch the executable with: 
DYLD_INSERT_LIBRARIES=/opt/local/libexec/llvm-4.0/lib/clang/4.0.1/lib/darwin/libclang_rt.asan_osx_dynamic.dylib 
"interceptors not installed" && 0make: *** [check] Abort trap: 6 

オーケー:定義DYLD_INSERT_LIBRARIES

$ DYLD_INSERT_LIBRARIES=/opt/local/libexec/llvm-4.0/lib/clang/4.0.1/lib/darwin/libclang_rt.asan_osx_dynamic.dylib \ 
    python -c 'import hello_ext; print(hello_ext.greet())' 
==19023==ERROR: Interceptors are not working. This may be because AddressSanitizer is loaded too late (e.g. via dlopen). Please launch the executable with: 
DYLD_INSERT_LIBRARIES=/opt/local/libexec/llvm-4.0/lib/clang/4.0.1/lib/darwin/libclang_rt.asan_osx_dynamic.dylib 
"interceptors not installed" && 0zsh: abort  DYLD_INSERT_LIBRARIES= python -c 'import hello_ext; print(hello_ext.greet())' 

は、私がここで無効になっSIPを持っている、との、解決しましょうそう、のは、SIPに関する疑わしいとしよう。しかしASANで、私は問題のようなLD_PRELOADを打ちますシンボリックリンク:

$ DYLD_INSERT_LIBRARIES=/opt/local/libexec/llvm-4.0/lib/clang/4.0.1/lib/darwin/libclang_rt.asan_osx_dynamic.dylib \ 
    /opt/local/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 -c 'import hello_ext; print(hello_ext.greet())' 
==19026==ERROR: Interceptors are not working. This may be because AddressSanitizer is loaded too late (e.g. via dlopen). Please launch the executable with: 
DYLD_INSERT_LIBRARIES=/opt/local/libexec/llvm-4.0/lib/clang/4.0.1/lib/darwin/libclang_rt.asan_osx_dynamic.dylib 
"interceptors not installed" && 0zsh: abort  DYLD_INSERT_LIBRARIES= -c 'import hello_ext; print(hello_ext.greet())' 

これは正しい方法はありますか?私もctypes.PyDLLでlibasanを読み込もうとしましたが、sys.setdlopenflags(os.RTLD_NOW | os.RTLD_GLOBAL)でさえ、私はこれを動作させることができません。

答えて

1

だから、私は最終的にこの作業を取得するために管理:

$ libasan=/opt/local/libexec/llvm-4.0/lib/clang/4.0.1/lib/darwin/libclang_rt.asan_osx_dynamic.dylib 
$ python=/opt/local/Library/Frameworks/Python.framework/Versions/3.5/Resources/Python.app/Contents/MacOS/Python 
$ DYLD_INSERT_LIBRARIES=$libasan $python -c 'import hello_ext; print(hello_ext.greet())' 
================================================================= 
==70859==ERROR: AddressSanitizer: heap-use-after-free on address 0x60b000002770 at pc 0x000108c2ef60 bp 0x7ffee6fe8c20 sp 0x7ffee6fe83c8 
READ of size 2 at 0x60b000002770 thread T0 
    #0 0x108c2ef5f in wrap_strlen (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x14f5f) 
    #1 0x109a8d939 in PyUnicode_FromString (Python:x86_64+0x58939) 
[...] 

何が変わりましたか?コンパイルチェーン内の何も、呼び出しだけ。

Let PYDIR=/opt/local/Library/Frameworks/Python.framework/Versions/3.5:以前はと呼んでいた(/opt/local/bin/python3.5はシンボリックリンクなので)$PYDIR/Resources/Python.app/Contents/MacOS/Pythonと今呼びます。何が起こっていたかを理解するには

が、私は

$ ps 
    PID TTY   TIME CMD 
    900 ttys000 0:07.96 -zsh 
70897 ttys000 0:00.11 /opt/local/Library/Frameworks/Python.framework/Versions/3.5/Resources/Python.app/Contents/MacOS/Python 
53528 ttys001 0:05.14 -zsh 
    920 ttys002 0:10.28 -zsh 
$ lsof -p 70897 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF  NODE NAME 
Python 70897 akim cwd DIR 1,4  480 8605949500 /Users/akim/src/lrde/vcsn/experiment/sanitizer 
Python 70897 akim txt REG 1,4  12988 8591019542 /opt/local/Library/Frameworks/Python.framework/Versions/3.5/Resources/Python.app/Contents/MacOS/Python 
Python 70897 akim txt REG 1,4 2643240 8591012758 /opt/local/Library/Frameworks/Python.framework/Versions/3.5/Python 
Python 70897 akim txt REG 1,4  107524 8590943656 /opt/local/lib/libintl.8.dylib 
Python 70897 akim txt REG 1,4 2097528 8590888556 /opt/local/lib/libiconv.2.dylib 
Python 70897 akim txt REG 1,4  20224 8591016920 /opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload/_heapq.cpython-35m-darwin.so 
Python 70897 akim txt REG 1,4  326996 8591375651 /opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/readline/gnureadline.cpython-35m-darwin.so 
Python 70897 akim txt REG 1,4  603008 8605907803 /opt/local/lib/libncurses.6.dylib 
Python 70897 akim txt REG 1,4  837248 8606849556 /usr/lib/dyld 
Python 70897 akim txt REG 1,4 1155837952 8606860187 /private/var/db/dyld/dyld_shared_cache_x86_64h 
Python 70897 akim 0u CHR 16,0 0t2756038  667 /dev/ttys000 
Python 70897 akim 1u CHR 16,0 0t2756038  667 /dev/ttys000 
Python 70897 akim 2u CHR 16,0 0t2756038  667 /dev/ttys000 

DYLD_INSERT_LIBRARIES=$libasan python3.5を走り、その開いているファイルを探し明らかlibasanはここではない、それは全体の問題です。しかし、私はまたpsが私が走ったものよりも別のPythonを指していたことに気づきました(もちろん、それはオープンファイルの一部です)。

$PYDIR/bin/python3.5$PYDIR/Resources/Python.app/Contents/MacOS/PythonこのディレクトリにはいくつかのPython実行可能ファイルがあり、最初のものは2番目のものにバウンスします。私は2番目を実行する場合DYLD_INSERT_LIBRARIES=$libasan

$ lsof -p 71114 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF  NODE NAME 
Python 71114 akim cwd DIR 1,4  480 8605949500 /Users/akim/src/lrde/vcsn/experiment/sanitizer 
Python 71114 akim txt REG 1,4  12988 8591019542 /opt/local/Library/Frameworks/Python.framework/Versions/3.5/Resources/Python.app/Contents/MacOS/Python 
Python 71114 akim txt REG 1,4 3013168 8604479549 /opt/local/libexec/llvm-4.0/lib/clang/4.0.1/lib/darwin/libclang_rt.asan_osx_dynamic.dylib 
Python 71114 akim txt REG 1,4 2643240 8591012758 /opt/local/Library/Frameworks/Python.framework/Versions/3.5/Python 
Python 71114 akim txt REG 1,4 107524 8590943656 /opt/local/lib/libintl.8.dylib 
Python 71114 akim txt REG 1,4 2097528 8590888556 /opt/local/lib/libiconv.2.dylib 
Python 71114 akim txt REG 1,4  20224 8591016920 /opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload/_heapq.cpython-35m-darwin.so 
Python 71114 akim txt REG 1,4 326996 8591375651 /opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/readline/gnureadline.cpython-35m-darwin.so 
Python 71114 akim txt REG 1,4 603008 8605907803 /opt/local/lib/libncurses.6.dylib 
Python 71114 akim txt REG 1,4 837248 8606849556 /usr/lib/dyld 
Python 71114 akim 0u CHR 16,0 0t2781894  667 /dev/ttys000 
Python 71114 akim 1u CHR 16,0 0t2781894  667 /dev/ttys000 
Python 71114 akim 2u CHR 16,0 0t2781894  667 /dev/ttys000 

\ o/libasanがあります!つまり、最初のPythonは2番目を呼び出し、DYLD_INSERT_LIBRARIESは転送されません。

私は現在、なぜ2つのPythonがあるのか​​考えていません。 AppleのPythonの場合もそうであるように、MacPorts固有のようではありません。

$ cd /System/Library/Frameworks/Python.framework/Versions/2.7 
$ ls -l bin/python* 
lrwxr-xr-x 1 root wheel  7 10 déc 08:17 bin/python -> python2 
lrwxr-xr-x 1 root wheel  14 10 déc 08:17 bin/python-config -> python2-config 
lrwxr-xr-x 1 root wheel  9 10 déc 08:17 bin/python2 -> python2.7 
lrwxr-xr-x 1 root wheel  16 10 déc 08:17 bin/python2-config -> python2.7-config 
-rwxr-xr-x 1 root wheel 43104 1 déc 21:42 bin/python2.7 
-rwxr-xr-x 1 root wheel 1818 16 jul 02:20 bin/python2.7-config 
lrwxr-xr-x 1 root wheel  8 10 déc 08:17 bin/pythonw -> pythonw2 
lrwxr-xr-x 1 root wheel  10 10 déc 08:17 bin/pythonw2 -> pythonw2.7 
-rwxr-xr-x 1 root wheel 43104 1 déc 21:42 bin/pythonw2.7 
$ ls -l Resources/Python.app/Contents/MacOS/Python 
-rwxr-xr-x 1 root wheel 51744 1 déc 21:48 Resources/Python.app/Contents/MacOS/Python 
+0

それは振り返りで非常に意味をなさない!優れた探偵仕事! upvoteを持っています。 –

4

これは理想的な答えではありませんが、必要なものを提供する必要があります。

私はすでに私はよ、すべてを構築するXcodeプロジェクトを取得する方法を知っていると仮定すると(はい、私はあなたが作る使用したい知っている、それは後で来る)あなたはすべてを構築するためのXcodeプロジェクトを作る

を提案しています住所消毒を有効に進んでください:

Product - >Scheme - >Edit Schemeは、このウィンドウを開きます: Edit Scheme

アドレス消毒のチェックボックスをオンにします。あなたはあなたの主なアプリケーションのためにこれを行う必要があります。私の経験では、すべての依存関係が適切に構築されます。

次メインアプリケーションターゲットを構築します。必要なフラグ/ステップをmakeファイルにコピーできるように、コンパイラとリンカの呼び出しを調べる必要があります。

Build Output

私は、出力を得るために2つの、関連するボタンを丸で囲んだきました。右端のボタンは、ビルドに使用されたコンパイラ呼び出しを展開します。

relevant output

このショットを示し、両方の保存ボタン(別のプログラムで検討する方が簡単かもしれない)と建物のために使用される関連のフラグの一部。鮮明な画像を得るには、すべてのターゲット(依存関係)の出力を調べなければなりません。

これが役に立ちます。 FWIW私の例のプロジェクトでは、C++で書かれたカスタムPythonモジュールがあります(直接BoPostではなくlibPythonを使用しています)ので、システムで提供されているPythonフレームワークを使用している場合でもAsanを使用できます。

+0

こんにちはブラッド。私の質問でMWEに '-D_LIBCPP_HAS_NO_ASAN'を追加しようとしましたが、役に立たないです。それでも動作しません。 – akim

+0

@akim私があなたが欠けていたものだと示唆するわけではありませんでした。それは_truncated_出力です。私はあなた自身のプロジェクトの成果を検証することを意味しました。あなたがXcodeのプロジェクトを持っていない限り、あなたは何もしません。まず最初にやり直してください。 –

+0

私はXcodeプロジェクトを作成しました(これは私が使っていないのでかなり時間がかかりました)、asanなども有効です。結果はまったく同じです:ASANもロードされているので、遅く – akim

関連する問題