0

ここでのポイントは、int header = (((int)(txUserPtr) - 4))UserTypesのコード図であり、構造体ポインターのキャストは非常に役立ちます。次の行をスキップするtxUserPtrように、着信ポインタをどのように設定すればよいですか。Fun()実行したくないerror()

typedef union UserTypes
{
    SAUser           AUser;
    BUser            BUser;
    SCUser           CUser;
    SDUser           DUser;
} UserTypes;

typedef struct AUser
{
    int              userId;
    int              dbIndex;
    ChannelType      ChanType;
 } AUser;
typedef struct AUser
{
    int              userId;
    int              dbIndex;
    ChannelType      ChanType;
 } AUser;

typedef struct BUser
{
    int              userId;
    int              dbIndex;
    ChannelType      ChanType;
 } BUser;

typedef struct CUser
{
    int              userId;
    int              dbIndex;
    ChannelType      ChanType;
 } CUser;

typedef struct DUser
{
    int              userId;
    int              dbIndex;
    ChannelType      ChanType;
 } DUser;

//this is the function I want to test

void Fun(UserTypes * txUserPtr)
{

   int header = (*((int*)(txUserPtr) - 4));

   //the problem is here
   //how should i set incoming pointer "txUserPtr" so that 
   //Fun() would skip following lines.
   // I don't want to execute error()

        if((header & 0xFF000000) != (int)0xAA000000)
        {
            error("sth error\n");
        }
   /*the following is the rest */ 
}
4

3 に答える 3

1

このコードは、未定義の動作と、さまざまな実装定義の動作に依存しています。コードのどこかに、次のような構造体があるはずです。

typedef struct 
{
  unsigned int header;
  UserTypes user;
} AHeaderPlusUserTypes;

その構造体を見つけたら、コードを修正します。

void Fun (AHeaderPlusUserTypes* txUserPtr)
{
  if((txUserPtr->header & 0xFF000000u) != 0xAA000000u)
  {
    error("sth error\n");
  }
  /*the following is the rest */ 
}
于 2012-05-31T13:36:54.203 に答える
0

質問を理解するのは非常に難しいです。

ポインタの最上位ビットに特定のビットパターンが含まれることは避けたいと考えていますが、削除されたコードでアクセスできるアドレスがポインタに含まれていると予想されるかどうかは不明です。

これを解決するには、プラットフォームの正確なメモリマップに関する詳細情報が必要になると思います。

于 2012-05-31T11:53:28.553 に答える
0

このコードはどうですか?

void Fun (int header, UserTypes* txUserPtr)
{
  // exactly safe code
  if ( header & 0xFF000000u) != 0xAA000000u ) {
    error("sth error\n");
  }
  /*the following is the rest */ 
}
于 2012-05-31T13:47:22.853 に答える