//===----------------------------------------------------------------------===// // Random notes for the static analysis module. //===----------------------------------------------------------------------===// Currently the analyzer with basic store will report false alarm for such code: p[0] = "/bin/sh"; p[1] = NULL; execv(p[0], argv); This is because BasicStore "collapses" all elements of an array into their base region. BasicStore should return UnknownVal() when getLValueElement. But that way will break current test in null-deref-ps.c. //===----------------------------------------------------------------------===// Investigate what classes of exprs are passed silently in GRExprEngine::Visit(). One is PredefinedExpr. //===----------------------------------------------------------------------===// Remove PersistentSValPairs and PersistentSVals? //===----------------------------------------------------------------------===// If the pointer is symbolic, we should expand it to a full region with symbolic values. This can eliminate the following false warning. struct file { int lineno; }; struct file *fileinfo; void f10() { int i; int *p = 0; if (fileinfo->lineno) p = &i; if (fileinfo->lineno) *p = 3; // false warning } Now we return a symbolic region for fileinfo->lineno in RegionStore. Loading from it returns an UnknownVal. Therefore the path condition is not recorded. Where should we call this ExpandSymbolicPointer method? Perhaps in GRExprEngine::VisitMemberExpr(). Problem: The base expr of MemberExpr can be in various form. How do we get the pointer varregion(or other kind of region) to be changed?