melt日記

.NETすらまともに扱えないへたれのページ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  111  : 記事  3  : コメント  8241  : トラックバック  41

ニュース

わんくま同盟

わんくま同盟

C# と VB.NET の質問掲示板

iKnow!


Dictation



書庫

VS2005 で strcpy() を使おうとすると、「warning C4996: 'strcpy' が古い形式として宣言されました。」というメッセージが表示されるので、strcpy() を strcpy_s() に変更する訳ですが、strcpy_s() の戻り値である error_t のエラーをチェックしてる人っているんでしょうか?

strcpy_s() の使用者はあくまで strcpy() としての機能が欲しいのであり、それで警告が出るから仕方なく strcpy_s() にしているだけなのです。

?

でも、いざというときに error_t がエラーを返してきたらどうしよう、ということも考えてしまうわけです。

だからといって error_t をチェックしてどうこうなんて、めんどくさくてやってられません。

そこで考えつくのが error_t を例外にして投げるラッパーを作ってやることです。

inline void strcpy_s_ex(
    char* strDestination,
    size_t numberOfElements,
    const char* strSource)
{
    error_t e = ::strcpy_s(strDestination, numberOfElements, strSource);
    if (e != 0)
    {
        throw e;
    }
}

こうすることによって、わざわざエラーチェックをする必要が無くなり、例外をどこかでハンドリングしてやれば大丈夫ということになります。

少なくとも error_t のチェックを行わないよりは信頼性が上がるでしょう。

?

で、これを全ての関数について定義していくのは結構骨の折れる作業なのですが、実は ATL の一部である atlchecked.h に、strcpy_s() 等の error_t を返す関数を例外に変換するラッパーが定義されています。

namespace ATL
{

inline errno_t AtlCrtErrorCheck(errno_t nError)
{
    switch(nError)
    {
    case ENOMEM:
        AtlThrow(E_OUTOFMEMORY);
        break;
    case EINVAL:
    case ERANGE:
        AtlThrow(E_INVALIDARG);
        break;
    case 0:
    case STRUNCATE:
        break;
    default:
        AtlThrow(E_FAIL);
        break;
    }
    return nError;
}

namespace Checked
{

inline void __cdecl strcpy_s(
    __out_ecount(_S1max) char *_S1,
    __in size_t _S1max,
    __in_z const char *_S2)
{
    AtlCrtErrorCheck(::strcpy_s(_S1, _S1max, _S2));
}

inline void __cdecl wcscpy_s(...)
{
    ...
}

...

}

}

ATL::Checked ネームスペースの下に、同名の関数が定義されています。

どうせ error_t のチェックなんて行わないのですから、こちらを使った方が良いかと思われます。

?

以上、ATL には意外に便利な関数がありますよーというお話でした。

投稿日時 : 2007年8月1日 23:31

コメント

# re: atlchecked.h 2007/08/02 2:08 とっちゃん
同様のネタに、AtlThrowLastErrorWin32() だったかな?もあります<家だと関数名わからんw
あと、_com_util::CheckError() というのもw


# re: atlchecked.h 2007/08/02 14:44 ddnp
へー。しらなんだしらなんだ。
勉強になります。

わっしはいつも#pragma warning(pushのdisableで殺しちゃうなあ。
改めないといかん。(反省

# re: atlchecked.h 2007/08/02 15:31 melt
>とっちゃん
AtlThrowLastWin32() っていうのがそうみたいですねw
どうせなら WindowsAPI 全部ラップしてくれればいいのに、とか思いましたw

>ddnp さん
そういう方法もありますけど、自分からセキュリティを殺すのは怖いのでw

ただまあ、既に十分動いてる信頼性のあるプログラムを VS2005 に移行しようとしたら warning が大量に出たとかであれば、別に pragma で潰しても良いとは思います。
もちろん新規に追加するプログラムはちゃんと warning が出るようにしないといけないですが……。

# jianbin0301 2018/03/01 14:23 165464@qq.com
http://www.christian-louboutin.us.org
http://www.oakleysunglasses-clearance.us.com
http://www.airmax90uk.co.uk
http://www.poloralphlaurencheap.us.com
http://www.fitflopssales.org.uk
http://www.polooutletsfactorystore.us.com
http://www.longchampoutlet.us.com
http://www.pandoracharmssale-clearance.me.uk
http://www.poloralphlaurenshop.us.com
http://www.ralphlauren-poloshirts.org.uk
http://www.coachoutletclearance.us.com
http://www.coachoutletonlineshops.us.com
http://www.nikeblazerpaschers.fr
http://www.cheapmlbjerseys.net
http://www.burberryoutletus.us.com
http://www.michaelkorshandbags.in.net
http://www.michaelkorsoutletonlineus.us.com
http://www.adidasnmduk.org.uk
http://www.truereligionjeanssale.com
http://www.christian-louboutinshoes.us.org
http://www.michaelkors-handbagsuk.me.uk
http://www.canadagooseoutletco.us.com
http://www.michaelkorshandbagsclearancestore.us.com
http://www.reeboktrainers.me.uk
http://www.canadagoosejacketssale.ca
http://www.canada-goosejacketsoutlet.us.com
http://www.ralphlaurenpoloshirtss.us.com
http://www.ferragamooutletstore.net
http://www.converseshoes.us.com
http://www.coachoutlet-canada.ca
http://www.truereligionjeans.co.uk
http://www.cheap-jerseyswholesale.us.com
http://www.vans-shoes.cc
http://www.coachfactoryoutlet-sale.us.com
http://www.cheapjordan-shoes.us.com
http://www.cheapoakleysunglassesfactory.us.com
http://www.poloralphlauren-outlets.us.com
http://www.pandoraoutletshop.us.com
http://www.mulberryhandbagsoutlets.me.uk
http://www.coachfactoryoutletcoachoutlet.us.com
http://www.true-religionjeanssale.us.com
http://www.oakleysunglasseseye.us.com
http://www.canadagoosejackets-outlet.us.com
http://www.valentinooutlet.us.com
http://www.polooutletclearance.us.com
http://www.nobisoutlet.us.org
http://www.uggoutlets.ca
http://www.uggoutlet-onlineclearance.us.com
http://www.uggoutletstoresofficial.us.com
http://www.raybanssunglassessale.us.com
http://www.canadagoosejacketsusa.us.com
http://www.pandora-charmssaleclearance.org.uk
http://www.michaelkors.eu.com
http://www.raybansunglassesoutlets.com.co
http://www.swarovski-outlets.us.com
http://www.kobe9elites.us.com
http://www.nbajerseysstore.us.com
http://www.michaelkors.de.com
http://www.ferragamoshoes.org.uk
http://www.lacostepoloshirts.us.com
http://www.airforce1.us.com
http://www.canadagoose-jackets.org.uk
http://www.canadagoosejackets.me.uk
http://www.michaelkorsoutletclearance-online.us.com
http://www.fitflopssale.in.net
http://www.canadagoosejacketscg.ca
http://www.jordanshoesshop.us.com
http://www.pandoracharmss.us.com
http://www.pandoraoutlet-store.us.com
http://www.cheapjerseyswholesale.org
http://www.newbalanceshoes.in.net
http://www.coachfactoryoutlet-clearance.us.com
http://www.swarovskicrystalco.org.uk
http://www.montblancpenssale.us.com
http://www.fredperrypolo-shirts.com
http://www.rayban--sunglasses.co.uk


# michael kors factory outlet 2018/05/21 12:57 jinyizhixia
http://www.cheap-raybans.com.co
http://www.katesspadeoutlet.us.com
http://www.red-bottomshoes.us.org


Post Feedback

タイトル
名前
Url:
コメント