代码之家  ›  专栏  ›  技术社区  ›  Pierre G.

为什么在基本示例中frama-c警告“访问未初始化的左值”?

  •  2
  • Pierre G.  · 技术社区  · 6 年前

    FRAMA-C认为以下代码正确(无警告,无错误):

    #include <stdio.h>
    #include <stdlib.h>
    
    int *p;
    
    int main() {
    
            p = malloc(sizeof(int));
            if (p!=NULL) {
                    *p = 9;
                    printf("*p = %d\n",(int) (*p));
            }
            return(1);
    }
    

    但是,如果我通过拆分if-then-else稍微更改代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int *p;
    
    int main() {
    
            p = malloc(sizeof(int));
            if (p!=NULL) {
                    *p = 9;
            }
            if (p!=NULL) {
                    printf("*p = %d\n",(int) (*p));
            }
            return(1);
    }
    

    我得到消息:

    test6.c:13:[value] warning: accessing uninitialized left-value. assert \initialized(p);
    

    问题是,为什么FRAMA-C认为 p 可能访问未初始化的左值?我错过了什么?

    我使用以下命令调用frama-c:

     frama-c-gui -val test.c
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   byako    6 年前

    摘要解释器通过在两个控制流路径相遇时执行抽象(“连接”)来限制其分析的复杂性。这就是你的第二个例子:在第一个例子结束后 if ,这两个分支的抽象连接在一起。在产生的抽象中, p 以及初始化 *p 是迷路了。

    在FRAMA-C/EVA中,这是可能的 在多个控制流路径相交时执行联接,而不是并行传播状态集。这些集合的最大基数由参数控制 -slevel .在这里 -slevel 2 足以证明你的第二个例子。