2

私はCで書かれたlibを持っています。コードでは、このような行がいくつか見つかりましたint x = x;。/Zw フラグを使用してコンパイルするには、このすべてのコードを書き直す必要があります。を意味する場所もありますint x = some_struct->x;が、別の場合はそれが何であるかを理解していません。いくつかの場所では、最初に x 変数を使用します。int x = x;したがって、どのような場合にそのような表現を使用できますか。

void oc_enc_tokenize_dc_frag_list(oc_enc_ctx *_enc,int _pli,
    const ptrdiff_t *_coded_fragis,ptrdiff_t _ncoded_fragis,
    int _prev_ndct_tokens1,int _prev_eob_run1){
    const ogg_int16_t *frag_dc;
    ptrdiff_t          fragii;
    unsigned char     *dct_tokens0;
    unsigned char     *dct_tokens1;
    ogg_uint16_t      *extra_bits0;
    ogg_uint16_t      *extra_bits1;
    ptrdiff_t          ti0;
    ptrdiff_t          ti1r;
    ptrdiff_t          ti1w;
    int                eob_run0;
    int                eob_run1;
    int                neobs1;
    int                token;
    int                eb;
    int                token1=token1;
    int                eb1=eb1;
    /*Return immediately if there are no coded fragments; otherwise we'd flush
       any trailing EOB run into the AC 1 list and never read it back out.*/
    if(_ncoded_fragis<=0)return;
    frag_dc=_enc->frag_dc;
    dct_tokens0=_enc->dct_tokens[_pli][0];
    dct_tokens1=_enc->dct_tokens[_pli][1];
    extra_bits0=_enc->extra_bits[_pli][0];
    extra_bits1=_enc->extra_bits[_pli][1];
    ti0=_enc->ndct_tokens[_pli][0];
    ti1w=ti1r=_prev_ndct_tokens1;
    eob_run0=_enc->eob_run[_pli][0];
    /*Flush any trailing EOB run for the 1st AC coefficient.
      This is needed to allow us to track tokens to the end of the list.*/
    eob_run1=_enc->eob_run[_pli][1];
    if(eob_run1>0)oc_enc_eob_log(_enc,_pli,1,eob_run1);
    /*If there was an active EOB run at the start of the 1st AC stack, read it
       in and decode it.*/
    if(_prev_eob_run1>0){
      token1=dct_tokens1[ti1r];
      eb1=extra_bits1[ti1r];
      ti1r++;
    eob_run1=oc_decode_eob_token(token1,eb1);

コード例 - 変数-ファイル内token1での最初の使用であり、他のファイルで出会うことはありません。グローバルではなく、どこでも静的ではありません...token1token1

/Zwフラグで更新
:エラーC4700:初期化されていないローカル変数 'token1'がフラグなしで使用され います
:すべてこのlibで正常に動作します
更新2
theora 1.1.1lib です答えのために

int x = x;int x = 0

4

2 に答える 2

7

文字通り を持っている場合int x = x;、それをあまり使用することはありません。xこの部分は、それ自体、つまり初期化されていない変数の値で初期化を試みます。

これにより、初期化されていない変数または未使用の変数に関連するコンパイラの警告/エラーが抑制される場合があります。ただし、一部のコンパイラは、これらの疑わしいケースもキャッチできます。

これはおそらく、C 標準の観点からも未定義の動作になります。

EDIT : Debian Linux の乱数バグは、初期化されていない変数の使用と悪用、および 1 日で支払う可能性のある代償に関する記事 (詳細なリンク付き) です。

于 2013-04-25T10:52:43.643 に答える
5

これにより、変数が使用されていないという警告がコンパイラによって出力されなくなります。

于 2013-04-25T10:51:58.470 に答える