符号化执行 symbolic execute , klee 测试用例生成 增删改(自动化白盒测试范畴)

gitee仓库 分支cgl-dev


# 运行

sh -x  ./runme.sh busz_save_activity  2>&1 | tee  busz_save_activity.log
sh -x  ./runme.sh busz_user_activity  2>&1 | tee  busz_user_activity.log

// busz_save_activity.c

#include "common.h"
int main() {
	int result = false;

	Activity activity1;
	// strcpy(activity1.name, "zs");
	// activity1.shopId = 1;
	// activity1.on = 1;


	Activity activity2;
	// strcpy(activity2.name, "LS");
	// activity2.shopId = 1;
	// activity2.on = 1;

	// printRow_activity(&activity1,"init_1");
	klee_make_symbolic(&activity1, sizeof(activity1), "activity1");
	// printRow_activity(&activity1,"init_2");
	klee_assume(assume_fieldInList_activity_name(&activity1));
	klee_assume(assume_fieldInList_activity_shopId(&activity1));
	klee_assume(assume_fieldInList_activity_on(&activity1));
    
	klee_make_symbolic(&activity2, sizeof(activity2), "activity2");
	klee_assume(assume_fieldInList_activity_name(&activity2));
	klee_assume(assume_fieldInList_activity_shopId(&activity2));
	klee_assume(assume_fieldInList_activity_on(&activity2));
    
	// klee_make_symbolic(&activityTabCurId, sizeof(activityTabCurId), "activityTabCurId");
	// klee_make_symbolic(&activityTabCurIndex, sizeof(activityTabCurIndex), "activityTabCurIndex");
	// klee_make_symbolic(&activityTab, sizeof(activityTab), "activityTab");
	// klee_assume(isValidActivity(&activity));
	// klee_assume(internalCheckTableValidated_activity());
	// printRow_activity(&activity1,"before_api_save_row_activity");
	result = api_save_row_activity(&activity1);
	// printRow_activity(&activity1,"after_api_save_row_activity");
	assert(result == OK);
	
	// printRow_activity(&activity2,"before_api_save_row_activity");
	result = api_save_row_activity(&activity2);
	// printRow_activity(&activity2,"after_api_save_row_activity");
	assert(result == OK);

	// for(int i = 1; i < TableMaxRow-1; i++){

	// result = api_save_row_activity(&activity);
	// printf("result = %d\n", result);
	// assert(result == OK);
	// }
	return 0;
}





//examples/crud/busz_user_activity.c

#include "common.h"
bool bothTrue(bool user1HasActivityFirst,bool user1HasActivitySecond){
    if(user1HasActivityFirst==true){
        if(user1HasActivitySecond==true){
            return true;
        } 
    }else {
        return false;
    }        
}
bool oneTrue(bool user1HasActivityFirst,bool user1HasActivitySecond){
    if(user1HasActivityFirst==true){
        return true;
    }else
    if(user1HasActivitySecond==true){
        return true;
    }
    else {
        return false;
    }        
}
int main() {
	bool saveActivity1Result = false;
	bool saveActivity2Result = false;
	bool user1HasActivityFirst = false;
	bool user1HasActivitySecond = false;
	int user1ScoreFirst = ScoreNotValidated1;
	int user1ScoreSecond = ScoreNotValidated2;//make sure user1ScoreFirst!=user1ScoreSecond
	Activity* pActivityUser1First=NULL;
	Activity* pActivityUser1Second=NULL;

	Activity activity1;

	Activity activity2;

	User user1;


	// printRow_activity(&activity1,"init_1");
	klee_make_symbolic(&activity1, sizeof(activity1), "activity1");
	// printRow_activity(&activity1,"init_2");
	klee_assume(assume_fieldInList_activity_name(&activity1));
	klee_assume(assume_fieldInList_activity_shopId(&activity1));
	klee_assume(assume_fieldInList_activity_on(&activity1));
	klee_assume(assume_fieldInList_activity_newUserScore(&activity1));
	klee_assume(assume_fieldInList_activity_oldUserScore(&activity1));
	klee_assume(assume_betweenFields_activity_newOldUserScoreNotEqual(&activity1));
	// klee_assume(assume_fieldsConstraint_activity_beginDt_endDt( &activity1 ));
    
	klee_make_symbolic(&activity2, sizeof(activity2), "activity2");
	klee_assume(assume_fieldInList_activity_name(&activity2));
	klee_assume(assume_fieldInList_activity_shopId(&activity2));
	klee_assume(assume_fieldInList_activity_on(&activity2));
	klee_assume(assume_fieldInList_activity_newUserScore(&activity2));
	klee_assume(assume_fieldInList_activity_oldUserScore(&activity2));
	klee_assume(assume_betweenFields_activity_newOldUserScoreNotEqual(&activity2));
    
	klee_make_symbolic(&user1, sizeof(user1), "user1");
	klee_assume(assume_fieldInList_user_phone(&user1));
	klee_assume(assume_fieldInList_user_shopId(&user1));
    
	// printRow_activity(&activity1,"before_api_save_row_activity");
	saveActivity1Result = api_save_row_activity(&activity1);
	// printRow_activity(&activity1,"after_api_save_row_activity");
	assert(saveActivity1Result == OK);
	
	// printRow_activity(&activity2,"before_api_save_row_activity");
	saveActivity2Result = api_save_row_activity(&activity2);
	// printRow_activity(&activity2,"after_api_save_row_activity");
	assert(saveActivity2Result == OK);


    
    // printRow_user(&user1,"before_api_hasActivity_1");
	user1HasActivityFirst = api_hasActivity(&user1,&pActivityUser1First);
    printf("user1HasActivityFirst:%d\n", user1HasActivityFirst);
    if(pActivityUser1First!=NULL){
        printRow_activity(pActivityUser1First,"pActivityUser1First");
    }
    // printRow_user(&user1,"after_api_hasActivity_1");
	if(user1HasActivityFirst==true){
		user1ScoreFirst=api_joinActivity(&user1);
        sql_selectTable_user_print();
        // printRow_user(&user1,"after_api_joinActivity_1");
	}

    // printRow_user(&user1,"before_api_hasActivity_2");
	user1HasActivitySecond = api_hasActivity(&user1,&pActivityUser1Second);
    printf("user1HasActivitySecond:%d\n", user1HasActivitySecond);
    if(pActivityUser1Second!=NULL){
        printRow_activity(pActivityUser1Second,"pActivityUser1Second");
    }
    // printRow_user(&user1,"after_api_hasActivity_2");
	if(user1HasActivitySecond==true){
		user1ScoreSecond=api_joinActivity(&user1);
        // printRow_user(&user1,"after_api_joinActivity_2");
	}
    
	klee_assume(oneTrue(user1HasActivityFirst,user1HasActivitySecond));
    
    sql_selectTable_activity_print();
    sql_selectTable_user_print();
    
    printf("user1ScoreFirst:%d,user1ScoreSecond:%d\n", user1ScoreFirst, user1ScoreSecond);
    
    if(user1HasActivityFirst==true){
	if(user1HasActivitySecond==true){
        assert(user1ScoreFirst != user1ScoreSecond);
    }
    }
	
	return 0;
}

//common.h


#include <klee/klee.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <time.h>

#define bool int
#define true 1
#define false 0


#define IdNotValidated -2
#define TableMaxRow 10

#define OK 0

#define ErrOutOfTableMaxRow 1
#define ErrBreakTableConstraint 2




#define STR_MAX_LEN 12

//{table Activity :  java or mysql.table or sql
#define Score1 3 
#define Score2 29
#define Score3 7 
#define Score4 31 
#define ScoreNotValidated1 -101
#define ScoreNotValidated2 -103

#define ActivityTypeNull 0
#define FirstId 1

struct _Activity {
	int id;
	char name[STR_MAX_LEN];
	bool on;//0,1
	int newUserScore;//3
	int oldUserScore;//11
	int shopId;//0:NULL,1,2,3
};

typedef struct _Activity Activity;

Activity* activityTab[TableMaxRow];
int activityTabCurIndex = -1;
int activityTabCurId = FirstId;

void printRow_activity(Activity * pa,char* msg) {
	printf(" %s :: activity: {id:%d, name:%s, shopId:%d, on:%d, newUserScore:%d, oldUserScore:%d} ; \n", msg,pa->id, pa->name, pa->shopId, pa->on, pa->newUserScore, pa->oldUserScore   );
}

int internalCheckTableValidated_activity() {
	for (int i = 0; i <= activityTabCurIndex - 1; i++) {
		for (int k = i + 1; k <= activityTabCurIndex; k++) {
			assert (activityTab[i]->id != activityTab[k]->id);// non repeated id
			assert (strcmp(activityTab[i]->name, activityTab[k]->name) != 0) ; // non repeated name
		}
	}
	return true;
}

Activity* sql_selectOneRowFromTableWhere_activity_shopId(int shopId){
	for (int i = 0; i <= activityTabCurIndex - 1; i++) {
			if (activityTab[i]->shopId == shopId){
                return activityTab[i];
            }
	}
	return NULL;
}

void sql_selectTable_activity_print(){
    printf("sql_selectTable_activity_print__[\n");
	for (int i = 0; i <= activityTabCurIndex ; i++) {
        printRow_activity(activityTab[i],"sql_selectTable_activity_print");
	}
    printf("]\n");
}
//}

//{table User : may generate from java or mysql.table 
#define UserTableMaxRow 10

struct _User {
	int id;
	char phone[STR_MAX_LEN];
	int shopId;//0:NULL,1,2,3
};

typedef struct _User User;

User* userTab[TableMaxRow];
int userTabCurIndex = -1;
int userTabCurId = FirstId;

void printRow_user(User * p,char* msg) {
    if(p==NULL){
        printf("%s:null\n",msg);
    }else{
        
	printf(" %s :: user: {id:%d, phone:%s, shopId:%d } ; \n", msg,p->id, p->phone , p->shopId);
    }
}

int internalCheckTableValidated_user() {
	for (int i = 0; i <= userTabCurIndex - 1; i++) {
        // printRow_user(userTab[i],"internalCheckTableValidated_user_loop");
		for (int k = i + 1; k <= userTabCurIndex; k++) {
            // printRow_user(userTab[i],"internalCheckTableValidated_user_i");
            // printRow_user(userTab[k],"internalCheckTableValidated_user_k");
			assert (userTab[i]->id != userTab[k]->id);// non repeated id
			assert (strcmp(userTab[i]->phone, userTab[k]->phone) != 0) ; // non repeated phone
		}
	}
	return true;
}

User* sql_selectOneRowFromTableWhere_user_phone(char* phone){
	for (int i = 0; i <= userTabCurIndex ; i++) {
			if (strcmp(userTab[i]->phone,phone)==0){
                return userTab[i];
            }
	}
	return NULL;
}

void sql_selectTable_user_print(){
    printf("sql_selectTable_user_print__[\n");
	for (int i = 0; i <= userTabCurIndex ; i++) {
        printRow_user(userTab[i],"sql_selectTable_user_print");
	}
    printf("]\n");
}
//}

//{ common assume : input field assume , included in java or : assuming in list not influence java execute result
bool assume_fieldInList_shopId(int shopId){
    if(shopId==FirstId){
        return true;
    }else
    if(shopId==FirstId+1){
        return true;
    }else
    // if(shopId==2){
        // return true;
    // }else
    if(shopId==FirstId+1+1){
        return true;
    }else
    {
        return false;
    }
}
//}

bool assume_fieldInList_activity_score(int score){
    if(score==Score1){
        return true;
    }else
    if(score==Score2){
        return true;
    }else
    if(score==ScoreNotValidated1){
        return false;
    }else
    if(score==ScoreNotValidated2){
        return false;
    }else
    {
        return false;
    }
}

//{ Activity assume : input field assume , included in java



bool assume_fieldInList_activity_name(Activity *pa){
    char* name=pa->name;
    if(strcmp(name,"Actv.1")==0){
        return true;
    }else
//    if(strcmp(name,"LiSi")==0){
//        return true;
//    }else
    if(strcmp(name,"Actv.2")==0){
        return true;
    }else{
        return false;
    }
}

bool assume_fieldInList_activity_shopId(Activity *p){
    return assume_fieldInList_shopId(p->shopId);
}


bool assume_fieldInList_activity_on(Activity *pa){
    bool on=pa->on;
    if(on==true){
        return true;
    }else
    if(on==false){
        return true;
    }else
    {
        return false;
    }
}

bool assume_fieldInList_activity_newUserScore(Activity *pa){
   return assume_fieldInList_activity_score(pa->newUserScore);
}

bool assume_fieldInList_activity_oldUserScore(Activity *pa){
   return assume_fieldInList_activity_score(pa->oldUserScore);
}



bool assume_betweenFields_activity_newOldUserScoreNotEqual(Activity *pActivity1){
    if(pActivity1->newUserScore != pActivity1->oldUserScore){
        return true;
    }else{
        return false;
    }
}

//}

//{ other 

//}


//{User service : simulate mysql.table and java insert sql
int service_save_row_user(User *pa) {
	if (userTabCurIndex >= TableMaxRow) {
		return ErrOutOfTableMaxRow;
	}
	userTabCurIndex++;
	userTabCurId++;
	pa->id = userTabCurId;
	userTab[userTabCurIndex] = pa;
	if (internalCheckTableValidated_user()==false) {
        printf("revert_service_save_row_user\n");
		userTabCurIndex--;
		userTabCurId--;
		return ErrBreakTableConstraint;
	}
	else {
		return OK;
	}
}



//}

//{Activity api : simulate mysql.table and java insert sql
bool api_save_row_activity(Activity *pa) {
	if (activityTabCurIndex >= TableMaxRow) {
		return ErrOutOfTableMaxRow;
	}
	activityTabCurIndex++;
	activityTabCurId++;
	pa->id = activityTabCurId;
	activityTab[activityTabCurIndex] = pa;
	if (internalCheckTableValidated_activity()==false) {
		activityTabCurIndex--;
		activityTabCurId--;
		return ErrBreakTableConstraint;
	}
	else {
		return OK;
	}
}

bool api_hasActivity(User* p,Activity** ppaReturn){
    Activity* pa = sql_selectOneRowFromTableWhere_activity_shopId(p->shopId);
    if(pa==NULL){
        return false;
    }
    if(pa->on==false){
        return false;
    }
    if(ppaReturn!=NULL){
        (*ppaReturn) = pa;
    }
    return true;    
}

int api_joinActivity(User* pUser){
    Activity* pActivity=NULL;
    User* pUserFromTab =NULL;
    
    bool hasActivity = api_hasActivity(pUser,&pActivity);
    if(hasActivity==false){
        return false;
    }
    assert(pActivity!=NULL);//internal error in api_hasActivity
    
    pUserFromTab = sql_selectOneRowFromTableWhere_user_phone(pUser->phone);
    // printRow_user(pUserFromTab,"pUserFromTab");
    // printRow_activity(pActivity,"pActivity_api_joinActivity");
    
    if(pUserFromTab==NULL){
        //service_save_row_user(pUser);
        return pActivity->newUserScore;
    }else{
    return pActivity->oldUserScore;    
    }
    
}


//}




//{ User assume : input field assume , included in java or : assuming in list not influence java execute result
bool assume_fieldInList_user_phone(User *p){
    char* phone=p->phone;
    if(strcmp(phone,"13000000000")==0){
        return true;
    }else
    if(strcmp(phone,"18688888888")==0){
        return true;
    }else{
        return false;
    }
}


bool assume_fieldInList_user_shopId(User *p){
    return assume_fieldInList_shopId(p->shopId);
}


//}





#runme.sh

#run me: 
#sh -x  ./runme.sh insert  2>&1 | tee  run.log

rm -fr *.out *.bc klee* *elf*

target=$1

echo "$target.c-->$target.bc"
clang -I /root/klee/include -emit-llvm -c -g -O0 -Xclang -disable-O0-optnone $target.c

echo "$target.bc-->klee-last(test case)"
# klee --external-calls=all   --libc=uclibc --posix-runtime --smtlib-human-readable   $target.bc
klee --external-calls=all   --libc=uclibc --posix-runtime --solver-backend=z3  $target.bc

echo "$target.c-->$target.elf_eat_test_case"
gcc -I /root/klee/include   $target.c -lkleeRuntest -o $target.elf_eat_test_case
ls -1 klee-last/*.ktest | awk '{printf("  KTEST_FILE=%s ./$target.elf_eat_test_case\n",  $0)}' | sh -x


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ziix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值