スプリントでヌルの警告を削除します
-
21-09-2019 - |
質問
私は、私が最近書いた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()の引数の処理方法を変更したい場合は、私たちは一つの場所を変更します。また、複数のツールやコンパイラのために複数の表記をサポートすることができます。