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
#include "common.h"
int main() {
int result = false;
Activity activity1;
Activity activity2;
klee_make_symbolic(&activity1, sizeof(activity1), "activity1");
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));
result = api_save_row_activity(&activity1);
assert(result == OK);
result = api_save_row_activity(&activity2);
assert(result == OK);
return 0;
}
#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;
Activity* pActivityUser1First=NULL;
Activity* pActivityUser1Second=NULL;
Activity activity1;
Activity activity2;
User user1;
klee_make_symbolic(&activity1, sizeof(activity1), "activity1");
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_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));
saveActivity1Result = api_save_row_activity(&activity1);
assert(saveActivity1Result == OK);
saveActivity2Result = api_save_row_activity(&activity2);
assert(saveActivity2Result == OK);
user1HasActivityFirst = api_hasActivity(&user1,&pActivityUser1First);
printf("user1HasActivityFirst:%d\n", user1HasActivityFirst);
if(pActivityUser1First!=NULL){
printRow_activity(pActivityUser1First,"pActivityUser1First");
}
if(user1HasActivityFirst==true){
user1ScoreFirst=api_joinActivity(&user1);
sql_selectTable_user_print();
}
user1HasActivitySecond = api_hasActivity(&user1,&pActivityUser1Second);
printf("user1HasActivitySecond:%d\n", user1HasActivitySecond);
if(pActivityUser1Second!=NULL){
printRow_activity(pActivityUser1Second,"pActivityUser1Second");
}
if(user1HasActivitySecond==true){
user1ScoreSecond=api_joinActivity(&user1);
}
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;
}
#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
#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;
int newUserScore;
int oldUserScore;
int shopId;
};
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);
assert (strcmp(activityTab[i]->name, activityTab[k]->name) != 0) ;
}
}
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");
}
#define UserTableMaxRow 10
struct _User {
int id;
char phone[STR_MAX_LEN];
int shopId;
};
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++) {
for (int k = i + 1; k <= userTabCurIndex; k++) {
assert (userTab[i]->id != userTab[k]->id);
assert (strcmp(userTab[i]->phone, userTab[k]->phone) != 0) ;
}
}
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");
}
bool assume_fieldInList_shopId(int shopId){
if(shopId==FirstId){
return true;
}else
if(shopId==FirstId+1){
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;
}
}
bool assume_fieldInList_activity_name(Activity *pa){
char* name=pa->name;
if(strcmp(name,"Actv.1")==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;
}
}
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;
}
}
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);
pUserFromTab = sql_selectOneRowFromTableWhere_user_phone(pUser->phone);
if(pUserFromTab==NULL){
return pActivity->newUserScore;
}else{
return pActivity->oldUserScore;
}
}
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);
}
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 --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