SWIGを使用してこの関数をPythonに公開しようとしています。
std::vector<int> get_match_stats();
そして、SWIGにPythonのラッピングコードを生成させて、整数のリストとして表示できるようにします。
これを.iファイルに追加します。
%include "typemaps.i" %include "std_vector.i" 名前空間std {{ %template(IntVector)vector <int>; }
SWIG Version 1.3.36
でswigを実行して呼び出して-Wall
いますが、警告は表示されません。
リストにアクセスすることはできますが、生成されたC ++コードを-Wall
(使用して)コンパイルすると、次のような警告が表示されます。g++ (GCC) 4.2.4
警告:型のパンニングされたポインターの間接参照は、厳密なエイリアシング規則に違反します
関数を正しく公開していますか?もしそうなら、警告はどういう意味ですか?
これらは、同じ関数の問題のある行の前の行です。
SWIGINTERN PyObject * _wrap_IntVector_erase__SWIG_0(PyObject * SWIGUNUSEDPARM(self)、PyObject * args){ PyObject * resultobj = 0; std :: vector * arg1 =(std :: vector *)0; std :: vector :: iterator arg2; std :: vector::iteratorの結果; void * argp1 = 0; int res1 = 0; swig :: PySwigIterator * iter2 = 0; int res2; PyObject * obj0 = 0; PyObject * obj1 = 0; if(!PyArg_ParseTuple(args、(char *) "OO:IntVector_erase"、&obj0、&obj1))SWIG_fail; res1 = SWIG_ConvertPtr(obj0、&argp1、SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t、0 | 0); if(!SWIG_IsOK(res1)){ SWIG_exception_fail(SWIG_ArgError(res1)、 "in method'" "IntVector_erase" "'、argument" "1" "of type'" "std :: vector *" "'"); } arg1 = reinterpret_cast *>(argp1);
そして、これは問題のある行です:
res2 = SWIG_ConvertPtr(obj1、SWIG_as_voidptrptr(&iter2)、swig :: PySwigIterator :: describeor()、0);
その後にさらにコードが続きます。
g++4.2.4でコンパイルするときに生成される警告は次のとおりです。
swig_iss_wrap.cxx:関数'PyObject * _wrap_IntVector_erase__SWIG_0(PyObject *、PyObject *)': swig_iss_wrap.cxx:5885:警告:型のパンニングされたポインターを間接参照すると、厳密なエイリアシングルールが破られます