1

複雑な演算をサポートするために、標準Cライブラリをsplint含むCソースで実行しようとしています。complex.h

残念ながら、splint次のエラーで失敗します。

Splint 3.1.2---2009年5月3日

/usr/include/bits/cmathcalls.h:54:31:解析エラー:非関数宣言:_Complex:externdouble。(解析エラーのヘルプについては、splint -help parseerrorsを参照してください。)***続行できません。

問題をグーグルで検索すると、分割ディスカッションメーリングリストにこのメッセージのみが表示されました(未回答のままです)。

何か案は?

アップデート

失敗したソースの非常に簡単な例を次に示します。

#include <complex.h>

int main() {
  complex x = 2 + 8i;
  x = x + 1;
}

_ComplexサポートされていないC99キーワードを再定義しようとすると、複素数の虚数部でエラーが発生します(これは驚くことではありません)。

lsc@deepthought:~$ splint-D_Complex=double temp.c  
Splint 3.1.2 --- 03 May 2009

 temp.c:4:20: Parse Error. (For help on
 parse errors, see splint -help
                parseerrors.)
*** Cannot continue.
4

3 に答える 3

3

私はスプリントのユーザーではないので、次のことは一粒の塩で考えてください...

キーワードは C99 で追加され、_Complexスプリントの FAQ には C99 について次のように書かれています ( http://www.splint.org/faq.html#quest15 ):

ただし、Splint はまだすべての C99 拡張機能をサポートしているわけではないため、修正が必要な正当な C プログラムがいくつかあります。

_Complexそれはその警告でカバーされていると思います。

_ComplexFAQ ( http://www.splint.org/faq.html#quest14 ) で説明されている手法を使用することに対する splint のサポートの明らかな欠如を回避できるかもしれませんが、これが非常にうまくいった場合は驚くでしょう。次を使用してスプリントがC99コードを処理するのを支援します_Complex

キーワードを無視したいだけの場合は-Dnonstandardkeyword=、プリプロセッサがキーワードを削除するように追加できますnonstandardkeyword。 はキーワードの名前です。

于 2010-06-29T20:01:17.507 に答える
2

スプリントにヘッダーを無視させるのに苦労し、オンラインのどこにも適切な答えが見つかりませんでした。私は最終的にスプリントの組み込みヘルプを使用し、これを発見しました:

#ifndef S_SPLINT_S

#endif

スプリントに無視させたいコードの周りにこのペアを置くと、無視されます! 少なくとも私が見つけたシステムヘッダーファイルでは、他のものはどれも機能しません。

于 2013-09-17T09:37:43.357 に答える
0

complex.hを呼び出すときに一時的にダミーのものでオーバーライドすることで、最終的にこれを解決しましたsplint

[lsc@home]$ ls /opt/qa_tools/utils/splint_includes/
complex.h

[lsc@home]$ splint -I/opt/qa_tools/utils/splint_includes test.c
Splint 3.1.1 --- 15 Jun 2004

Finished checking --- no warnings

ダミーcomplex.hファイルは、関連するキーワードを抑制し、定数/関数をダミーのものに置き換えます。これらのキーワード/定数/関数は仕様から収集されました

このファイルのコピーは、https ://gist.github.com/1316366 から入手できます。

于 2011-10-26T13:38:42.077 に答える