4

エラーメッセージを出力して終了するdie関数があります。

void die(const char* msg) {
    fprintf(stderr, "Error: %s\n", msg);
    exit(1);
}

Parasoft C++testを使用してコードを静的に分析しますが、それがdie戻り値のない関数であることを認識していません。したがって、次のようなコードが表示された場合:

void foo(Bar* bar) {
    if(!bar) {
        die("bar is NULL");
    }
    Bar bar2 = *bar;
}

*barNULL であるとその行が実行されなくなりますが、null ポインターを逆参照している可能性があることを警告しbarます。dieParasoft が認識できる方法で非リターンとしてマークする方法はありますか?


編集:GCCとVS 2003の両方で機能するものが必要ですが#ifdef、誰かがVSでのみ機能するソリューションを持っている場合、私は物事を回避する方法を超えていません

4

3 に答える 3

3

私はそれを考え出した。Parasoft には、カスタマイズ可能な NRF のリストが組み込まれていることがわかりました。それらは「終了関数」と呼ばれます。VS の外で Parasoft を実行している場合は、VS GUI または構成ファイルを介して編集できます。

Visual Studio 経由

構成ファイルを介して

次のような行を追加します。

com.parasoft.xtest.checker.flowanalysis.terminators.api0.methods=active\=true|name\=die|type\=*|paramsn\=*|defsInSubClasses\=true;
com.parasoft.xtest.checker.flowanalysis.terminators.apis=active\=true|name\=foo;
于 2011-04-19T18:00:06.523 に答える
2

gcc では、関数に次のような属性を付ける必要があります。

     die (const char *, ...) 
          __attribute__ ((format_arg (1)))
          __attribute__ ((noreturn))
于 2011-04-19T14:28:56.153 に答える
1

Visual Studio 2005 以降を使用している場合は、次__declspec(noreturn)のように使用できます。

__declspec(noreturn) void die(char const* msg){
  fprntf(stderr, "Error: %s\n"; msg);
  exit(1);
}

おそらくそれは、Parasoft が関数を返さないものとして認識するのに役立ちます。
編集: GCCには__attribute__((noreturn))(最初の例)があります。

于 2011-04-19T14:24:16.157 に答える