Gcc 尝试使用Perl或MinGW或

Gcc 尝试使用Perl或MinGW或,gcc,windows-7-x64,mingw-w64,strawberry-perl,frama-c,Gcc,Windows 7 X64,Mingw W64,Strawberry Perl,Frama C,我想使用frama-c进行静态c代码分析。我已经花了一些努力来正确安装它(希望如此)。这些文件位于C:\code分析\frama-C。我想通过Windows控制台应用它,例如: C:\code分析\frama-C\bin\frama-C hello.C c只是一个简单的hello world程序(顺便说一句,我不是c程序员,也是编程新手) 是的,我安装了Perl,但不知道Frama为什么使用它。在我看来,stdio.h似乎有点问题。这可能是吗?但是我可以成功地编译我的程序 C:\草莓\C\bin

我想使用frama-c进行静态c代码分析。我已经花了一些努力来正确安装它(希望如此)。这些文件位于
C:\code分析\frama-C
。我想通过Windows控制台应用它,例如:

C:\code分析\frama-C\bin\frama-C hello.C

c只是一个简单的hello world程序(顺便说一句,我不是c程序员,也是编程新手)

是的,我安装了Perl,但不知道Frama为什么使用它。在我看来,
stdio.h
似乎有点问题。这可能是吗?但是我可以成功地编译我的程序

C:\草莓\C\bin\gcc hello.C
生成一个运行良好的exe文件

从文件中删除include语句时,会有以下输出:

[kernel] preprocessing with "gcc -C -E -I. hello.c"
C:/Strawberry/c/x86_64-w64-mingw32/include/stdio.h:141:[kernel] user error: syntax error
[kernel] user error: skipping file "hello.c" that has errors.
[kernel] Frama-C aborted: invalid user input
[kernel] preprocessing with "gcc -C -E I. hello.c"
hello.c:5:[kernel] warning: Calling undeclared function printf. Old style K&R code?
所以frama本身是有效的,这是我所期望的输出

我还安装了MinGW,并试图让Frama使用它进行编译。因此,我删除了Windows路径中的草莓条目。之后,调用frama-c将产生相同的输出

当完全卸载草莓Perl时,frama不起作用(声明gcc是一个未知命令),尽管
C:\MinGW\mingw64\bin
也被添加到我的Windows路径中,即使是作为第一个条目

C:\MinGW\mingw64\bin\gcc hello.C
有效,
gcc hello.C
无效

安装Perl时,
gcc hello.c
可以工作,即使我从Windows Path变量中删除草莓部分。Wtf


如何使事情正常工作?

这里有几个问题,我们必须将它们隔离开来才能解决问题

  • 草莓Perl默认情况下在目录
    C:\草莓\C\bin
    上安装自己的gcc(基于MinGW)、binutils、C头文件等。它将此目录(以及其他目录)添加到Windows
    Path
    变量中。Frama-C希望路径中有
    gcc
    ,如果路径中有多个目录包含
    gcc
    二进制文件,则由Windows决定选择哪个gcc。这就是Frama-C似乎使用它的原因

  • 一个常见的错误(不是Windows特有的,但由于其图形应用程序的性质,在Windows中更常见)是修改环境变量,忘记重新启动仍有旧副本的进程(如命令提示符)<如果对当前命令提示符的值有任何疑问,代码>echo%path%应确认当前命令提示符的路径中存在哪些目录

  • 如果
    echo%path%
    包含预期值,则可能会发生这种情况(不幸的是,我无法复制您的配置以对其进行彻底测试):在Frama-C的安装过程中,它可能会使用安装期间存在的设置来选择包含gcc的目录(在您的情况下,
    C:\草莓\C\bin
    )以及稍后在其脚本中硬编码此目录

    这可以解释为什么在卸载草莓Perl后,即使路径中有另一个gcc,Frama-C也不会考虑它。理想情况下,在路径中使用单个gcc重新安装Frama-C可以让它这次找到正确的版本。请注意,这只是一个假设,我在这里可能完全错了

    在任何情况下,您遇到的主要问题不是gcc本身,而是草莓Perl中包含的头,如下一项所述

  • 关于错误消息:

    C:/Strawberry/c/x86_64-w64-mingw32/include/stdio.h:141:[kernel] user error: syntax error
    [kernel] user error: skipping file "hello.c" that has errors.
    
    事实上,它的信息量不大,在将来的版本中可能会更改,但它确实指向导致错误的源代码行(文件
    stdio.h
    ,第141行):

    特别是,这里的错误源似乎是
    \uuuuu restrict\uuuuu
    (Frama-C钠接受
    restrict
    \uu restrict
    ,但不接受
    \uuu restrict\uuuuu
    ;这在未来的版本中可能会改变)

    不幸的是,即使解决了这一问题(例如,在文件中添加
    #定义#限制#限制
    #包括)不保证文件的其余部分将被解析,因为它似乎是一个Windows特定的、易于使用C++的头文件,可能包含C99标准中没有的、Frama-C可能不接受的其他C定义/扩展名

  • 最好的解决方案是确保Frama-C使用自己的
    stdio.h
    头,而不是草莓Perl头。它通常安装在
    share/Frama-C/libc
    中(也就是说,它可以安装在
    C:\CodeAnalysis\Frama-C\share\Frama-C\libc
    中),但根据您的配置,在执行过程中可能找不到头,而是包含了草莓Perl的头

    针对此特定情况的快速破解可能会替换:

    #include <stdio.h>
    
    但这远远不够理想,而且可能导致其他错误

    如果您设法找到如何防止包含草莓Perl的头文件,并确保包含Frama-C的头文件,那么您应该能够运行Frama-C

    关于Cygwin/MinGW路径问题的说明 我在使用MinGW编译器和Cygwin构建时遇到了一些问题(这不一定是一个好主意),因此下面是一些关于如何使用Cygwin shell(而不是基于Cygwin的OCaml编译器)使用基于MinGW的OCaml编译器构建Frama-C的快速说明,以防它可能会对某人有所帮助:

  • 运行
    /configure
    时,需要使用基于Windows的路径而不是基于Cygwin的路径指定
    --前缀
    ,例如:

    /configure--prefix=“C:/code分析/构建”

    如果不这样做,则在运行Frama-C(在
    make/make install
    之后)时,它将无法找到
    libc/\uuuu fc\u buildin\u for\u normalization.i
    文件,因为它将尝试使用基于Cygwin的路径,这将无法与基于MinGW的OCaml编译器一起工作

    请注意,不能使用反斜杠(
    \int __cdecl __mingw_vsscanf (const char * __restrict__ _Str,
        const char * __restrict__ Format,va_list argp);
    
    #include <stdio.h>
    
    #include "C:\CodeAnalysis\frama-c\share\frama-c\libc\stdio.h"