]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / lib / StaticAnalyzer / Checkers / CStringChecker.cpp
1 //= CStringChecker.h - Checks calls to C string functions ----------*- C++ -*-//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This defines CStringChecker, which is an assortment of checks on calls
11 // to functions in <string.h>.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "ClangSACheckers.h"
16 #include "clang/StaticAnalyzer/Core/Checker.h"
17 #include "clang/StaticAnalyzer/Core/CheckerManager.h"
18 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
19 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
20 #include "clang/StaticAnalyzer/Core/PathSensitive/GRStateTrait.h"
21 #include "llvm/ADT/StringSwitch.h"
22
23 using namespace clang;
24 using namespace ento;
25
26 namespace {
27 class CStringChecker : public Checker< eval::Call,
28                                          check::PreStmt<DeclStmt>,
29                                          check::LiveSymbols,
30                                          check::DeadSymbols,
31                                          check::RegionChanges
32                                          > {
33   mutable llvm::OwningPtr<BugType> BT_Null, BT_Bounds,
34                                    BT_Overlap, BT_NotCString,
35                                    BT_AdditionOverflow;
36   mutable const char *CurrentFunctionDescription;
37
38 public:
39   static void *getTag() { static int tag; return &tag; }
40
41   bool evalCall(const CallExpr *CE, CheckerContext &C) const;
42   void checkPreStmt(const DeclStmt *DS, CheckerContext &C) const;
43   void checkLiveSymbols(const GRState *state, SymbolReaper &SR) const;
44   void checkDeadSymbols(SymbolReaper &SR, CheckerContext &C) const;
45   bool wantsRegionChangeUpdate(const GRState *state) const;
46
47   const GRState *checkRegionChanges(const GRState *state,
48                                     const StoreManager::InvalidatedSymbols *,
49                                     const MemRegion * const *Begin,
50                                     const MemRegion * const *End) const;
51
52   typedef void (CStringChecker::*FnCheck)(CheckerContext &,
53                                           const CallExpr *) const;
54
55   void evalMemcpy(CheckerContext &C, const CallExpr *CE) const;
56   void evalMempcpy(CheckerContext &C, const CallExpr *CE) const;
57   void evalMemmove(CheckerContext &C, const CallExpr *CE) const;
58   void evalBcopy(CheckerContext &C, const CallExpr *CE) const;
59   void evalCopyCommon(CheckerContext &C, const CallExpr *CE,
60                       const GRState *state,
61                       const Expr *Size, const Expr *Source, const Expr *Dest,
62                       bool Restricted = false,
63                       bool IsMempcpy = false) const;
64
65   void evalMemcmp(CheckerContext &C, const CallExpr *CE) const;
66
67   void evalstrLength(CheckerContext &C, const CallExpr *CE) const;
68   void evalstrnLength(CheckerContext &C, const CallExpr *CE) const;
69   void evalstrLengthCommon(CheckerContext &C, const CallExpr *CE, 
70                            bool IsStrnlen = false) const;
71
72   void evalStrcpy(CheckerContext &C, const CallExpr *CE) const;
73   void evalStrncpy(CheckerContext &C, const CallExpr *CE) const;
74   void evalStpcpy(CheckerContext &C, const CallExpr *CE) const;
75   void evalStrcpyCommon(CheckerContext &C, const CallExpr *CE, bool returnEnd,
76                         bool isBounded, bool isAppending) const;
77
78   void evalStrcat(CheckerContext &C, const CallExpr *CE) const;
79   void evalStrncat(CheckerContext &C, const CallExpr *CE) const;
80
81   void evalStrcmp(CheckerContext &C, const CallExpr *CE) const;
82   void evalStrncmp(CheckerContext &C, const CallExpr *CE) const;
83   void evalStrcasecmp(CheckerContext &C, const CallExpr *CE) const;
84   void evalStrncasecmp(CheckerContext &C, const CallExpr *CE) const;
85   void evalStrcmpCommon(CheckerContext &C, const CallExpr *CE,
86                         bool isBounded = false, bool ignoreCase = false) const;
87
88   // Utility methods
89   std::pair<const GRState*, const GRState*>
90   static assumeZero(CheckerContext &C,
91                     const GRState *state, SVal V, QualType Ty);
92
93   static const GRState *setCStringLength(const GRState *state,
94                                          const MemRegion *MR, SVal strLength);
95   static SVal getCStringLengthForRegion(CheckerContext &C,
96                                         const GRState *&state,
97                                         const Expr *Ex, const MemRegion *MR,
98                                         bool hypothetical);
99   SVal getCStringLength(CheckerContext &C, const GRState *&state,
100                         const Expr *Ex, SVal Buf,
101                         bool hypothetical = false) const;
102
103   const StringLiteral *getCStringLiteral(CheckerContext &C, 
104                                          const GRState *&state,
105                                          const Expr *expr,  
106                                          SVal val) const;
107
108   static const GRState *InvalidateBuffer(CheckerContext &C,
109                                          const GRState *state,
110                                          const Expr *Ex, SVal V);
111
112   static bool SummarizeRegion(llvm::raw_ostream& os, ASTContext& Ctx,
113                               const MemRegion *MR);
114
115   // Re-usable checks
116   const GRState *checkNonNull(CheckerContext &C, const GRState *state,
117                                const Expr *S, SVal l) const;
118   const GRState *CheckLocation(CheckerContext &C, const GRState *state,
119                                const Expr *S, SVal l,
120                                const char *message = NULL) const;
121   const GRState *CheckBufferAccess(CheckerContext &C, const GRState *state,
122                                    const Expr *Size,
123                                    const Expr *FirstBuf,
124                                    const Expr *SecondBuf,
125                                    const char *firstMessage = NULL,
126                                    const char *secondMessage = NULL,
127                                    bool WarnAboutSize = false) const;
128   const GRState *CheckBufferAccess(CheckerContext &C, const GRState *state,
129                                    const Expr *Size, const Expr *Buf,
130                                    const char *message = NULL,
131                                    bool WarnAboutSize = false) const {
132     // This is a convenience override.
133     return CheckBufferAccess(C, state, Size, Buf, NULL, message, NULL,
134                              WarnAboutSize);
135   }
136   const GRState *CheckOverlap(CheckerContext &C, const GRState *state,
137                               const Expr *Size, const Expr *First,
138                               const Expr *Second) const;
139   void emitOverlapBug(CheckerContext &C, const GRState *state,
140                       const Stmt *First, const Stmt *Second) const;
141   const GRState *checkAdditionOverflow(CheckerContext &C, const GRState *state,
142                                        NonLoc left, NonLoc right) const;
143 };
144
145 class CStringLength {
146 public:
147   typedef llvm::ImmutableMap<const MemRegion *, SVal> EntryMap;
148 };
149 } //end anonymous namespace
150
151 namespace clang {
152 namespace ento {
153   template <>
154   struct GRStateTrait<CStringLength> 
155     : public GRStatePartialTrait<CStringLength::EntryMap> {
156     static void *GDMIndex() { return CStringChecker::getTag(); }
157   };
158 }
159 }
160
161 //===----------------------------------------------------------------------===//
162 // Individual checks and utility methods.
163 //===----------------------------------------------------------------------===//
164
165 std::pair<const GRState*, const GRState*>
166 CStringChecker::assumeZero(CheckerContext &C, const GRState *state, SVal V,
167                            QualType Ty) {
168   DefinedSVal *val = dyn_cast<DefinedSVal>(&V);
169   if (!val)
170     return std::pair<const GRState*, const GRState *>(state, state);
171
172   SValBuilder &svalBuilder = C.getSValBuilder();
173   DefinedOrUnknownSVal zero = svalBuilder.makeZeroVal(Ty);
174   return state->assume(svalBuilder.evalEQ(state, *val, zero));
175 }
176
177 const GRState *CStringChecker::checkNonNull(CheckerContext &C,
178                                             const GRState *state,
179                                             const Expr *S, SVal l) const {
180   // If a previous check has failed, propagate the failure.
181   if (!state)
182     return NULL;
183
184   const GRState *stateNull, *stateNonNull;
185   llvm::tie(stateNull, stateNonNull) = assumeZero(C, state, l, S->getType());
186
187   if (stateNull && !stateNonNull) {
188     ExplodedNode *N = C.generateSink(stateNull);
189     if (!N)
190       return NULL;
191
192     if (!BT_Null)
193       BT_Null.reset(new BuiltinBug("API",
194         "Null pointer argument in call to byte string function"));
195
196     llvm::SmallString<80> buf;
197     llvm::raw_svector_ostream os(buf);
198     assert(CurrentFunctionDescription);
199     os << "Null pointer argument in call to " << CurrentFunctionDescription;
200
201     // Generate a report for this bug.
202     BuiltinBug *BT = static_cast<BuiltinBug*>(BT_Null.get());
203     EnhancedBugReport *report = new EnhancedBugReport(*BT, os.str(), N);
204
205     report->addRange(S->getSourceRange());
206     report->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, S);
207     C.EmitReport(report);
208     return NULL;
209   }
210
211   // From here on, assume that the value is non-null.
212   assert(stateNonNull);
213   return stateNonNull;
214 }
215
216 // FIXME: This was originally copied from ArrayBoundChecker.cpp. Refactor?
217 const GRState *CStringChecker::CheckLocation(CheckerContext &C,
218                                              const GRState *state,
219                                              const Expr *S, SVal l,
220                                              const char *warningMsg) const {
221   // If a previous check has failed, propagate the failure.
222   if (!state)
223     return NULL;
224
225   // Check for out of bound array element access.
226   const MemRegion *R = l.getAsRegion();
227   if (!R)
228     return state;
229
230   const ElementRegion *ER = dyn_cast<ElementRegion>(R);
231   if (!ER)
232     return state;
233
234   assert(ER->getValueType() == C.getASTContext().CharTy &&
235     "CheckLocation should only be called with char* ElementRegions");
236
237   // Get the size of the array.
238   const SubRegion *superReg = cast<SubRegion>(ER->getSuperRegion());
239   SValBuilder &svalBuilder = C.getSValBuilder();
240   SVal Extent = 
241     svalBuilder.convertToArrayIndex(superReg->getExtent(svalBuilder));
242   DefinedOrUnknownSVal Size = cast<DefinedOrUnknownSVal>(Extent);
243
244   // Get the index of the accessed element.
245   DefinedOrUnknownSVal Idx = cast<DefinedOrUnknownSVal>(ER->getIndex());
246
247   const GRState *StInBound = state->assumeInBound(Idx, Size, true);
248   const GRState *StOutBound = state->assumeInBound(Idx, Size, false);
249   if (StOutBound && !StInBound) {
250     ExplodedNode *N = C.generateSink(StOutBound);
251     if (!N)
252       return NULL;
253
254     if (!BT_Bounds) {
255       BT_Bounds.reset(new BuiltinBug("Out-of-bound array access",
256         "Byte string function accesses out-of-bound array element"));
257     }
258     BuiltinBug *BT = static_cast<BuiltinBug*>(BT_Bounds.get());
259
260     // Generate a report for this bug.
261     RangedBugReport *report;
262     if (warningMsg) {
263       report = new RangedBugReport(*BT, warningMsg, N);
264     } else {
265       assert(CurrentFunctionDescription);
266       assert(CurrentFunctionDescription[0] != '\0');
267
268       llvm::SmallString<80> buf;
269       llvm::raw_svector_ostream os(buf);
270       os << (char)toupper(CurrentFunctionDescription[0])
271          << &CurrentFunctionDescription[1]
272          << " accesses out-of-bound array element";
273       report = new RangedBugReport(*BT, os.str(), N);      
274     }
275
276     // FIXME: It would be nice to eventually make this diagnostic more clear,
277     // e.g., by referencing the original declaration or by saying *why* this
278     // reference is outside the range.
279
280     report->addRange(S->getSourceRange());
281     C.EmitReport(report);
282     return NULL;
283   }
284   
285   // Array bound check succeeded.  From this point forward the array bound
286   // should always succeed.
287   return StInBound;
288 }
289
290 const GRState *CStringChecker::CheckBufferAccess(CheckerContext &C,
291                                                  const GRState *state,
292                                                  const Expr *Size,
293                                                  const Expr *FirstBuf,
294                                                  const Expr *SecondBuf,
295                                                  const char *firstMessage,
296                                                  const char *secondMessage,
297                                                  bool WarnAboutSize) const {
298   // If a previous check has failed, propagate the failure.
299   if (!state)
300     return NULL;
301
302   SValBuilder &svalBuilder = C.getSValBuilder();
303   ASTContext &Ctx = svalBuilder.getContext();
304
305   QualType sizeTy = Size->getType();
306   QualType PtrTy = Ctx.getPointerType(Ctx.CharTy);
307
308   // Check that the first buffer is non-null.
309   SVal BufVal = state->getSVal(FirstBuf);
310   state = checkNonNull(C, state, FirstBuf, BufVal);
311   if (!state)
312     return NULL;
313
314   // Get the access length and make sure it is known.
315   // FIXME: This assumes the caller has already checked that the access length
316   // is positive. And that it's unsigned.
317   SVal LengthVal = state->getSVal(Size);
318   NonLoc *Length = dyn_cast<NonLoc>(&LengthVal);
319   if (!Length)
320     return state;
321
322   // Compute the offset of the last element to be accessed: size-1.
323   NonLoc One = cast<NonLoc>(svalBuilder.makeIntVal(1, sizeTy));
324   NonLoc LastOffset = cast<NonLoc>(svalBuilder.evalBinOpNN(state, BO_Sub,
325                                                     *Length, One, sizeTy));
326
327   // Check that the first buffer is sufficiently long.
328   SVal BufStart = svalBuilder.evalCast(BufVal, PtrTy, FirstBuf->getType());
329   if (Loc *BufLoc = dyn_cast<Loc>(&BufStart)) {
330     const Expr *warningExpr = (WarnAboutSize ? Size : FirstBuf);
331
332     SVal BufEnd = svalBuilder.evalBinOpLN(state, BO_Add, *BufLoc,
333                                           LastOffset, PtrTy);
334     state = CheckLocation(C, state, warningExpr, BufEnd, firstMessage);
335
336     // If the buffer isn't large enough, abort.
337     if (!state)
338       return NULL;
339   }
340
341   // If there's a second buffer, check it as well.
342   if (SecondBuf) {
343     BufVal = state->getSVal(SecondBuf);
344     state = checkNonNull(C, state, SecondBuf, BufVal);
345     if (!state)
346       return NULL;
347
348     BufStart = svalBuilder.evalCast(BufVal, PtrTy, SecondBuf->getType());
349     if (Loc *BufLoc = dyn_cast<Loc>(&BufStart)) {
350       const Expr *warningExpr = (WarnAboutSize ? Size : SecondBuf);
351
352       SVal BufEnd = svalBuilder.evalBinOpLN(state, BO_Add, *BufLoc,
353                                             LastOffset, PtrTy);
354       state = CheckLocation(C, state, warningExpr, BufEnd, secondMessage);
355     }
356   }
357
358   // Large enough or not, return this state!
359   return state;
360 }
361
362 const GRState *CStringChecker::CheckOverlap(CheckerContext &C,
363                                             const GRState *state,
364                                             const Expr *Size,
365                                             const Expr *First,
366                                             const Expr *Second) const {
367   // Do a simple check for overlap: if the two arguments are from the same
368   // buffer, see if the end of the first is greater than the start of the second
369   // or vice versa.
370
371   // If a previous check has failed, propagate the failure.
372   if (!state)
373     return NULL;
374
375   const GRState *stateTrue, *stateFalse;
376
377   // Get the buffer values and make sure they're known locations.
378   SVal firstVal = state->getSVal(First);
379   SVal secondVal = state->getSVal(Second);
380
381   Loc *firstLoc = dyn_cast<Loc>(&firstVal);
382   if (!firstLoc)
383     return state;
384
385   Loc *secondLoc = dyn_cast<Loc>(&secondVal);
386   if (!secondLoc)
387     return state;
388
389   // Are the two values the same?
390   SValBuilder &svalBuilder = C.getSValBuilder();  
391   llvm::tie(stateTrue, stateFalse) =
392     state->assume(svalBuilder.evalEQ(state, *firstLoc, *secondLoc));
393
394   if (stateTrue && !stateFalse) {
395     // If the values are known to be equal, that's automatically an overlap.
396     emitOverlapBug(C, stateTrue, First, Second);
397     return NULL;
398   }
399
400   // assume the two expressions are not equal.
401   assert(stateFalse);
402   state = stateFalse;
403
404   // Which value comes first?
405   QualType cmpTy = svalBuilder.getConditionType();
406   SVal reverse = svalBuilder.evalBinOpLL(state, BO_GT,
407                                          *firstLoc, *secondLoc, cmpTy);
408   DefinedOrUnknownSVal *reverseTest = dyn_cast<DefinedOrUnknownSVal>(&reverse);
409   if (!reverseTest)
410     return state;
411
412   llvm::tie(stateTrue, stateFalse) = state->assume(*reverseTest);
413   if (stateTrue) {
414     if (stateFalse) {
415       // If we don't know which one comes first, we can't perform this test.
416       return state;
417     } else {
418       // Switch the values so that firstVal is before secondVal.
419       Loc *tmpLoc = firstLoc;
420       firstLoc = secondLoc;
421       secondLoc = tmpLoc;
422
423       // Switch the Exprs as well, so that they still correspond.
424       const Expr *tmpExpr = First;
425       First = Second;
426       Second = tmpExpr;
427     }
428   }
429
430   // Get the length, and make sure it too is known.
431   SVal LengthVal = state->getSVal(Size);
432   NonLoc *Length = dyn_cast<NonLoc>(&LengthVal);
433   if (!Length)
434     return state;
435
436   // Convert the first buffer's start address to char*.
437   // Bail out if the cast fails.
438   ASTContext &Ctx = svalBuilder.getContext();
439   QualType CharPtrTy = Ctx.getPointerType(Ctx.CharTy);
440   SVal FirstStart = svalBuilder.evalCast(*firstLoc, CharPtrTy, 
441                                          First->getType());
442   Loc *FirstStartLoc = dyn_cast<Loc>(&FirstStart);
443   if (!FirstStartLoc)
444     return state;
445
446   // Compute the end of the first buffer. Bail out if THAT fails.
447   SVal FirstEnd = svalBuilder.evalBinOpLN(state, BO_Add,
448                                  *FirstStartLoc, *Length, CharPtrTy);
449   Loc *FirstEndLoc = dyn_cast<Loc>(&FirstEnd);
450   if (!FirstEndLoc)
451     return state;
452
453   // Is the end of the first buffer past the start of the second buffer?
454   SVal Overlap = svalBuilder.evalBinOpLL(state, BO_GT,
455                                 *FirstEndLoc, *secondLoc, cmpTy);
456   DefinedOrUnknownSVal *OverlapTest = dyn_cast<DefinedOrUnknownSVal>(&Overlap);
457   if (!OverlapTest)
458     return state;
459
460   llvm::tie(stateTrue, stateFalse) = state->assume(*OverlapTest);
461
462   if (stateTrue && !stateFalse) {
463     // Overlap!
464     emitOverlapBug(C, stateTrue, First, Second);
465     return NULL;
466   }
467
468   // assume the two expressions don't overlap.
469   assert(stateFalse);
470   return stateFalse;
471 }
472
473 void CStringChecker::emitOverlapBug(CheckerContext &C, const GRState *state,
474                                   const Stmt *First, const Stmt *Second) const {
475   ExplodedNode *N = C.generateSink(state);
476   if (!N)
477     return;
478
479   if (!BT_Overlap)
480     BT_Overlap.reset(new BugType("Unix API", "Improper arguments"));
481
482   // Generate a report for this bug.
483   RangedBugReport *report = 
484     new RangedBugReport(*BT_Overlap,
485       "Arguments must not be overlapping buffers", N);
486   report->addRange(First->getSourceRange());
487   report->addRange(Second->getSourceRange());
488
489   C.EmitReport(report);
490 }
491
492 const GRState *CStringChecker::checkAdditionOverflow(CheckerContext &C,
493                                                      const GRState *state,
494                                                      NonLoc left,
495                                                      NonLoc right) const {
496   // If a previous check has failed, propagate the failure.
497   if (!state)
498     return NULL;
499
500   SValBuilder &svalBuilder = C.getSValBuilder();
501   BasicValueFactory &BVF = svalBuilder.getBasicValueFactory();
502
503   QualType sizeTy = svalBuilder.getContext().getSizeType();
504   const llvm::APSInt &maxValInt = BVF.getMaxValue(sizeTy);
505   NonLoc maxVal = svalBuilder.makeIntVal(maxValInt);
506
507   SVal maxMinusRight = svalBuilder.evalBinOpNN(state, BO_Sub, maxVal, right,
508                                                sizeTy);
509
510   if (maxMinusRight.isUnknownOrUndef()) {
511     // Try switching the operands. (The order of these two assignments is
512     // important!)
513     maxMinusRight = svalBuilder.evalBinOpNN(state, BO_Sub, maxVal, left, 
514                                             sizeTy);
515     left = right;
516   }
517
518   if (NonLoc *maxMinusRightNL = dyn_cast<NonLoc>(&maxMinusRight)) {
519     QualType cmpTy = svalBuilder.getConditionType();
520     // If left > max - right, we have an overflow.
521     SVal willOverflow = svalBuilder.evalBinOpNN(state, BO_GT, left,
522                                                 *maxMinusRightNL, cmpTy);
523
524     const GRState *stateOverflow, *stateOkay;
525     llvm::tie(stateOverflow, stateOkay) =
526       state->assume(cast<DefinedOrUnknownSVal>(willOverflow));
527
528     if (stateOverflow && !stateOkay) {
529       // We have an overflow. Emit a bug report.
530       ExplodedNode *N = C.generateSink(stateOverflow);
531       if (!N)
532         return NULL;
533
534       if (!BT_AdditionOverflow)
535         BT_AdditionOverflow.reset(new BuiltinBug("API",
536           "Sum of expressions causes overflow"));
537
538       // This isn't a great error message, but this should never occur in real
539       // code anyway -- you'd have to create a buffer longer than a size_t can
540       // represent, which is sort of a contradiction.
541       const char *warning =
542         "This expression will create a string whose length is too big to "
543         "be represented as a size_t";
544
545       // Generate a report for this bug.
546       BugReport *report = new BugReport(*BT_AdditionOverflow, warning, N);
547       C.EmitReport(report);        
548
549       return NULL;
550     }
551
552     // From now on, assume an overflow didn't occur.
553     assert(stateOkay);
554     state = stateOkay;
555   }
556
557   return state;
558 }
559
560 const GRState *CStringChecker::setCStringLength(const GRState *state,
561                                                 const MemRegion *MR,
562                                                 SVal strLength) {
563   assert(!strLength.isUndef() && "Attempt to set an undefined string length");
564
565   MR = MR->StripCasts();
566
567   switch (MR->getKind()) {
568   case MemRegion::StringRegionKind:
569     // FIXME: This can happen if we strcpy() into a string region. This is
570     // undefined [C99 6.4.5p6], but we should still warn about it.
571     return state;
572
573   case MemRegion::SymbolicRegionKind:
574   case MemRegion::AllocaRegionKind:
575   case MemRegion::VarRegionKind:
576   case MemRegion::FieldRegionKind:
577   case MemRegion::ObjCIvarRegionKind:
578     // These are the types we can currently track string lengths for.
579     break;
580
581   case MemRegion::ElementRegionKind:
582     // FIXME: Handle element regions by upper-bounding the parent region's
583     // string length.
584     return state;
585
586   default:
587     // Other regions (mostly non-data) can't have a reliable C string length.
588     // For now, just ignore the change.
589     // FIXME: These are rare but not impossible. We should output some kind of
590     // warning for things like strcpy((char[]){'a', 0}, "b");
591     return state;
592   }
593
594   if (strLength.isUnknown())
595     return state->remove<CStringLength>(MR);
596
597   return state->set<CStringLength>(MR, strLength);
598 }
599
600 SVal CStringChecker::getCStringLengthForRegion(CheckerContext &C,
601                                                const GRState *&state,
602                                                const Expr *Ex,
603                                                const MemRegion *MR,
604                                                bool hypothetical) {
605   if (!hypothetical) {
606     // If there's a recorded length, go ahead and return it.
607     const SVal *Recorded = state->get<CStringLength>(MR);
608     if (Recorded)
609       return *Recorded;
610   }
611   
612   // Otherwise, get a new symbol and update the state.
613   unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
614   SValBuilder &svalBuilder = C.getSValBuilder();
615   QualType sizeTy = svalBuilder.getContext().getSizeType();
616   SVal strLength = svalBuilder.getMetadataSymbolVal(CStringChecker::getTag(),
617                                                     MR, Ex, sizeTy, Count);
618
619   if (!hypothetical)
620     state = state->set<CStringLength>(MR, strLength);
621
622   return strLength;
623 }
624
625 SVal CStringChecker::getCStringLength(CheckerContext &C, const GRState *&state,
626                                       const Expr *Ex, SVal Buf,
627                                       bool hypothetical) const {
628   const MemRegion *MR = Buf.getAsRegion();
629   if (!MR) {
630     // If we can't get a region, see if it's something we /know/ isn't a
631     // C string. In the context of locations, the only time we can issue such
632     // a warning is for labels.
633     if (loc::GotoLabel *Label = dyn_cast<loc::GotoLabel>(&Buf)) {
634       if (ExplodedNode *N = C.generateNode(state)) {
635         if (!BT_NotCString)
636           BT_NotCString.reset(new BuiltinBug("API",
637             "Argument is not a null-terminated string."));
638
639         llvm::SmallString<120> buf;
640         llvm::raw_svector_ostream os(buf);
641         assert(CurrentFunctionDescription);
642         os << "Argument to " << CurrentFunctionDescription
643            << " is the address of the label '" << Label->getLabel()->getName()
644            << "', which is not a null-terminated string";
645
646         // Generate a report for this bug.
647         EnhancedBugReport *report = new EnhancedBugReport(*BT_NotCString,
648                                                           os.str(), N);
649
650         report->addRange(Ex->getSourceRange());
651         C.EmitReport(report);        
652       }
653
654       return UndefinedVal();
655     }
656
657     // If it's not a region and not a label, give up.
658     return UnknownVal();
659   }
660
661   // If we have a region, strip casts from it and see if we can figure out
662   // its length. For anything we can't figure out, just return UnknownVal.
663   MR = MR->StripCasts();
664
665   switch (MR->getKind()) {
666   case MemRegion::StringRegionKind: {
667     // Modifying the contents of string regions is undefined [C99 6.4.5p6],
668     // so we can assume that the byte length is the correct C string length.
669     SValBuilder &svalBuilder = C.getSValBuilder();
670     QualType sizeTy = svalBuilder.getContext().getSizeType();
671     const StringLiteral *strLit = cast<StringRegion>(MR)->getStringLiteral();
672     return svalBuilder.makeIntVal(strLit->getByteLength(), sizeTy);
673   }
674   case MemRegion::SymbolicRegionKind:
675   case MemRegion::AllocaRegionKind:
676   case MemRegion::VarRegionKind:
677   case MemRegion::FieldRegionKind:
678   case MemRegion::ObjCIvarRegionKind:
679     return getCStringLengthForRegion(C, state, Ex, MR, hypothetical);
680   case MemRegion::CompoundLiteralRegionKind:
681     // FIXME: Can we track this? Is it necessary?
682     return UnknownVal();
683   case MemRegion::ElementRegionKind:
684     // FIXME: How can we handle this? It's not good enough to subtract the
685     // offset from the base string length; consider "123\x00567" and &a[5].
686     return UnknownVal();
687   default:
688     // Other regions (mostly non-data) can't have a reliable C string length.
689     // In this case, an error is emitted and UndefinedVal is returned.
690     // The caller should always be prepared to handle this case.
691     if (ExplodedNode *N = C.generateNode(state)) {
692       if (!BT_NotCString)
693         BT_NotCString.reset(new BuiltinBug("API",
694           "Argument is not a null-terminated string."));
695
696       llvm::SmallString<120> buf;
697       llvm::raw_svector_ostream os(buf);
698
699       assert(CurrentFunctionDescription);
700       os << "Argument to " << CurrentFunctionDescription << " is ";
701
702       if (SummarizeRegion(os, C.getASTContext(), MR))
703         os << ", which is not a null-terminated string";
704       else
705         os << "not a null-terminated string";
706
707       // Generate a report for this bug.
708       EnhancedBugReport *report = new EnhancedBugReport(*BT_NotCString,
709                                                         os.str(), N);
710
711       report->addRange(Ex->getSourceRange());
712       C.EmitReport(report);        
713     }
714
715     return UndefinedVal();
716   }
717 }
718
719 const StringLiteral *CStringChecker::getCStringLiteral(CheckerContext &C,
720   const GRState *&state, const Expr *expr, SVal val) const {
721
722   // Get the memory region pointed to by the val.
723   const MemRegion *bufRegion = val.getAsRegion();
724   if (!bufRegion)
725     return NULL; 
726
727   // Strip casts off the memory region.
728   bufRegion = bufRegion->StripCasts();
729
730   // Cast the memory region to a string region.
731   const StringRegion *strRegion= dyn_cast<StringRegion>(bufRegion);
732   if (!strRegion)
733     return NULL; 
734
735   // Return the actual string in the string region.
736   return strRegion->getStringLiteral();
737 }
738
739 const GRState *CStringChecker::InvalidateBuffer(CheckerContext &C,
740                                                 const GRState *state,
741                                                 const Expr *E, SVal V) {
742   Loc *L = dyn_cast<Loc>(&V);
743   if (!L)
744     return state;
745
746   // FIXME: This is a simplified version of what's in CFRefCount.cpp -- it makes
747   // some assumptions about the value that CFRefCount can't. Even so, it should
748   // probably be refactored.
749   if (loc::MemRegionVal* MR = dyn_cast<loc::MemRegionVal>(L)) {
750     const MemRegion *R = MR->getRegion()->StripCasts();
751
752     // Are we dealing with an ElementRegion?  If so, we should be invalidating
753     // the super-region.
754     if (const ElementRegion *ER = dyn_cast<ElementRegion>(R)) {
755       R = ER->getSuperRegion();
756       // FIXME: What about layers of ElementRegions?
757     }
758
759     // Invalidate this region.
760     unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
761     return state->invalidateRegion(R, E, Count, NULL);
762   }
763
764   // If we have a non-region value by chance, just remove the binding.
765   // FIXME: is this necessary or correct? This handles the non-Region
766   //  cases.  Is it ever valid to store to these?
767   return state->unbindLoc(*L);
768 }
769
770 bool CStringChecker::SummarizeRegion(llvm::raw_ostream& os, ASTContext& Ctx,
771                                      const MemRegion *MR) {
772   const TypedRegion *TR = dyn_cast<TypedRegion>(MR);
773   if (!TR)
774     return false;
775
776   switch (TR->getKind()) {
777   case MemRegion::FunctionTextRegionKind: {
778     const FunctionDecl *FD = cast<FunctionTextRegion>(TR)->getDecl();
779     if (FD)
780       os << "the address of the function '" << FD << "'";
781     else
782       os << "the address of a function";
783     return true;
784   }
785   case MemRegion::BlockTextRegionKind:
786     os << "block text";
787     return true;
788   case MemRegion::BlockDataRegionKind:
789     os << "a block";
790     return true;
791   case MemRegion::CXXThisRegionKind:
792   case MemRegion::CXXTempObjectRegionKind:
793     os << "a C++ temp object of type " << TR->getValueType().getAsString();
794     return true;
795   case MemRegion::VarRegionKind:
796     os << "a variable of type" << TR->getValueType().getAsString();
797     return true;
798   case MemRegion::FieldRegionKind:
799     os << "a field of type " << TR->getValueType().getAsString();
800     return true;
801   case MemRegion::ObjCIvarRegionKind:
802     os << "an instance variable of type " << TR->getValueType().getAsString();
803     return true;
804   default:
805     return false;
806   }
807 }
808
809 //===----------------------------------------------------------------------===//
810 // evaluation of individual function calls.
811 //===----------------------------------------------------------------------===//
812
813 void CStringChecker::evalCopyCommon(CheckerContext &C, 
814                                     const CallExpr *CE,
815                                     const GRState *state,
816                                     const Expr *Size, const Expr *Dest,
817                                     const Expr *Source, bool Restricted,
818                                     bool IsMempcpy) const {
819   CurrentFunctionDescription = "memory copy function";
820
821   // See if the size argument is zero.
822   SVal sizeVal = state->getSVal(Size);
823   QualType sizeTy = Size->getType();
824
825   const GRState *stateZeroSize, *stateNonZeroSize;
826   llvm::tie(stateZeroSize, stateNonZeroSize) =
827     assumeZero(C, state, sizeVal, sizeTy);
828
829   // Get the value of the Dest.
830   SVal destVal = state->getSVal(Dest);
831
832   // If the size is zero, there won't be any actual memory access, so
833   // just bind the return value to the destination buffer and return.
834   if (stateZeroSize) {
835     stateZeroSize = stateZeroSize->BindExpr(CE, destVal);
836     C.addTransition(stateZeroSize);
837   }
838
839   // If the size can be nonzero, we have to check the other arguments.
840   if (stateNonZeroSize) {
841     state = stateNonZeroSize;
842
843     // Ensure the destination is not null. If it is NULL there will be a
844     // NULL pointer dereference.
845     state = checkNonNull(C, state, Dest, destVal);
846     if (!state)
847       return;
848
849     // Get the value of the Src.
850     SVal srcVal = state->getSVal(Source);
851     
852     // Ensure the source is not null. If it is NULL there will be a
853     // NULL pointer dereference.
854     state = checkNonNull(C, state, Source, srcVal);
855     if (!state)
856       return;
857
858     // Ensure the accesses are valid and that the buffers do not overlap.
859     const char * const writeWarning =
860       "Memory copy function overflows destination buffer";
861     state = CheckBufferAccess(C, state, Size, Dest, Source,
862                               writeWarning, /* sourceWarning = */ NULL);
863     if (Restricted)
864       state = CheckOverlap(C, state, Size, Dest, Source);
865
866     if (!state)
867       return;
868
869     // If this is mempcpy, get the byte after the last byte copied and 
870     // bind the expr.
871     if (IsMempcpy) {
872       loc::MemRegionVal *destRegVal = dyn_cast<loc::MemRegionVal>(&destVal);
873       assert(destRegVal && "Destination should be a known MemRegionVal here");
874       
875       // Get the length to copy.
876       NonLoc *lenValNonLoc = dyn_cast<NonLoc>(&sizeVal);
877       
878       if (lenValNonLoc) {
879         // Get the byte after the last byte copied.
880         SVal lastElement = C.getSValBuilder().evalBinOpLN(state, BO_Add, 
881                                                           *destRegVal,
882                                                           *lenValNonLoc, 
883                                                           Dest->getType());
884       
885         // The byte after the last byte copied is the return value.
886         state = state->BindExpr(CE, lastElement);
887       } else {
888         // If we don't know how much we copied, we can at least
889         // conjure a return value for later.
890         unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
891         SVal result =
892           C.getSValBuilder().getConjuredSymbolVal(NULL, CE, Count);
893         state = state->BindExpr(CE, result);
894       }
895
896     } else {
897       // All other copies return the destination buffer.
898       // (Well, bcopy() has a void return type, but this won't hurt.)
899       state = state->BindExpr(CE, destVal);
900     }
901
902     // Invalidate the destination.
903     // FIXME: Even if we can't perfectly model the copy, we should see if we
904     // can use LazyCompoundVals to copy the source values into the destination.
905     // This would probably remove any existing bindings past the end of the
906     // copied region, but that's still an improvement over blank invalidation.
907     state = InvalidateBuffer(C, state, Dest, state->getSVal(Dest));
908     C.addTransition(state);
909   }
910 }
911
912
913 void CStringChecker::evalMemcpy(CheckerContext &C, const CallExpr *CE) const {
914   // void *memcpy(void *restrict dst, const void *restrict src, size_t n);
915   // The return value is the address of the destination buffer.
916   const Expr *Dest = CE->getArg(0);
917   const GRState *state = C.getState();
918
919   evalCopyCommon(C, CE, state, CE->getArg(2), Dest, CE->getArg(1), true);
920 }
921
922 void CStringChecker::evalMempcpy(CheckerContext &C, const CallExpr *CE) const {
923   // void *mempcpy(void *restrict dst, const void *restrict src, size_t n);
924   // The return value is a pointer to the byte following the last written byte.
925   const Expr *Dest = CE->getArg(0);
926   const GRState *state = C.getState();
927   
928   evalCopyCommon(C, CE, state, CE->getArg(2), Dest, CE->getArg(1), true, true);
929 }
930
931 void CStringChecker::evalMemmove(CheckerContext &C, const CallExpr *CE) const {
932   // void *memmove(void *dst, const void *src, size_t n);
933   // The return value is the address of the destination buffer.
934   const Expr *Dest = CE->getArg(0);
935   const GRState *state = C.getState();
936
937   evalCopyCommon(C, CE, state, CE->getArg(2), Dest, CE->getArg(1));
938 }
939
940 void CStringChecker::evalBcopy(CheckerContext &C, const CallExpr *CE) const {
941   // void bcopy(const void *src, void *dst, size_t n);
942   evalCopyCommon(C, CE, C.getState(), 
943                  CE->getArg(2), CE->getArg(1), CE->getArg(0));
944 }
945
946 void CStringChecker::evalMemcmp(CheckerContext &C, const CallExpr *CE) const {
947   // int memcmp(const void *s1, const void *s2, size_t n);
948   CurrentFunctionDescription = "memory comparison function";
949
950   const Expr *Left = CE->getArg(0);
951   const Expr *Right = CE->getArg(1);
952   const Expr *Size = CE->getArg(2);
953
954   const GRState *state = C.getState();
955   SValBuilder &svalBuilder = C.getSValBuilder();
956
957   // See if the size argument is zero.
958   SVal sizeVal = state->getSVal(Size);
959   QualType sizeTy = Size->getType();
960
961   const GRState *stateZeroSize, *stateNonZeroSize;
962   llvm::tie(stateZeroSize, stateNonZeroSize) =
963     assumeZero(C, state, sizeVal, sizeTy);
964
965   // If the size can be zero, the result will be 0 in that case, and we don't
966   // have to check either of the buffers.
967   if (stateZeroSize) {
968     state = stateZeroSize;
969     state = state->BindExpr(CE, svalBuilder.makeZeroVal(CE->getType()));
970     C.addTransition(state);
971   }
972
973   // If the size can be nonzero, we have to check the other arguments.
974   if (stateNonZeroSize) {
975     state = stateNonZeroSize;
976     // If we know the two buffers are the same, we know the result is 0.
977     // First, get the two buffers' addresses. Another checker will have already
978     // made sure they're not undefined.
979     DefinedOrUnknownSVal LV = cast<DefinedOrUnknownSVal>(state->getSVal(Left));
980     DefinedOrUnknownSVal RV = cast<DefinedOrUnknownSVal>(state->getSVal(Right));
981
982     // See if they are the same.
983     DefinedOrUnknownSVal SameBuf = svalBuilder.evalEQ(state, LV, RV);
984     const GRState *StSameBuf, *StNotSameBuf;
985     llvm::tie(StSameBuf, StNotSameBuf) = state->assume(SameBuf);
986
987     // If the two arguments might be the same buffer, we know the result is 0,
988     // and we only need to check one size.
989     if (StSameBuf) {
990       state = StSameBuf;
991       state = CheckBufferAccess(C, state, Size, Left);
992       if (state) {
993         state = StSameBuf->BindExpr(CE, svalBuilder.makeZeroVal(CE->getType()));
994         C.addTransition(state); 
995       }
996     }
997
998     // If the two arguments might be different buffers, we have to check the
999     // size of both of them.
1000     if (StNotSameBuf) {
1001       state = StNotSameBuf;
1002       state = CheckBufferAccess(C, state, Size, Left, Right);
1003       if (state) {
1004         // The return value is the comparison result, which we don't know.
1005         unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
1006         SVal CmpV = svalBuilder.getConjuredSymbolVal(NULL, CE, Count);
1007         state = state->BindExpr(CE, CmpV);
1008         C.addTransition(state);
1009       }
1010     }
1011   }
1012 }
1013
1014 void CStringChecker::evalstrLength(CheckerContext &C,
1015                                    const CallExpr *CE) const {
1016   // size_t strlen(const char *s);
1017   evalstrLengthCommon(C, CE, /* IsStrnlen = */ false);
1018 }
1019
1020 void CStringChecker::evalstrnLength(CheckerContext &C,
1021                                     const CallExpr *CE) const {
1022   // size_t strnlen(const char *s, size_t maxlen);
1023   evalstrLengthCommon(C, CE, /* IsStrnlen = */ true);
1024 }
1025
1026 void CStringChecker::evalstrLengthCommon(CheckerContext &C, const CallExpr *CE,
1027                                          bool IsStrnlen) const {
1028   CurrentFunctionDescription = "string length function";
1029   const GRState *state = C.getState();
1030
1031   if (IsStrnlen) {
1032     const Expr *maxlenExpr = CE->getArg(1);
1033     SVal maxlenVal = state->getSVal(maxlenExpr);
1034
1035     const GRState *stateZeroSize, *stateNonZeroSize;
1036     llvm::tie(stateZeroSize, stateNonZeroSize) =
1037       assumeZero(C, state, maxlenVal, maxlenExpr->getType());
1038
1039     // If the size can be zero, the result will be 0 in that case, and we don't
1040     // have to check the string itself.
1041     if (stateZeroSize) {
1042       SVal zero = C.getSValBuilder().makeZeroVal(CE->getType());
1043       stateZeroSize = stateZeroSize->BindExpr(CE, zero);
1044       C.addTransition(stateZeroSize);
1045     }
1046
1047     // If the size is GUARANTEED to be zero, we're done!
1048     if (!stateNonZeroSize)
1049       return;
1050
1051     // Otherwise, record the assumption that the size is nonzero.
1052     state = stateNonZeroSize;
1053   }
1054
1055   // Check that the string argument is non-null.
1056   const Expr *Arg = CE->getArg(0);
1057   SVal ArgVal = state->getSVal(Arg);
1058
1059   state = checkNonNull(C, state, Arg, ArgVal);
1060
1061   if (!state)
1062     return;
1063
1064   SVal strLength = getCStringLength(C, state, Arg, ArgVal);
1065
1066   // If the argument isn't a valid C string, there's no valid state to
1067   // transition to.
1068   if (strLength.isUndef())
1069     return;
1070
1071   DefinedOrUnknownSVal result = UnknownVal();
1072
1073   // If the check is for strnlen() then bind the return value to no more than
1074   // the maxlen value.
1075   if (IsStrnlen) {
1076     QualType cmpTy = C.getSValBuilder().getConditionType();
1077
1078     // It's a little unfortunate to be getting this again,
1079     // but it's not that expensive...
1080     const Expr *maxlenExpr = CE->getArg(1);
1081     SVal maxlenVal = state->getSVal(maxlenExpr);
1082
1083     NonLoc *strLengthNL = dyn_cast<NonLoc>(&strLength);
1084     NonLoc *maxlenValNL = dyn_cast<NonLoc>(&maxlenVal);
1085
1086     if (strLengthNL && maxlenValNL) {
1087       const GRState *stateStringTooLong, *stateStringNotTooLong;
1088
1089       // Check if the strLength is greater than the maxlen.
1090       llvm::tie(stateStringTooLong, stateStringNotTooLong) =
1091         state->assume(cast<DefinedOrUnknownSVal>
1092                       (C.getSValBuilder().evalBinOpNN(state, BO_GT, 
1093                                                       *strLengthNL,
1094                                                       *maxlenValNL,
1095                                                       cmpTy)));
1096
1097       if (stateStringTooLong && !stateStringNotTooLong) {
1098         // If the string is longer than maxlen, return maxlen.
1099         result = *maxlenValNL;
1100       } else if (stateStringNotTooLong && !stateStringTooLong) {
1101         // If the string is shorter than maxlen, return its length.
1102         result = *strLengthNL;
1103       }
1104     }
1105
1106     if (result.isUnknown()) {
1107       // If we don't have enough information for a comparison, there's
1108       // no guarantee the full string length will actually be returned.
1109       // All we know is the return value is the min of the string length
1110       // and the limit. This is better than nothing.
1111       unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
1112       result = C.getSValBuilder().getConjuredSymbolVal(NULL, CE, Count);
1113       NonLoc *resultNL = cast<NonLoc>(&result);
1114
1115       if (strLengthNL) {
1116         state = state->assume(cast<DefinedOrUnknownSVal>
1117                               (C.getSValBuilder().evalBinOpNN(state, BO_LE, 
1118                                                               *resultNL,
1119                                                               *strLengthNL,
1120                                                               cmpTy)), true);
1121       }
1122       
1123       if (maxlenValNL) {
1124         state = state->assume(cast<DefinedOrUnknownSVal>
1125                               (C.getSValBuilder().evalBinOpNN(state, BO_LE, 
1126                                                               *resultNL,
1127                                                               *maxlenValNL,
1128                                                               cmpTy)), true);
1129       }
1130     }
1131
1132   } else {
1133     // This is a plain strlen(), not strnlen().
1134     result = cast<DefinedOrUnknownSVal>(strLength);
1135
1136     // If we don't know the length of the string, conjure a return
1137     // value, so it can be used in constraints, at least.
1138     if (result.isUnknown()) {
1139       unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
1140       result = C.getSValBuilder().getConjuredSymbolVal(NULL, CE, Count);
1141     }
1142   }
1143
1144   // Bind the return value.
1145   assert(!result.isUnknown() && "Should have conjured a value by now");
1146   state = state->BindExpr(CE, result);
1147   C.addTransition(state);
1148 }
1149
1150 void CStringChecker::evalStrcpy(CheckerContext &C, const CallExpr *CE) const {
1151   // char *strcpy(char *restrict dst, const char *restrict src);
1152   evalStrcpyCommon(C, CE, 
1153                    /* returnEnd = */ false, 
1154                    /* isBounded = */ false,
1155                    /* isAppending = */ false);
1156 }
1157
1158 void CStringChecker::evalStrncpy(CheckerContext &C, const CallExpr *CE) const {
1159   // char *strncpy(char *restrict dst, const char *restrict src, size_t n);
1160   evalStrcpyCommon(C, CE, 
1161                    /* returnEnd = */ false, 
1162                    /* isBounded = */ true,
1163                    /* isAppending = */ false);
1164 }
1165
1166 void CStringChecker::evalStpcpy(CheckerContext &C, const CallExpr *CE) const {
1167   // char *stpcpy(char *restrict dst, const char *restrict src);
1168   evalStrcpyCommon(C, CE, 
1169                    /* returnEnd = */ true, 
1170                    /* isBounded = */ false,
1171                    /* isAppending = */ false);
1172 }
1173
1174 void CStringChecker::evalStrcat(CheckerContext &C, const CallExpr *CE) const {
1175   //char *strcat(char *restrict s1, const char *restrict s2);
1176   evalStrcpyCommon(C, CE, 
1177                    /* returnEnd = */ false, 
1178                    /* isBounded = */ false,
1179                    /* isAppending = */ true);
1180 }
1181
1182 void CStringChecker::evalStrncat(CheckerContext &C, const CallExpr *CE) const {
1183   //char *strncat(char *restrict s1, const char *restrict s2, size_t n);
1184   evalStrcpyCommon(C, CE, 
1185                    /* returnEnd = */ false, 
1186                    /* isBounded = */ true,
1187                    /* isAppending = */ true);
1188 }
1189
1190 void CStringChecker::evalStrcpyCommon(CheckerContext &C, const CallExpr *CE,
1191                                       bool returnEnd, bool isBounded,
1192                                       bool isAppending) const {
1193   CurrentFunctionDescription = "string copy function";
1194   const GRState *state = C.getState();
1195
1196   // Check that the destination is non-null.
1197   const Expr *Dst = CE->getArg(0);
1198   SVal DstVal = state->getSVal(Dst);
1199
1200   state = checkNonNull(C, state, Dst, DstVal);
1201   if (!state)
1202     return;
1203
1204   // Check that the source is non-null.
1205   const Expr *srcExpr = CE->getArg(1);
1206   SVal srcVal = state->getSVal(srcExpr);
1207   state = checkNonNull(C, state, srcExpr, srcVal);
1208   if (!state)
1209     return;
1210
1211   // Get the string length of the source.
1212   SVal strLength = getCStringLength(C, state, srcExpr, srcVal);
1213
1214   // If the source isn't a valid C string, give up.
1215   if (strLength.isUndef())
1216     return;
1217
1218   SValBuilder &svalBuilder = C.getSValBuilder();
1219   QualType cmpTy = svalBuilder.getConditionType();
1220   QualType sizeTy = svalBuilder.getContext().getSizeType();
1221
1222   // These two values allow checking two kinds of errors:
1223   // - actual overflows caused by a source that doesn't fit in the destination
1224   // - potential overflows caused by a bound that could exceed the destination
1225   SVal amountCopied = UnknownVal();
1226   SVal maxLastElementIndex = UnknownVal();
1227   const char *boundWarning = NULL;
1228
1229   // If the function is strncpy, strncat, etc... it is bounded.
1230   if (isBounded) {
1231     // Get the max number of characters to copy.
1232     const Expr *lenExpr = CE->getArg(2);
1233     SVal lenVal = state->getSVal(lenExpr);
1234
1235     // Protect against misdeclared strncpy().
1236     lenVal = svalBuilder.evalCast(lenVal, sizeTy, lenExpr->getType());
1237
1238     NonLoc *strLengthNL = dyn_cast<NonLoc>(&strLength);
1239     NonLoc *lenValNL = dyn_cast<NonLoc>(&lenVal);
1240
1241     // If we know both values, we might be able to figure out how much
1242     // we're copying.
1243     if (strLengthNL && lenValNL) {
1244       const GRState *stateSourceTooLong, *stateSourceNotTooLong;
1245
1246       // Check if the max number to copy is less than the length of the src.
1247       // If the bound is equal to the source length, strncpy won't null-
1248       // terminate the result!
1249       llvm::tie(stateSourceTooLong, stateSourceNotTooLong) =
1250         state->assume(cast<DefinedOrUnknownSVal>
1251                       (svalBuilder.evalBinOpNN(state, BO_GE, *strLengthNL,
1252                                                *lenValNL, cmpTy)));
1253
1254       if (stateSourceTooLong && !stateSourceNotTooLong) {
1255         // Max number to copy is less than the length of the src, so the actual
1256         // strLength copied is the max number arg.
1257         state = stateSourceTooLong;
1258         amountCopied = lenVal;
1259
1260       } else if (!stateSourceTooLong && stateSourceNotTooLong) {
1261         // The source buffer entirely fits in the bound.
1262         state = stateSourceNotTooLong;
1263         amountCopied = strLength;
1264       }
1265     }
1266
1267     // We still want to know if the bound is known to be too large.
1268     if (lenValNL) {
1269       if (isAppending) {
1270         // For strncat, the check is strlen(dst) + lenVal < sizeof(dst)
1271
1272         // Get the string length of the destination. If the destination is
1273         // memory that can't have a string length, we shouldn't be copying
1274         // into it anyway.
1275         SVal dstStrLength = getCStringLength(C, state, Dst, DstVal);
1276         if (dstStrLength.isUndef())
1277           return;
1278
1279         if (NonLoc *dstStrLengthNL = dyn_cast<NonLoc>(&dstStrLength)) {
1280           maxLastElementIndex = svalBuilder.evalBinOpNN(state, BO_Add,
1281                                                         *lenValNL,
1282                                                         *dstStrLengthNL,
1283                                                         sizeTy);
1284           boundWarning = "Size argument is greater than the free space in the "
1285                          "destination buffer";
1286         }
1287
1288       } else {
1289         // For strncpy, this is just checking that lenVal <= sizeof(dst)
1290         // (Yes, strncpy and strncat differ in how they treat termination.
1291         // strncat ALWAYS terminates, but strncpy doesn't.)
1292         NonLoc one = cast<NonLoc>(svalBuilder.makeIntVal(1, sizeTy));
1293         maxLastElementIndex = svalBuilder.evalBinOpNN(state, BO_Sub, *lenValNL,
1294                                                       one, sizeTy);
1295         boundWarning = "Size argument is greater than the length of the "
1296                        "destination buffer";
1297       }
1298     }
1299
1300     // If we couldn't pin down the copy length, at least bound it.
1301     // FIXME: We should actually run this code path for append as well, but
1302     // right now it creates problems with constraints (since we can end up
1303     // trying to pass constraints from symbol to symbol).
1304     if (amountCopied.isUnknown() && !isAppending) {
1305       // Try to get a "hypothetical" string length symbol, which we can later
1306       // set as a real value if that turns out to be the case.
1307       amountCopied = getCStringLength(C, state, lenExpr, srcVal, true);
1308       assert(!amountCopied.isUndef());
1309
1310       if (NonLoc *amountCopiedNL = dyn_cast<NonLoc>(&amountCopied)) {
1311         if (lenValNL) {
1312           // amountCopied <= lenVal
1313           SVal copiedLessThanBound = svalBuilder.evalBinOpNN(state, BO_LE,
1314                                                              *amountCopiedNL,
1315                                                              *lenValNL,
1316                                                              cmpTy);
1317           state = state->assume(cast<DefinedOrUnknownSVal>(copiedLessThanBound),
1318                                 true);
1319           if (!state)
1320             return;
1321         }
1322
1323         if (strLengthNL) {
1324           // amountCopied <= strlen(source)
1325           SVal copiedLessThanSrc = svalBuilder.evalBinOpNN(state, BO_LE,
1326                                                            *amountCopiedNL,
1327                                                            *strLengthNL,
1328                                                            cmpTy);
1329           state = state->assume(cast<DefinedOrUnknownSVal>(copiedLessThanSrc),
1330                                 true);
1331           if (!state)
1332             return;
1333         }
1334       }
1335     }
1336
1337   } else {
1338     // The function isn't bounded. The amount copied should match the length
1339     // of the source buffer.
1340     amountCopied = strLength;
1341   }
1342
1343   assert(state);
1344
1345   // This represents the number of characters copied into the destination
1346   // buffer. (It may not actually be the strlen if the destination buffer
1347   // is not terminated.)
1348   SVal finalStrLength = UnknownVal();
1349
1350   // If this is an appending function (strcat, strncat...) then set the
1351   // string length to strlen(src) + strlen(dst) since the buffer will
1352   // ultimately contain both.
1353   if (isAppending) {
1354     // Get the string length of the destination. If the destination is memory
1355     // that can't have a string length, we shouldn't be copying into it anyway.
1356     SVal dstStrLength = getCStringLength(C, state, Dst, DstVal);
1357     if (dstStrLength.isUndef())
1358       return;
1359
1360     NonLoc *srcStrLengthNL = dyn_cast<NonLoc>(&amountCopied);
1361     NonLoc *dstStrLengthNL = dyn_cast<NonLoc>(&dstStrLength);
1362     
1363     // If we know both string lengths, we might know the final string length.
1364     if (srcStrLengthNL && dstStrLengthNL) {
1365       // Make sure the two lengths together don't overflow a size_t.
1366       state = checkAdditionOverflow(C, state, *srcStrLengthNL, *dstStrLengthNL);
1367       if (!state)
1368         return;
1369
1370       finalStrLength = svalBuilder.evalBinOpNN(state, BO_Add, *srcStrLengthNL, 
1371                                                *dstStrLengthNL, sizeTy);
1372     }
1373
1374     // If we couldn't get a single value for the final string length,
1375     // we can at least bound it by the individual lengths.
1376     if (finalStrLength.isUnknown()) {
1377       // Try to get a "hypothetical" string length symbol, which we can later
1378       // set as a real value if that turns out to be the case.
1379       finalStrLength = getCStringLength(C, state, CE, DstVal, true);
1380       assert(!finalStrLength.isUndef());
1381
1382       if (NonLoc *finalStrLengthNL = dyn_cast<NonLoc>(&finalStrLength)) {
1383         if (srcStrLengthNL) {
1384           // finalStrLength >= srcStrLength
1385           SVal sourceInResult = svalBuilder.evalBinOpNN(state, BO_GE,
1386                                                         *finalStrLengthNL,
1387                                                         *srcStrLengthNL,
1388                                                         cmpTy);
1389           state = state->assume(cast<DefinedOrUnknownSVal>(sourceInResult),
1390                                 true);
1391           if (!state)
1392             return;
1393         }
1394
1395         if (dstStrLengthNL) {
1396           // finalStrLength >= dstStrLength
1397           SVal destInResult = svalBuilder.evalBinOpNN(state, BO_GE,
1398                                                       *finalStrLengthNL,
1399                                                       *dstStrLengthNL,
1400                                                       cmpTy);
1401           state = state->assume(cast<DefinedOrUnknownSVal>(destInResult),
1402                                 true);
1403           if (!state)
1404             return;
1405         }
1406       }
1407     }
1408
1409   } else {
1410     // Otherwise, this is a copy-over function (strcpy, strncpy, ...), and
1411     // the final string length will match the input string length.
1412     finalStrLength = amountCopied;
1413   }
1414
1415   // The final result of the function will either be a pointer past the last
1416   // copied element, or a pointer to the start of the destination buffer.
1417   SVal Result = (returnEnd ? UnknownVal() : DstVal);
1418
1419   assert(state);
1420
1421   // If the destination is a MemRegion, try to check for a buffer overflow and
1422   // record the new string length.
1423   if (loc::MemRegionVal *dstRegVal = dyn_cast<loc::MemRegionVal>(&DstVal)) {
1424     QualType ptrTy = Dst->getType();
1425
1426     // If we have an exact value on a bounded copy, use that to check for
1427     // overflows, rather than our estimate about how much is actually copied.
1428     if (boundWarning) {
1429       if (NonLoc *maxLastNL = dyn_cast<NonLoc>(&maxLastElementIndex)) {
1430         SVal maxLastElement = svalBuilder.evalBinOpLN(state, BO_Add, *dstRegVal,
1431                                                       *maxLastNL, ptrTy);
1432         state = CheckLocation(C, state, CE->getArg(2), maxLastElement, 
1433                               boundWarning);
1434         if (!state)
1435           return;
1436       }
1437     }
1438
1439     // Then, if the final length is known...
1440     if (NonLoc *knownStrLength = dyn_cast<NonLoc>(&finalStrLength)) {
1441       SVal lastElement = svalBuilder.evalBinOpLN(state, BO_Add, *dstRegVal,
1442                                                  *knownStrLength, ptrTy);
1443
1444       // ...and we haven't checked the bound, we'll check the actual copy.
1445       if (!boundWarning) {
1446         const char * const warningMsg =
1447           "String copy function overflows destination buffer";
1448         state = CheckLocation(C, state, Dst, lastElement, warningMsg);
1449         if (!state)
1450           return;
1451       }
1452
1453       // If this is a stpcpy-style copy, the last element is the return value.
1454       if (returnEnd)
1455         Result = lastElement;
1456     }
1457
1458     // Invalidate the destination. This must happen before we set the C string
1459     // length because invalidation will clear the length.
1460     // FIXME: Even if we can't perfectly model the copy, we should see if we
1461     // can use LazyCompoundVals to copy the source values into the destination.
1462     // This would probably remove any existing bindings past the end of the
1463     // string, but that's still an improvement over blank invalidation.
1464     state = InvalidateBuffer(C, state, Dst, *dstRegVal);
1465
1466     // Set the C string length of the destination, if we know it.
1467     if (isBounded && !isAppending) {
1468       // strncpy is annoying in that it doesn't guarantee to null-terminate
1469       // the result string. If the original string didn't fit entirely inside
1470       // the bound (including the null-terminator), we don't know how long the
1471       // result is.
1472       if (amountCopied != strLength)
1473         finalStrLength = UnknownVal();
1474     }
1475     state = setCStringLength(state, dstRegVal->getRegion(), finalStrLength);
1476   }
1477
1478   assert(state);
1479
1480   // If this is a stpcpy-style copy, but we were unable to check for a buffer
1481   // overflow, we still need a result. Conjure a return value.
1482   if (returnEnd && Result.isUnknown()) {
1483     unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
1484     Result = svalBuilder.getConjuredSymbolVal(NULL, CE, Count);
1485   }
1486
1487   // Set the return value.
1488   state = state->BindExpr(CE, Result);
1489   C.addTransition(state);
1490 }
1491
1492 void CStringChecker::evalStrcmp(CheckerContext &C, const CallExpr *CE) const {
1493   //int strcmp(const char *s1, const char *s2);
1494   evalStrcmpCommon(C, CE, /* isBounded = */ false, /* ignoreCase = */ false);
1495 }
1496
1497 void CStringChecker::evalStrncmp(CheckerContext &C, const CallExpr *CE) const {
1498   //int strncmp(const char *s1, const char *s2, size_t n);
1499   evalStrcmpCommon(C, CE, /* isBounded = */ true, /* ignoreCase = */ false);
1500 }
1501
1502 void CStringChecker::evalStrcasecmp(CheckerContext &C, 
1503                                     const CallExpr *CE) const {
1504   //int strcasecmp(const char *s1, const char *s2);
1505   evalStrcmpCommon(C, CE, /* isBounded = */ false, /* ignoreCase = */ true);
1506 }
1507
1508 void CStringChecker::evalStrncasecmp(CheckerContext &C, 
1509                                      const CallExpr *CE) const {
1510   //int strncasecmp(const char *s1, const char *s2, size_t n);
1511   evalStrcmpCommon(C, CE, /* isBounded = */ true, /* ignoreCase = */ true);
1512 }
1513
1514 void CStringChecker::evalStrcmpCommon(CheckerContext &C, const CallExpr *CE,
1515                                       bool isBounded, bool ignoreCase) const {
1516   CurrentFunctionDescription = "string comparison function";
1517   const GRState *state = C.getState();
1518
1519   // Check that the first string is non-null
1520   const Expr *s1 = CE->getArg(0);
1521   SVal s1Val = state->getSVal(s1);
1522   state = checkNonNull(C, state, s1, s1Val);
1523   if (!state)
1524     return;
1525
1526   // Check that the second string is non-null.
1527   const Expr *s2 = CE->getArg(1);
1528   SVal s2Val = state->getSVal(s2);
1529   state = checkNonNull(C, state, s2, s2Val);
1530   if (!state)
1531     return;
1532
1533   // Get the string length of the first string or give up.
1534   SVal s1Length = getCStringLength(C, state, s1, s1Val);
1535   if (s1Length.isUndef())
1536     return;
1537
1538   // Get the string length of the second string or give up.
1539   SVal s2Length = getCStringLength(C, state, s2, s2Val);
1540   if (s2Length.isUndef())
1541     return;
1542
1543   // If we know the two buffers are the same, we know the result is 0.
1544   // First, get the two buffers' addresses. Another checker will have already
1545   // made sure they're not undefined.
1546   DefinedOrUnknownSVal LV = cast<DefinedOrUnknownSVal>(s1Val);
1547   DefinedOrUnknownSVal RV = cast<DefinedOrUnknownSVal>(s2Val);
1548
1549   // See if they are the same.
1550   SValBuilder &svalBuilder = C.getSValBuilder();
1551   DefinedOrUnknownSVal SameBuf = svalBuilder.evalEQ(state, LV, RV);
1552   const GRState *StSameBuf, *StNotSameBuf;
1553   llvm::tie(StSameBuf, StNotSameBuf) = state->assume(SameBuf);
1554
1555   // If the two arguments might be the same buffer, we know the result is 0,
1556   // and we only need to check one size.
1557   if (StSameBuf) {
1558     StSameBuf = StSameBuf->BindExpr(CE, svalBuilder.makeZeroVal(CE->getType()));
1559     C.addTransition(StSameBuf);
1560
1561     // If the two arguments are GUARANTEED to be the same, we're done!
1562     if (!StNotSameBuf)
1563       return;
1564   }
1565
1566   assert(StNotSameBuf);
1567   state = StNotSameBuf;
1568
1569   // At this point we can go about comparing the two buffers.
1570   // For now, we only do this if they're both known string literals.
1571
1572   // Attempt to extract string literals from both expressions.
1573   const StringLiteral *s1StrLiteral = getCStringLiteral(C, state, s1, s1Val);
1574   const StringLiteral *s2StrLiteral = getCStringLiteral(C, state, s2, s2Val);
1575   bool canComputeResult = false;
1576
1577   if (s1StrLiteral && s2StrLiteral) {
1578     llvm::StringRef s1StrRef = s1StrLiteral->getString();
1579     llvm::StringRef s2StrRef = s2StrLiteral->getString();
1580
1581     if (isBounded) {
1582       // Get the max number of characters to compare.
1583       const Expr *lenExpr = CE->getArg(2);
1584       SVal lenVal = state->getSVal(lenExpr);
1585
1586       // If the length is known, we can get the right substrings.
1587       if (const llvm::APSInt *len = svalBuilder.getKnownValue(state, lenVal)) {
1588         // Create substrings of each to compare the prefix.
1589         s1StrRef = s1StrRef.substr(0, (size_t)len->getZExtValue());
1590         s2StrRef = s2StrRef.substr(0, (size_t)len->getZExtValue());
1591         canComputeResult = true;
1592       }
1593     } else {
1594       // This is a normal, unbounded strcmp.
1595       canComputeResult = true;
1596     }
1597
1598     if (canComputeResult) {
1599       // Real strcmp stops at null characters.
1600       size_t s1Term = s1StrRef.find('\0');
1601       if (s1Term != llvm::StringRef::npos)
1602         s1StrRef = s1StrRef.substr(0, s1Term);
1603
1604       size_t s2Term = s2StrRef.find('\0');
1605       if (s2Term != llvm::StringRef::npos)
1606         s2StrRef = s2StrRef.substr(0, s2Term);
1607
1608       // Use StringRef's comparison methods to compute the actual result.
1609       int result;
1610
1611       if (ignoreCase) {
1612         // Compare string 1 to string 2 the same way strcasecmp() does.
1613         result = s1StrRef.compare_lower(s2StrRef);
1614       } else {
1615         // Compare string 1 to string 2 the same way strcmp() does.
1616         result = s1StrRef.compare(s2StrRef);
1617       }
1618
1619       // Build the SVal of the comparison and bind the return value.
1620       SVal resultVal = svalBuilder.makeIntVal(result, CE->getType());
1621       state = state->BindExpr(CE, resultVal);
1622     }
1623   }
1624
1625   if (!canComputeResult) {
1626     // Conjure a symbolic value. It's the best we can do.
1627     unsigned Count = C.getNodeBuilder().getCurrentBlockCount();
1628     SVal resultVal = svalBuilder.getConjuredSymbolVal(NULL, CE, Count);
1629     state = state->BindExpr(CE, resultVal);
1630   }
1631
1632   // Record this as a possible path.
1633   C.addTransition(state);
1634 }
1635
1636 //===----------------------------------------------------------------------===//
1637 // The driver method, and other Checker callbacks.
1638 //===----------------------------------------------------------------------===//
1639
1640 bool CStringChecker::evalCall(const CallExpr *CE, CheckerContext &C) const {
1641   // Get the callee.  All the functions we care about are C functions
1642   // with simple identifiers.
1643   const GRState *state = C.getState();
1644   const Expr *Callee = CE->getCallee();
1645   const FunctionDecl *FD = state->getSVal(Callee).getAsFunctionDecl();
1646
1647   if (!FD)
1648     return false;
1649
1650   // Get the name of the callee. If it's a builtin, strip off the prefix.
1651   IdentifierInfo *II = FD->getIdentifier();
1652   if (!II)   // if no identifier, not a simple C function
1653     return false;
1654   llvm::StringRef Name = II->getName();
1655   if (Name.startswith("__builtin_"))
1656     Name = Name.substr(10);
1657
1658   FnCheck evalFunction = llvm::StringSwitch<FnCheck>(Name)
1659     .Cases("memcpy", "__memcpy_chk", &CStringChecker::evalMemcpy)
1660     .Cases("mempcpy", "__mempcpy_chk", &CStringChecker::evalMempcpy)
1661     .Cases("memcmp", "bcmp", &CStringChecker::evalMemcmp)
1662     .Cases("memmove", "__memmove_chk", &CStringChecker::evalMemmove)
1663     .Cases("strcpy", "__strcpy_chk", &CStringChecker::evalStrcpy)
1664     .Cases("strncpy", "__strncpy_chk", &CStringChecker::evalStrncpy)
1665     .Cases("stpcpy", "__stpcpy_chk", &CStringChecker::evalStpcpy)
1666     .Cases("strcat", "__strcat_chk", &CStringChecker::evalStrcat)
1667     .Cases("strncat", "__strncat_chk", &CStringChecker::evalStrncat)
1668     .Case("strlen", &CStringChecker::evalstrLength)
1669     .Case("strnlen", &CStringChecker::evalstrnLength)
1670     .Case("strcmp", &CStringChecker::evalStrcmp)
1671     .Case("strncmp", &CStringChecker::evalStrncmp)
1672     .Case("strcasecmp", &CStringChecker::evalStrcasecmp)
1673     .Case("strncasecmp", &CStringChecker::evalStrncasecmp)
1674     .Case("bcopy", &CStringChecker::evalBcopy)
1675     .Default(NULL);
1676
1677   // If the callee isn't a string function, let another checker handle it.
1678   if (!evalFunction)
1679     return false;
1680
1681   // Make sure each function sets its own description.
1682   // (But don't bother in a release build.)
1683   assert(!(CurrentFunctionDescription = NULL));
1684
1685   // Check and evaluate the call.
1686   (this->*evalFunction)(C, CE);
1687   return true;
1688 }
1689
1690 void CStringChecker::checkPreStmt(const DeclStmt *DS, CheckerContext &C) const {
1691   // Record string length for char a[] = "abc";
1692   const GRState *state = C.getState();
1693
1694   for (DeclStmt::const_decl_iterator I = DS->decl_begin(), E = DS->decl_end();
1695        I != E; ++I) {
1696     const VarDecl *D = dyn_cast<VarDecl>(*I);
1697     if (!D)
1698       continue;
1699
1700     // FIXME: Handle array fields of structs.
1701     if (!D->getType()->isArrayType())
1702       continue;
1703
1704     const Expr *Init = D->getInit();
1705     if (!Init)
1706       continue;
1707     if (!isa<StringLiteral>(Init))
1708       continue;
1709
1710     Loc VarLoc = state->getLValue(D, C.getPredecessor()->getLocationContext());
1711     const MemRegion *MR = VarLoc.getAsRegion();
1712     if (!MR)
1713       continue;
1714
1715     SVal StrVal = state->getSVal(Init);
1716     assert(StrVal.isValid() && "Initializer string is unknown or undefined");
1717     DefinedOrUnknownSVal strLength
1718       = cast<DefinedOrUnknownSVal>(getCStringLength(C, state, Init, StrVal));
1719
1720     state = state->set<CStringLength>(MR, strLength);
1721   }
1722
1723   C.addTransition(state);
1724 }
1725
1726 bool CStringChecker::wantsRegionChangeUpdate(const GRState *state) const {
1727   CStringLength::EntryMap Entries = state->get<CStringLength>();
1728   return !Entries.isEmpty();
1729 }
1730
1731 const GRState *
1732 CStringChecker::checkRegionChanges(const GRState *state,
1733                                    const StoreManager::InvalidatedSymbols *,
1734                                    const MemRegion * const *Begin,
1735                                    const MemRegion * const *End) const {
1736   CStringLength::EntryMap Entries = state->get<CStringLength>();
1737   if (Entries.isEmpty())
1738     return state;
1739
1740   llvm::SmallPtrSet<const MemRegion *, 8> Invalidated;
1741   llvm::SmallPtrSet<const MemRegion *, 32> SuperRegions;
1742
1743   // First build sets for the changed regions and their super-regions.
1744   for ( ; Begin != End; ++Begin) {
1745     const MemRegion *MR = *Begin;
1746     Invalidated.insert(MR);
1747
1748     SuperRegions.insert(MR);
1749     while (const SubRegion *SR = dyn_cast<SubRegion>(MR)) {
1750       MR = SR->getSuperRegion();
1751       SuperRegions.insert(MR);
1752     }
1753   }
1754
1755   CStringLength::EntryMap::Factory &F = state->get_context<CStringLength>();
1756
1757   // Then loop over the entries in the current state.
1758   for (CStringLength::EntryMap::iterator I = Entries.begin(),
1759        E = Entries.end(); I != E; ++I) {
1760     const MemRegion *MR = I.getKey();
1761
1762     // Is this entry for a super-region of a changed region?
1763     if (SuperRegions.count(MR)) {
1764       Entries = F.remove(Entries, MR);
1765       continue;
1766     }
1767
1768     // Is this entry for a sub-region of a changed region?
1769     const MemRegion *Super = MR;
1770     while (const SubRegion *SR = dyn_cast<SubRegion>(Super)) {
1771       Super = SR->getSuperRegion();
1772       if (Invalidated.count(Super)) {
1773         Entries = F.remove(Entries, MR);
1774         break;
1775       }
1776     }
1777   }
1778
1779   return state->set<CStringLength>(Entries);
1780 }
1781
1782 void CStringChecker::checkLiveSymbols(const GRState *state,
1783                                       SymbolReaper &SR) const {
1784   // Mark all symbols in our string length map as valid.
1785   CStringLength::EntryMap Entries = state->get<CStringLength>();
1786
1787   for (CStringLength::EntryMap::iterator I = Entries.begin(), E = Entries.end();
1788        I != E; ++I) {
1789     SVal Len = I.getData();
1790
1791     for (SVal::symbol_iterator si = Len.symbol_begin(), se = Len.symbol_end();
1792          si != se; ++si)
1793       SR.markInUse(*si);
1794   }
1795 }
1796
1797 void CStringChecker::checkDeadSymbols(SymbolReaper &SR,
1798                                       CheckerContext &C) const {
1799   if (!SR.hasDeadSymbols())
1800     return;
1801
1802   const GRState *state = C.getState();
1803   CStringLength::EntryMap Entries = state->get<CStringLength>();
1804   if (Entries.isEmpty())
1805     return;
1806
1807   CStringLength::EntryMap::Factory &F = state->get_context<CStringLength>();
1808   for (CStringLength::EntryMap::iterator I = Entries.begin(), E = Entries.end();
1809        I != E; ++I) {
1810     SVal Len = I.getData();
1811     if (SymbolRef Sym = Len.getAsSymbol()) {
1812       if (SR.isDead(Sym))
1813         Entries = F.remove(Entries, I.getKey());
1814     }
1815   }
1816
1817   state = state->set<CStringLength>(Entries);
1818   C.generateNode(state);
1819 }
1820
1821 void ento::registerCStringChecker(CheckerManager &mgr) {
1822   mgr.registerChecker<CStringChecker>();
1823 }