Splint (厳密モード) で C プログラムをチェックしようとしています。Splintが私のプログラムを理解できるように、ソース コードにセマンティック コメントで注釈を付けました。すべて問題ありませんでしたが、警告を取り除くことができません:
ステートメントは効果がありません (制約のない関数 my_function_pointer への呼び出しにより、影響を受けない変更が行われる可能性があります)。
ステートメントには目に見える効果はありません --- 値は変更されません。制約のない関数への呼び出しを通じて何かを変更する場合があります。(-noeffectuncon を使用して警告を禁止します)
これは、関数ポインタを介した関数呼び出しが原因です。私はフラグを使用しないことを好みますが、no-effect-uncon
それを修正するためにいくつかの注釈を書きます。typedef
そのため、適切な句で装飾しました@modifies
が、Splint はそれを完全に無視しているようです。問題は次のように縮小できます。
#include <stdio.h>
static void foo(int foobar)
/*@globals fileSystem@*/
/*@modifies fileSystem@*/
{
printf("foo: %d\n", foobar);
}
typedef void (*my_function_pointer_type)(int)
/*@globals fileSystem@*/
/*@modifies fileSystem@*/;
int main(/*@unused@*/ int argc, /*@unused@*/ char * argv[])
/*@globals fileSystem@*/
/*@modifies fileSystem@*/
{
my_function_pointer_type my_function_pointer = foo;
int foobar = 123;
printf("main: %d\n", foobar);
/* No warning */
/* foo(foobar); */
/* Warning: Statement has no effect */
my_function_pointer(foobar);
return(EXIT_SUCCESS);
}
マニュアルを読んだのですが、関数ポインタとそのセマンティックアノテーションに関する情報があまりなく、何か間違ったことをしているのか、それともバグなのかわかりません (ちなみに、ここにはまだ記載されていません)。 : http://www.splint.org/bugs.html )。
ストリクト モードで Splint を使用して、このようなプログラムを正常にチェックできた人はいますか? Splintを幸せにする方法を見つけるのを手伝ってください:)
前もって感謝します。
更新 #1: splint-3.1.2 (Windows バージョン) では警告が表示されますが、splint-3.1.1 (Linux x86 バージョン) では警告が表示されません。
更新 #2: Splint は、割り当てと呼び出しが短いか長いかは気にしません。
/* assignment (short way) */
my_function_pointer_type my_function_pointer = foo;
/* assignment (long way) */
my_function_pointer_type my_function_pointer = &foo;
...
/* call (short way) */
my_function_pointer(foobar);
/* call (long way) */
(*my_function_pointer)(foobar);
更新 #3:警告を禁止することに興味はありません。簡単だ:
/*@-noeffectuncon@*/
my_function_pointer(foobar);
/*@=noeffectuncon@*/
私が探しているのは、表現する正しい方法です:
「この関数ポインタは関数を指しているため
@modifies
、副作用があります」