changeset 37:e27f4961281e

WIP: insert verification using cbmc (syntax valid)
author atton
date Mon, 13 Jun 2016 01:35:37 +0000
parents 9619480d0dc0
children 593ab851ad76
files cbmc/insert_verification/cbmcCS.c cbmc/insert_verification/cbmcLLRBContext.c cbmc/insert_verification/include/cbmcCS.h cbmc/insert_verification/include/cbmcLLRBContext.h cbmc/insert_verification/include/llrbContext.h cbmc/insert_verification/include/origin_cs.h cbmc/insert_verification/insert_verification.sh cbmc/insert_verification/main.c
diffstat 8 files changed, 272 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbmc/insert_verification/cbmcCS.c	Mon Jun 13 01:35:37 2016 +0000
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include "cbmcLLRBContext.h"
+
+extern void initLLRBContext(struct Context* context, enum Code next);
+
+void meta(struct Context* context, enum Code next) {
+    context->prev = next;
+    return (context->code[next])(context);
+}
+
+void startCode(enum Code next) {
+    struct Context* context = (struct Context*)malloc(sizeof(struct Context));
+
+    return initLLRBContext(context, next);
+}
+
+void exitCode(struct Context* context) {
+    free(context->code);
+    free(context->data);
+    free(context->heapStart);
+    exit(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbmc/insert_verification/cbmcLLRBContext.c	Mon Jun 13 01:35:37 2016 +0000
@@ -0,0 +1,101 @@
+#include <stdlib.h>
+#include <string.h>
+
+#include "cbmcLLRBContext.h"
+
+/* for CBMC */
+extern void verifySpecification_stub(struct Context*);
+
+/* definitions from llrb */
+extern void meta(struct Context*, enum Code next);
+extern void put_stub(struct Context*);
+extern void replaceNode_stub(struct Context*);
+extern void insertNode_stub(struct Context*);
+extern void rotateLeft_stub(struct Context*);
+extern void rotateRight_stub(struct Context*);
+extern void colorFlip_stub(struct Context*);
+extern void fixUp_stub(struct Context*);
+extern void changeReference_stub(struct Context*);
+extern void insert1_stub(struct Context*);
+extern void insert2_stub(struct Context*);
+extern void insert3_stub(struct Context*);
+extern void insert4_stub(struct Context*);
+extern void insert4_1_stub(struct Context*);
+extern void insert4_2_stub(struct Context*);
+extern void insert5_stub(struct Context*);
+extern void stackClear_stub(struct Context*);
+extern void get_stub(struct Context*);
+extern void search_stub(struct Context*);
+extern void delete_stub(struct Context*);
+extern void delete1_stub(struct Context*);
+extern void delete2_stub(struct Context*);
+extern void delete3_stub(struct Context*);
+extern void replaceNodeForDelete1_stub(struct Context*);
+extern void replaceNodeForDelete2_stub(struct Context*);
+extern void findMax1_stub(struct Context*);
+extern void findMax2_stub(struct Context*);
+extern void deleteCase1_stub(struct Context*);
+extern void deleteCase2_stub(struct Context*);
+extern void deleteCase3_stub(struct Context*);
+extern void deleteCase4_stub(struct Context*);
+extern void deleteCase5_stub(struct Context*);
+extern void deleteCase6_stub(struct Context*);
+extern void exitCode(struct Context*);
+
+/* for allocator */
+extern void allocator(struct Context* context);
+
+
+void initLLRBContext(struct Context* context, enum Code next) {
+    context->codeNum   = Exit;
+
+    context->heapLimit = sizeof(union Data)*ALLOCATE_SIZE;
+    context->code      = malloc(sizeof(void*)*(context->codeNum+1));
+    context->data      = malloc(sizeof(union Data*)*ALLOCATE_SIZE);
+    context->heapStart = malloc(context->heapLimit);
+    memset(context->heapStart, 0, context->heapLimit);
+
+    context->code[VerifySpecification] = verifySpecification_stub;
+
+    /* definitions from llrb */
+    context->code[Put]           = put_stub;
+    context->code[Replace]       = replaceNode_stub;
+    context->code[Insert]        = insertNode_stub;
+    context->code[RotateL]       = rotateLeft_stub;
+    context->code[RotateR]       = rotateRight_stub;
+    context->code[InsertCase1]   = insert1_stub;
+    context->code[InsertCase2]   = insert2_stub;
+    context->code[InsertCase3]   = insert3_stub;
+    context->code[InsertCase4]   = insert4_stub;
+    context->code[InsertCase4_1] = insert4_1_stub;
+    context->code[InsertCase4_2] = insert4_2_stub;
+    context->code[InsertCase5]   = insert5_stub;
+    context->code[StackClear]    = stackClear_stub;
+    context->code[Exit]          = exitCode;
+
+    context->heap = context->heapStart;
+
+    context->data[Allocate] = context->heap;
+    context->heap += sizeof(struct Allocate);
+
+    context->data[Tree] = context->heap;
+    context->heap += sizeof(struct Tree);
+
+    context->data[Node] = context->heap;
+    context->heap += sizeof(struct Node);
+
+    context->dataNum = Node;
+
+    struct Tree* tree = &context->data[Tree]->tree;
+    tree->root = 0;
+    tree->current = 0;
+    tree->deleted = 0;
+
+    context->node_stack = stack_init(sizeof(struct Node*), 1000);
+    context->code_stack = stack_init(sizeof(enum Code), 1000);
+
+    context->loopCount = 0;
+
+    return meta(context, next);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbmc/insert_verification/include/cbmcCS.h	Mon Jun 13 01:35:37 2016 +0000
@@ -0,0 +1,3 @@
+extern void startCode(enum Code next);
+extern void exitCode(struct Context* context);
+extern void meta(struct Context* context, enum Code next);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbmc/insert_verification/include/cbmcLLRBContext.h	Mon Jun 13 01:35:37 2016 +0000
@@ -0,0 +1,108 @@
+/* Context definition for llrb example */
+#include "stack.h"
+
+#define ALLOCATE_SIZE 20000000
+#define LIMIT_OF_VERIFICATION_SIZE 5
+
+enum Code {
+    /* for CBMC */
+    VerifySpecification,
+
+    /* definitions from llrb */
+    Allocator,
+    Put,
+    Replace,
+    Insert,
+    Compare,
+    RotateL,
+    RotateR,
+    SetTree,
+    InsertCase1,
+    InsertCase2,
+    InsertCase3,
+    InsertCase4,
+    InsertCase4_1,
+    InsertCase4_2,
+    InsertCase5,
+    StackClear,
+    Get,
+    Search,
+    Delete,
+    Delete1,
+    Delete2,
+    Delete3,
+    Replace_d1,
+    Replace_d2,
+    FindMax1,
+    FindMax2,
+    DeleteCase1,
+    DeleteCase2,
+    DeleteCase3,
+    DeleteCase4,
+    DeleteCase5,
+    DeleteCase6,
+    Exit,
+};
+
+enum Relational {
+    EQ,
+    GT,
+    LT,
+};
+
+enum UniqueData {
+    Allocate,
+    Tree,
+    Node,
+};
+
+struct Context {
+    enum Code next;
+    enum Code prev;
+    unsigned int codeNum;
+    void (**code) (struct Context*);
+    void* heapStart;
+    void* heap;
+    unsigned long heapLimit;
+    unsigned long dataNum;
+    stack_ptr code_stack;
+    stack_ptr node_stack;
+    union Data **data;
+
+    unsigned int loopCount;
+};
+
+union Data {
+    struct Comparable { // inteface
+        enum Code compare;
+        union Data* data;
+    } compare;
+    struct Count {
+        enum Code next;
+        long i;
+    } count;
+    struct Tree {
+        enum Code next;
+        struct Node* root;
+        struct Node* current;
+        struct Node* deleted;
+        int result;
+    } tree;
+    struct Node {
+        // need to tree
+        enum Code next;
+        int key; // comparable data segment
+        int value;
+        struct Node* left;
+        struct Node* right;
+        // need to balancing
+        enum Color {
+            Red,
+            Black,
+        } color;
+    } node;
+    struct Allocate {
+        enum Code next;
+        long size;
+    } allocate;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbmc/insert_verification/include/llrbContext.h	Mon Jun 13 01:35:37 2016 +0000
@@ -0,0 +1,1 @@
+#include "cbmcLLRBContext.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbmc/insert_verification/include/origin_cs.h	Mon Jun 13 01:35:37 2016 +0000
@@ -0,0 +1,1 @@
+#include "cbmcCS.h"
--- a/cbmc/insert_verification/insert_verification.sh	Mon Jun 13 01:34:43 2016 +0000
+++ b/cbmc/insert_verification/insert_verification.sh	Mon Jun 13 01:35:37 2016 +0000
@@ -14,6 +14,7 @@
     sed -i -e 's/__code/void/g' $filename
 }
 
+rm -rf ${CBMC_FILE_DIR}
 
 copy_and_substitute ${LLRB_PATH}/allocate.c ${CBMC_FILE_DIR}
 copy_and_substitute ${LLRB_PATH}/llrb.c     ${CBMC_FILE_DIR}
@@ -22,13 +23,5 @@
 
 copy_and_substitute ${LLRB_PATH}/include/stack.h       ${CBMC_INCLUDE_DIR}
 
-copy_and_substitute ${GEARS_PATH}/src/include/origin_cs.h      ${CBMC_INCLUDE_DIR}
-
-
-#main.c
-#akashaCS.c
-#akashaLLRBContext.c
-#verifySpecification.c
-
-
 cbmc --unwind 50 -I ${CBMC_INCLUDE_DIR} -I include cbmc_files/*.c *.c
+#/bin/clang -Wall -O0 -g -I ${CBMC_INCLUDE_DIR} -I include cbmc_files/*.c *.c
--- a/cbmc/insert_verification/main.c	Mon Jun 13 01:34:43 2016 +0000
+++ b/cbmc/insert_verification/main.c	Mon Jun 13 01:35:37 2016 +0000
@@ -1,25 +1,43 @@
 #include <stdio.h>
+#include <assert.h>
 
 #include "cbmcLLRBContext.h"
 
+void meta(struct Context*, enum Code);
+
 /* cbmc built in functions */
-int nondet_int();
+int nondet_int() { return 9 ;}
 
-void verifySpecification_stub(struct Context* context) {
-    verifySpecification(context);
+// TODO c functions
+void printTree(struct Node* node, int n) {
+    if (node != 0) {
+        printTree(node->left, n+1);
+        for (int i=0;i<n;i++)
+            printf("  ");
+        printf("key=%d value=%d color=%s\t%p\n", node->key, node->value,/* n, */node->color==0? "R":"B", node);
+        printTree(node->right, n+1);
+    }
 }
 
+
 void verifySpecification(struct Context* context, struct Node* node) {
-    for (int i = 0; i < 10; i++) {
-        int hoge      = nodet_int();
-        node->key     = hoge;
-        node->value   = node->key;
-        context->next = VerifySpecification;
+    if (context->loopCount > LIMIT_OF_VERIFICATION_SIZE) {
+        return meta(context, Exit);
+    }
+    printTree(context->data[Tree]->tree.root, 0);
+    //assert(context->data[Tree]->tree.root->key == 0);
 
-        assert(&context->data[Tree]->tree.root->key == hoge);
-        meta(context, Put);
-    }
-    meta(context, Exit);
+    int hoge      = nondet_int();
+    node->key     = hoge;
+    node->value   = node->key;
+    context->next = VerifySpecification;
+    context->loopCount++;
+
+    return meta(context, Put);
+}
+
+void verifySpecification_stub(struct Context* context) {
+    return verifySpecification(context, &context->data[Node]->node);
 }