【问题标题】:splint failing on code that includes complex.h夹板在包含 complex.h 的代码上失败
【发布时间】:2010-06-29 19:32:38
【问题描述】:

我正在尝试在包含标准 C 库中的 complex.h 的 C 源代码上运行 splint 以支持复杂算术。

很遗憾,splint 失败并出现以下错误。

夹板 3.1.2 --- 2009 年 5 月 3 日

/usr/include/bits/cmathcalls.h:54:31: 解析错误:非函数声明: _Complex :外部双精度。 (有关解析错误的帮助,请参阅 splint -help 解析错误。) *** 无法继续。

谷歌搜索该问题后,拆分讨论邮件列表中只有this message(仍未得到答复)。

有什么想法吗?

更新

这是一个非常简单的失败源示例:

#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.

【问题讨论】:

    标签: c static-analysis complex-numbers splint


    【解决方案1】:

    我不是夹板用户,所以请对以下内容持保留态度...

    _Complex 关键字是与 C99 一起添加的,夹板常见问题解答中有这样说 C99 (http://www.splint.org/faq.html#quest15):

    但是,Splint 还不支持所有 C99 扩展,因此需要修改一些合法的 C 程序。

    我猜_Complex 已被该警告所涵盖。

    您也许可以使用常见问题解答 (http://www.splint.org/faq.html#quest14) 中描述的技术解决夹板明显缺乏对_Complex 的支持,但如果这让您在帮助夹板处理 C99 方面取得了很大进展,我会感到惊讶代码使用_Complex:

    如果只是想忽略某个关键字,可以加上-Dnonstandardkeyword=,让预处理器去掉这个关键字,其中nonstandardkeyword是关键字的名字。

    【讨论】:

    • +1 谢谢迈克尔。我尝试通过传递 -D_Complex=?? 来忽略和重新定义 _Complex 关键字。夹板,但夹板继续阻塞复数定义的虚部(例如复数 x = 2 + 8i)。将使用更多信息更新问题。
    【解决方案2】:

    我一直在努力让夹板忽略标题,并且在网上的任何地方都找不到合适的答案。我终于使用了夹板的内置帮助,发现了这个:

    #ifndef S_SPLINT_S #万一

    如果您将这对放在您希望夹板忽略的代码周围,它将忽略它!至少我发现的其他东西都不适用于系统头文件。

    【讨论】:

      【解决方案3】:

      我最终解决了这个问题,方法是在调用 splint 时暂时用虚拟覆盖 complex.h

      [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 文件抑制相关关键字并用虚拟的替换常量/函数。这些关键字/常量/函数来自the specs

      此文件的副本可在此处获得:https://gist.github.com/1316366

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        • 1970-01-01
        • 2013-10-17
        • 2011-11-04
        • 2017-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多