2019年1月19日土曜日

TOPPERS cfg の 64 bit ビルドに挑戦した記録(その2 ワーニングを消す)

前回からの続き。

順番的には、

  1. ワーニングをなくす
  2. 最適化を有効にしてもセグフォが起こらないようにする

という感じで進めれば良さそうですかね?

やっていきます。

ワーニングの確認

発生するワーニングは次の通り。

# make clean all
...(略)
In file included from component.cpp:52:0:
../../toppers/itronx/factory.hpp:81:12: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations]
       std::auto_ptr< cfg1_out > create_cfg1_out( std::string const& filename ) const
            ^~~~~~~~
In file included from /usr/include/c++/7/memory:80:0,
                 from /usr/include/boost/config/no_tr1/memory.hpp:21,
                 from /usr/include/boost/smart_ptr/shared_ptr.hpp:23,
                 from /usr/include/boost/shared_ptr.hpp:17,
                 from ../../toppers/workaround.hpp:67,
                 from ../../toppers/macro_processor.hpp:53,
                 from component.cpp:45:
/usr/include/c++/7/bits/unique_ptr.h:51:28: note: declared here
   template<typename> class auto_ptr;
                            ^~~~~~~~
...(略)
factory.cpp: In function 'void toppers::oil::{anonymous}::set_object_vars(const cfg_obj_map&, toppers::macro_processor&)':
factory.cpp:164:60: warning: format '%llx' expects argument of type 'long long unsigned int*', but argument 3 has type 'uint64_t* {aka long unsigned int*}' [-Wformat=]
                 sscanf(value_str.c_str() , "0x%llx" , &temp);
                                                       ~~~~~^
...(略)
factory.cpp: At global scope:

...多いなぁ。

ぱっと見は、 auto_ptrsscanf のワーニングだけっぽい。

scanf のワーニング対応

%llxlong long unsigned int のためのプレースホルダだけど、 Linux 64bit の uint64_tlong unsigned int だから怒られているようだ。

ということは、 Linux 64bit の場合には %lx とするのが正解っぽい。

該当箇所確認

$ find ./ -type f \( -name "*.cpp" -or -name "*.hpp" \) -print0 | xargs -0 grep "llx"
./toppers/oil/factory.cpp:                sscanf(value_str.c_str() , "0x%llx" , &temp);
./toppers/oil/factory.cpp:                sscanf(value_str.c_str() , "0X%llx" , &temp);
./toppers/oil/factory.cpp:                sscanf(value_str.c_str() , "0x%llx" , &temp);
./toppers/oil/factory.cpp:                sscanf(value_str.c_str() , "0X%llx" , &temp);
./toppers/oil/oil_object.cpp:                                   (void)sscanf(obj->get_value().c_str() , "0x%llx" , &value);
./toppers/oil/oil_object.cpp:                                   (void)sscanf(obj->get_value().c_str() , "0X%llx" , &value);
./toppers/oil/oil_object.cpp:                                   (void)sscanf(obj->get_value().c_str() , "0x%llx" , &value);
./toppers/oil/oil_object.cpp:                                   (void)sscanf(obj->get_value().c_str() , "0X%llx" , &value);
./toppers/oil/oil_object.hpp:              return "%llx";
./toppers/oil/oil_object.hpp:              return "%llx";

./toppers/oil/factory.cpp./toppers/oil/oil_object.cppsed で置換するだけで良さそう。

sed -i -e 's/llx/lx/g' ./toppers/oil/factory.cpp
sed -i -e 's/llx/lx/g' ./toppers/oil/oil_object.cpp

scanf のワーニング対応版のビルド

cd /cfg
make clean all
cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/
cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ
make clean all

ビルドは成功したしコードジェネレートも通った。 diff でもコード差分は出なかったので多分大丈夫。

auto_ptr のワーニング対応

auto_ptr は非推奨となり、 unique_ptr に置き換えなければいけないようだ。

それでは置換しますか。

find ./ -type f \( -name "*.cpp" -or -name "*.hpp" \) -print0 | xargs -0 sed -i -e 's/std::auto_ptr/std::unique_ptr/g'

auto_ptr のワーニング対応版のビルド

エラーになった。

cfg3.cpp:234:55: error: no matching function for call to 'boost::shared_ptr<toppers::oil::checker>::shared
_ptr(std::unique_ptr<toppers::oil::checker>&)'
     std::tr1::shared_ptr< typename Factory::checker > chk( p_checker );
                                                       ^~~
In file included from /usr/include/boost/shared_ptr.hpp:17:0,
                 from /usr/include/boost/format/alt_sstream.hpp:21,
                 from /usr/include/boost/format/internals.hpp:23,
                 from /usr/include/boost/format.hpp:38,
                 from ../toppers/diagnostics.hpp:47,
                 from cfg3.cpp:39:
/usr/include/boost/smart_ptr/shared_ptr.hpp:673:5: note: candidate: template<class Y> boost::shared_ptr<T>
::shared_ptr(boost::shared_ptr<Y>&&, boost::shared_ptr<T>::element_type*)
     shared_ptr( shared_ptr<Y> && r, element_type * p ) BOOST_SP_NOEXCEPT : px( p ), pn()
     ^~~~~~~~~~

「型があってないよ、 boost::shared_ptr じゃないの?」って言われているっぽい。該当箇所を確認。

    std::unique_ptr< typename Factory::checker > p_checker( factory.create_checker() );
    std::tr1::shared_ptr< typename Factory::checker > chk( p_checker );

ここだけじゃよくわからないですね...。とりあえず言われた通り boost::shared_ptr に変えるか。

いや、他の定義は std::tr1::shared_ptr を使っているから、それに合わせるのが良さそう。

ということで該当箇所を std::tr1::shared_ptr に修正。

auto_ptr のワーニング対応版のビルド再挑戦

cd /cfg
make clean all
cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/
cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ
make clean all

OK.

これでワーニングもエラーも出なくなった。

これで最適化有効にしたらどうだろうと思って試したけどセグフォしました。

今回はここまで。

0 件のコメント:

コメントを投稿