前回からの続き。
順番的には、
- ワーニングをなくす
- 最適化を有効にしてもセグフォが起こらないようにする
という感じで進めれば良さそうですかね?
やっていきます。
ワーニングの確認
発生するワーニングは次の通り。
# 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_ptr
と sscanf
のワーニングだけっぽい。
scanf
のワーニング対応
%llx
は long long unsigned int
のためのプレースホルダだけど、 Linux 64bit の uint64_t
は long unsigned int
だから怒られているようだ。
- uint64_t ‐ 通信用語の基礎知識
- 今回使った Ubuntu の、どこで定義されているのかはよくわからなかった
ということは、 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.cpp
を sed
で置換するだけで良さそう。
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 件のコメント:
コメントを投稿