void Context::buildAuto() { SymTabEntry::buildAuto(); if (outSt_) { for (SymTab::iterator it = outSt_->begin(); (it != outSt_->end()); ++it) { OutParam* op = (OutParam*)*it; const char* nm = op->name(); if ((strcmp(nm, "popen") == 0) || (strstr(nm, "sql") != NULL)) { int i = op->index(); PatSet* positiveEx = new PatSet(); PatSet* negativeEx = new PatSet(); for (int j=0; j < ses_.size(); j++) { Session *s = ses_[j]; vector<SyntaxTree*>* out = s->outputval(i); if (out != NULL) { SyntaxTree *st = new SyntaxTree(GRP); for (int k=0 ; k < s->ninputs(); k++) { char *ss = s->inputval(k); if (ss == NULL) ss = "_NP_"; // Not present unsigned sslen = strlen(ss); if (sslen < 200) { // @@@@ hack SyntaxTree* st1 = new SyntaxTree(INPUT_NODE, ss, sslen); st->addChild(st1); } } SyntaxTree* st2 = new SyntaxTree(OUTPUT_NODE); for (vector<SyntaxTree*>::iterator it = out->begin(); it != out->end(); ++it) { SyntaxTree* stt = *it; assert(stt->nodeType()==ROOT_NODE); stt = stt->shallowCopy(); stt->nodeType(GRP); st2->addChild(stt); } SyntaxTree *st3 = new SyntaxTree(ROOT_NODE, st, st2); SyntaxTree *st4 = st3->abstract(); //cout << "XXXXX"; //st4->print(cout); if (s->attacksFound()) negativeEx->push_back(st4); else positiveEx->push_back(st4); } } op->inOuts(positiveEx); op->inOutAtks(negativeEx); } op->buildAuto(); } } }