2

アプリケーションを32ビットから64ビットに移植しています。このアプリケーションには、gSoapで生成されたANSICソースコードが含まれています。生成されたいくつかのsoap関数のプロトタイプにはint、引数リストに次のようなデータ型が含まれています。

int PASCAL FAR setsockopt (
                       __in SOCKET s,
                       __in int level,
                       __in int optname,
                       __in_bcount_opt(optlen) const char FAR * optval,
                       __in int optlen);

ただし、stdsoap2.cで呼び出されると、この例の5番目の引数にsizeofマクロが渡されます。

if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
{ ...
}

sizeofマクロは、size_t単なる。であるタイプの値を返しますunsigned int。32ビット環境でコンパイルする場合は問題ありませんが、64ビット環境でコンパイルする場合は 「からへの変換で データが失われる可能性があります」という警告が表示されます。unsigned __int64 int

データ損失の問題を理解しています。私の質問は、内部として渡される各マクロの(int)型キャスト以外の問題に対処するために、コード内のどこにどのように配置する必要があるかです(単独で32の警告があります)。可能であれば、自動生成されたソースファイルの編集は避けたいと思います。sizeofintstdsoap2.cstdsoap.c

gsoapメソッドに精通している人のために、私は以下を含めました:

#ifdef WITH_SOAPDEFS_H
# include "soapdefs.h"      /* include user-defined stuff */
#endif

soapdefs.h私のプロジェクトで使用しています。このファイルはプロジェクト全体の範囲を持っています。おそらくこのファイルは問題に対処するための良い場所になるでしょう、そして問題はどうやって

4

2 に答える 2

4

size_t「単なる」ではありませんunsigned int。警告が示すように、64ビットプラットフォームでは、通常、それよりも大きくなります。

チェックを実行する場所はアプリケーションによって異なりますが、式の値を渡す場合はsizeof、適切に定義された定数に置き換えることができます。

enum {
    SIZEOF_LINGER = sizeof(struct linger);
};

定数が大きすぎて変換できない場合、コンパイラーは警告を発行します。したがって、(GCCと同等の)を使用してコンパイルする-Wall -Werror場合は安全です。

于 2011-07-06T15:47:14.480 に答える
1

代わりにintを使用してsize_tを取得するメソッドを変更できない場合は、通常、C++のboost:: neuro_castなどを解決します。これは最善の方法のようであり、安全性を維持しながら警告を効果的に取り除くことができます。 。

基本的な考え方は次のとおりです。

int safe_cast( size_t n )
{
  if( n > INT_MAX )
  {
     //do something to handle this error
  }
  return (int) n;
}

ただし、あなたの場合は、sizeof( struct linger )INT_MAXを超えないことをかなり確信で​​きるので、intであり、そのサイズを保持するグローバル定数を提供することもできます。

于 2011-07-06T15:49:42.120 に答える