2017-11-23 29 views
-2

なることができ、私は(get_my_struct_from_ [X]機能の復帰の可能性を説明するために実施例)構造またはNULLを指すポインタを返すことができる機能を有している:cppcheckヌルポインタ参照、それは実際にヌル

struct my_struct *my_function(my_struct i) { 
    if (i.value < 5) return i; 
    else return NULL; 
} 

struct my_struct *q; 
q = get_my_struct_from_A(); 
if (q == NULL) { 
    // display an error message and exit 
} 

q = get_my_struct_from_B(); 
if (q == NULL) { 
    // display an error message and exit 
} 

CppCheckは文が冗長であるか、可能NULLポインタdereferenがある場合ことを私に語っている:私は、この関数を複数回呼び出すと、値がNULLであるかどうかをチェックしていますメインプログラムで

ce。

質問:

  1. CppCheckは私にこれらのメッセージを与えないのはなぜ? my_functionのは、2つの機能を取得する方法のための一例であることを言及するのを忘れた

    :どのように正しく関数の戻り値をチェックするので、私はこのメッセージ

がEDIT得ることはありません

  • 行動する。

    get_my_struct_from_Aとget_my_struct_from_Bの内部ロジックは異なりますが、出力データ型はmy_functionのshowと同じです。私はget_my_struct_from_X関数をたくさん持ち、戻り値をチェックします。したがって、各getの新しい構造体を作成することはオプションではありません。同じ目的のために使用される変数が大量であるため、その点を考慮しません。

    q == nullまたは!qを書くと、普通のことと思われるcppcheckから同じメッセージが返されます。

  • +0

    'my_function'に問題があります:戻り値の型は' struct my_struct * '(ポインタ)ですが、' int'( 'i')を返します。 –

    +0

    cppcheckを使用する前に、警告なしでshopuldをコンパイルしてください。もしあなたが警告を受け取らなかったなら、 '-Wall'でコンパイルしてください –

    +0

    ' my_function'は 'get_my_struct_from_A'と同じですか? – hnefatl

    答えて

    1

    i.valueが5未満の場合、関数はstruct my_struct *を返し、返されたものは何ですか? struct my_struct

    また、このような関数を宣言した場合は、そうしなかったパラメータを渡す必要があります。

    struct my_struct *my_function(struct my_struct* i) { 
        if (i->value < 5) return i; 
        else return NULL; 
    } 
    

    何を示したことはあなたが以下に要約されている問題/提案がありましたどのような場合は、この

    struct my_struct a; 
    ... 
    struct my_struct *q = my_function(&a); 
    if(!q){ 
        // it returned NULL 
    } 
    

    のようにそれを呼び出します。

    • P方法から間違ったタイプを返します。

    • Pget_my_struct_from_Aがあなたの元のコードにmy_functionと同じである場合、あなたはどのあなたがすべきパラメータを渡していません。

    • Sこのような小さな検査は、渡された構造に基づいて真または偽を返す関数を使用すると、はるかに簡単に行うことができます。

      bool my_function(struct my_struct ms);

    +0

    ここでの主な問題は、静的解析の前に、このコードを最初の場所で完全にコンパイルする方法です。 – Lundin

    +0

    @ Lundin:はい私はOPが正確なコードを投稿していないか、OPがここに投稿中にOPを変更したと思います。それ以外の場合は、私にエラーが発生します。そういうわけで、OPがコンパイル可能なコードを書くようになる点を明示しました。 – coderredoc

    +0

    @coderredoc私は正確なコードを投稿していない、私はコードの応答をしたくない私はこの問題を抱えている理由についての説明をしたい。質問にいくつかの説明を追加しました。 – Czoka

    0
    struct my_struct *my_function(my_struct i) { 
        if (i.value < 5) return i; 
    

    これは、有効なC(またはC++)コードではありません。コンパイラが壊れているか、正しく構成されていません。

    整数を返しますが、関数はポインタを返します。発現は、それが出現する関数の戻り型とは異なる タイプを持っている場合、

    値を持つオブジェクトに割り当てたかのように変換 ある:C標準は、C11 6.8.6.4明らかです関数の戻り値の型

    コードがstruct my_struct* tmp = i;に相当することを意味します。これは、C言語が「単純な割り当て」と呼ぶものとみなすことができます。簡単な代入の規則C11 6.5.16.1によれば、代入の左のオペランドがポインタの場合、右のオペランドは整数ではありません。

    したがって、コンパイラにこのコードの診断メッセージが必要です。そうでなければ、何かが間違っています。

    +1

    'i'は(構造体の名前が不十分な)' struct'であることを除いて良いです。 –

    関連する問題