template<typename T, typename KEY> void RBTree<T, KEY>::setnull(RBTNode<T, KEY> *h) { if (h == NULL) { return; } setnull(h->pLeft); setnull(h->pRight); { //std::cout << "delete " << h->key << std::endl; delete h; h = NULL; } }
void main(){ stack* s = setnull(); testpush(s); print(s); testpop(s); print(s); }
/** parse tokens */ const Token *parse(const Token &tok, std::list<ExecutionPath *> &checks) const { if (Token::Match(tok.previous(), "[;{}] const| struct| %type% * %var% ;")) { const Token * vartok = tok.tokAt(2); if (tok.str() == "const") vartok = vartok->next(); if (tok.str() == "struct") vartok = vartok->next(); if (vartok->varId() != 0) checks.push_back(new Nullpointer(owner, vartok->varId(), vartok->str())); return vartok->next(); } // Template pointer variable.. if (Token::Match(tok.previous(), "[;{}] %type% ::|<")) { const Token * vartok = &tok; while (Token::Match(vartok, "%type% ::")) vartok = vartok->tokAt(2); if (Token::Match(vartok, "%type% < %type%")) { vartok = vartok->tokAt(3); while (vartok && (vartok->str() == "*" || vartok->isName())) vartok = vartok->next(); } if (vartok && (vartok->str() == ">" || vartok->isName()) && Token::Match(vartok->next(), "* %var% ;|=")) { vartok = vartok->tokAt(2); checks.push_back(new Nullpointer(owner, vartok->varId(), vartok->str())); if (Token::simpleMatch(vartok->next(), "= 0 ;")) setnull(checks, vartok->varId()); return vartok->next(); } } if (Token::simpleMatch(&tok, "try {")) { // Bail out all used variables unsigned int indentlevel = 0; for (const Token *tok2 = &tok; tok2; tok2 = tok2->next()) { if (tok2->str() == "{") ++indentlevel; else if (tok2->str() == "}") { if (indentlevel == 0) break; if (indentlevel == 1 && !Token::simpleMatch(tok2,"} catch (")) return tok2; --indentlevel; } else if (tok2->varId()) bailOutVar(checks,tok2->varId()); } } if (Token::Match(&tok, "%var% (")) { if (tok.str() == "sizeof") return tok.next()->link(); // parse usage.. std::list<const Token *> var; CheckNullPointer::parseFunctionCall(tok, var, 0); for (std::list<const Token *>::const_iterator it = var.begin(); it != var.end(); ++it) dereference(checks, *it); } else if (Token::simpleMatch(&tok, "( 0 &&")) return tok.link(); if (tok.varId() != 0) { // unknown : not really used. it is passed to isPointerDeRef. // if isPointerDeRef fails to determine if there // is a dereference the this will be set to true. bool unknown = false; if (Token::Match(tok.previous(), "[;{}=] %var% = 0 ;")) setnull(checks, tok.varId()); else if (CheckNullPointer::isPointerDeRef(&tok, unknown)) dereference(checks, &tok); else // TODO: Report debug warning that it's unknown if a // pointer is dereferenced bailOutVar(checks, tok.varId()); } else if (tok.str() == "delete") { const Token *ret = tok.next(); if (Token::simpleMatch(ret, "[ ]")) ret = ret->tokAt(2); if (Token::Match(ret, "%var% ;")) return ret->next(); } return &tok; }
template<typename T, typename KEY> RBTree<T, KEY>::~RBTree() { setnull(pRoot); }
int txn60008Process() { int iRet,nRet; char sCount [32 + 1]; char sSqlCmd [1024 ]; setnull(sCount); setnull(sSqlCmd); nRet = dbsExecuteV("select count(1) from TG_PLATFORMINFO where platformid = :sPid", f_sPlatformId,sCount); if(nRet < 0) { logMsg(LOG_ERR,"查询数据库失败[%d][%s]",dbsSqlCode(),dbsErrStr()); return -1; } if(atoi(sCount) == 0 && (memcmp(f_sChgType,"01",2) == 0 || memcmp(f_sChgType,"02",2) == 0)) { logMsg(LOG_ERR,"平台不存在"); strcat(f_sError,"E0000006"); return -1; } if(atoi(sCount) == 1 && memcmp(f_sChgType,"00",2) == 0) { logMsg(LOG_ERR,"平台已存在,不可新建"); strcat(f_sError,"E0000015"); return -1; } setnull(sSqlCmd); switch(atoi(f_sChgType)) { case 0: sprintf(sSqlCmd,"insert into TG_PLATFORMINFO (platformid,PLATFORMTYPE,PLATFORMNAME,remark,status,createdate)" "VALUES('%s','00','%s','%s','00',to_char(sysdate,'YYYYMMDD'))", f_sPlatformId,f_sPlatformName,f_sRemarks); break; case 1: sprintf(sSqlCmd,"update TG_PLATFORMINFO set PLATFORMNAME = '%s',remark = '%s' where " "platformid = '%s'", f_sPlatformName,f_sRemarks,f_sPlatformId); break; case 2: sprintf(sSqlCmd,"update TG_PLATFORMINFO set status = '02' where " "platformid = '%s'", f_sPlatformId); default: logMsg(LOG_ERR,"错误的修改类型[%s]",f_sChgType); return -1; } nRet = dbsExecuteV(sSqlCmd); if(nRet < 0) { logMsg(LOG_ERR,"数据库操作失败[%s][%s][%d]",sSqlCmd,dbsErrStr(),dbsSqlCode()); return -1; } if(atoi(f_sChgType) == 0) { setnull(sSqlCmd); sprintf(sSqlCmd,"insert into TG_PLATACCINFO " "VALUES ('%s',0,0,0,0,0,0,0,0,0,rtrim(fn_getmd5(0)),0,rtrim(fn_getmd5(0)))", f_sPlatformId); nRet = dbsExecuteV(sSqlCmd); if(nRet < 0) { logMsg(LOG_ERR,"插入数据库失败[%s][%s][%d]",sSqlCmd,dbsErrStr(),dbsSqlCode()); return -1; } } return 0; }
int txn60008Initial(char *pData,T_HEAD t_Head) { T_TXN60008 *t_txn = (T_TXN60008 *) pData; setnull(f_sPlatformId ); setnull(f_sChgType ); setnull(f_sPlatformName); setnull(f_sRemarks ); setnull(f_sTxnDate ); setnull(f_sTxnTime ); setnull(f_sTxnId ); setnull(f_sRtCode ); setnull(f_sChannelCode ); setnull(f_sTermCode ); setnull(f_sDrct ); setnull(f_sError ); memcpy(f_sPlatformId ,t_txn->sPlatformId ,sizeof(f_sPlatformId )); memcpy(f_sChgType ,t_txn->sChgType ,sizeof(f_sChgType )); memcpy(f_sPlatformName,t_txn->sPlatformName,sizeof(f_sPlatformName)); memcpy(f_sRemarks ,t_txn->sRemarks ,sizeof(f_sRemarks )); memcpy(f_sTxnDate ,t_Head.sTxnDate ,sizeof(f_sTxnDate )); memcpy(f_sTxnTime ,t_Head.sTxnTime ,sizeof(f_sTxnTime )); memcpy(f_sTxnId ,t_Head.sTxnId ,sizeof(f_sTxnId )); memcpy(f_sRtCode ,t_Head.sRtCode ,sizeof(f_sRtCode )); memcpy(f_sChannelCode ,t_Head.sChannelCode ,sizeof(f_sChannelCode )); memcpy(f_sTermCode ,t_Head.sTermCode ,sizeof(f_sTermCode )); memcpy(f_sDrct ,t_Head.sDrct ,sizeof(f_sDrct )); logMsg(LOG_BUG,"PLATNAME[%s]",f_sPlatformName); logMsg(LOG_BUG,"CHANNELCODE[%s]",f_sChannelCode); return 0; }
int main() { char expression[30],*p; sqstack *operator, *operand; int sum, flag = 0; int op1, op2; operator = (sqstack *)malloc(sizeof(sqstack)); setnull(operator); operand = (sqstack *)malloc(sizeof(sqstack)); setnull(operand); gets(expression); p = expression; while ( *p ) { if ( (*p >= '0') && (*p <= '9') ) { p++; continue; } switch ( *p ) { case '+' : case '-' : case '*' : case '/' : case ' ' : case '(' : case ')' : break; default : printf("Wrong Character %c in expression!\n", *p); return -1; } p++; } p = expression; while ( *p ) { if ( (*p >= '0') && (*p <= '9') ) { if ( flag ) { sum = 10*sum + (*p - '0'); } else { sum = *p - '0'; flag = 1; } p++; continue; } if ( flag ) { printf("push data %d\n", sum); push_stack(operand, sum); flag = 0; } if ( *p == ' ' ) { p++; continue; } if ( empty_stack( operator ) ) { printf("push %c\n", *p); push_stack(operator, (int)*p); p++; continue; } if ( *p == ')' ) { printf("*** Wow, we meet ) ***\n"); deal_bracket(operator, operand); p++; continue; } if ( (convert_operator(*p) > convert_operator((char)top_stack(operator))) || ((char)top_stack(operator) == '(') ) { printf("push %c\n", *p); push_stack(operator, (int)*p); } else { deal_tmp(operator, operand, *p); } p++; } if ( flag ) push_stack(operand, sum); while ( !empty_stack(operator) ) { op2 = pop_stack(operand); op1 = pop_stack(operand); switch ( (char)pop_stack(operator) ) { case '+' : printf("push data: %d + %d\n", op1, op2); push_stack(operand, op1 + op2); break; case '-' : printf("push data: %d - %d\n", op1, op2); push_stack(operand, op1 - op2); case '*' : printf("push data: %d * %d\n", op1, op2); push_stack(operand, op1 * op2); break; case '/' : printf("push data: %d / %d\n", op1, op2); push_stack(operand, op1 / op2); break; } } printf("%d\n", pop_stack(operand)); return 0; }
/** parse tokens */ const Token *parse(const Token &tok, std::list<ExecutionPath *> &checks) const { if (tok.varId() != 0) { // Pointer declaration declaration? if(symbolDatabase) { const Variable* var = symbolDatabase->getVariableFromVarId(tok.varId()); if (var && var->isPointer() && var->nameToken() == &tok) checks.push_back(new Nullpointer(owner, var->varId(), var->name(), symbolDatabase)); } } if (Token::simpleMatch(&tok, "try {")) { // Bail out all used variables const Token* tok2 = &tok; const Token* endtok = tok.linkAt(1); for (; tok2 && tok2 != endtok; tok2 = tok2->next()) { if (tok2->varId()) bailOutVar(checks,tok2->varId()); } return tok2; } if (Token::Match(&tok, "%var% (")) { if (tok.str() == "sizeof" || tok.str() == "typeid") return tok.next()->link(); // parse usage.. std::list<const Token *> var; CheckNullPointer::parseFunctionCall(tok, var, 0); for (std::list<const Token *>::const_iterator it = var.begin(); it != var.end(); ++it) dereference(checks, *it); } else if (Token::simpleMatch(&tok, "( 0 &&")) return tok.link(); if (tok.varId() != 0) { // unknown: if isPointerDeRef fails to determine if there // is a dereference this will be set to true. bool unknown = owner->inconclusiveFlag(); bool deref = CheckNullPointer::isPointerDeRef(&tok, unknown, symbolDatabase); if (deref) dereference(checks, &tok); else if (unknown && owner->inconclusiveFlag()) dereference(checks, &tok); if (Token::Match(tok.previous(), "[;{}=] %var% = 0 ;")) setnull(checks, tok.varId()); else if (!deref && (!tok.previous()->isOp() || tok.previous()->str() == "&") && !tok.previous()->isAssignmentOp() && (!tok.next()->isOp() || tok.next()->str() == ">>")) bailOutVar(checks, tok.varId()); // If its possible that the pointers value changes, bail out. } else if (tok.str() == "delete") { const Token *ret = tok.next(); if (Token::simpleMatch(ret, "[ ]")) ret = ret->tokAt(2); if (Token::Match(ret, "%var% ;")) return ret->next(); } else if (tok.str() == "return") { bool unknown = owner->inconclusiveFlag(); const Token* tok2 = &tok; for (; tok2 && tok2->str() != ";"; tok2 = tok2->next()) { if (tok2->varId()) { if (CheckNullPointer::isPointerDeRef(tok2, unknown, symbolDatabase) || unknown) dereference(checks, tok2); } // If return statement contains "?" then assume there // is no dangours dereferencing later if (tok2->str() == "?") { while (tok2 && tok2->str() != ";") tok2 = tok2->next(); return tok2; } } } return &tok; }