質問

私は、私が最近書いたCプログラムでスプリントに試して、理解して削除しようとしていますそれが与える警告。一つ私が理解していますが、次のコードスニペットから来て削除する方法を理解することはできません。

static MyType_t *findById(const int id)
{
    int i;

    for (i = 0; i < MY_ARR_SIZE; i++) {
            if (my_arr[i].id == NOT_SET) {
                    /* Items are sorted so that items with 
                    NOT_SET as ID are at the end of the array */
                    break;
            }
            if (my_arr[i].id == id) {
                    return &(my_arr[i]);
            }
    }
    return NULL; 
}

スプリントは、関数がNULLを返すことができることを幸せではないが、この場合には、それは完璧な理にかなっています。

私はの@nullwhenfalse @ /使用してみましたの/機能がfalse / trueを返し、またRETVALを使用するようにコードを変更しようとしたとの両方/ をしようとした場合にのみ動作するようです@ヌル@ の/と/ の@relnull @ の/宣言の前にあるが、これらは何もしませんでした。

(ジャストサイドノートとして、テーブルはわずか20大気圧、巧妙な検索アルゴリズムを使用してのでない点である。)

役に立ちましたか?

解決

あなたは/ * @ヌル@ * /宣言の前での使用を再確認する必要があります。

はあなたの例の以下のコンパイルバージョンでは、それは(スプリント3.1.2を使用して)警告を削除します:

typedef struct { int id; } MyType_t;
#define NOT_SET -1
#define MY_ARR_SIZE 20
static MyType_t my_arr[MY_ARR_SIZE];

/*@null@*/ static MyType_t *findById(const int id)
{
    int i;
    for (i = 0; i < MY_ARR_SIZE; i++) {
            if (my_arr[i].id == NOT_SET) {
                    /* Items are sorted so that items with 
                    NOT_SET as ID are at the end of the array */
                    break;
            }
            if (my_arr[i].id == id) {
                    return &(my_arr[i]);
            }
    }
    return NULL;
}

int main() {
    (void)findById(10);
    return 0;
}

あなたはまだ同様の警告を持っている場合、それはあなたのコードの別の部分についてのだろうか?

他のヒント

splint -nullretはその警告を(グローバル)スカッシュれるかもしれないか、あなたがやりたいことではないかもしれません。いくつかのケースでは、あなたがない限りの の確認の型リターンNULLが正しい持つ、あなたはおそらくをしたいの警告ます。

私はジェロームの例をテストし、そしてそれは、その特定の機能のための警告を静けさでした。

何をするにしても、私は強く、ソースに直接スプリントコードを埋め込むことが、代わりにマクロでその機能をラップしないことをお勧めします。

たとえば、オーバーオウムのプロジェクトで、私は

これらのマクロを持っています
#  define ARGIN(x)                    /*@in@*/ /*@notnull@*/
#  define ARGIN_NULLOK(x)             /*@in@*/ /*@null@*/
    /* The pointer target must be completely defined before being passed */
    /* to the function. */

#  define ARGOUT(x)                   /*@out@*/ /*@notnull@*/
#  define ARGOUT_NULLOK(x)            /*@out@*/ /*@null@*/
    /* The pointer target will be defined by the function */

そして、マクロが使用されているので、使用することができます:

void copy_string( ARGOUT(char *target), ARGIN(const char *source ) ) ...

私たちはARGIN()の引数の処理方法を変更したい場合は、私たちは一つの場所を変更します。また、複数のツールやコンパイラのために複数の表記をサポートすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top