1 //=- AnalysisBasedWarnings.cpp - Sema warnings based on libAnalysis -*- C++ -*-=//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines analysis_warnings::[Policy,Executor].
10 // Together they are used by Sema to issue warnings based on inexpensive
11 // static analysis algorithms in libAnalysis.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "clang/Sema/AnalysisBasedWarnings.h"
16 #include "clang/AST/DeclCXX.h"
17 #include "clang/AST/DeclObjC.h"
18 #include "clang/AST/EvaluatedExprVisitor.h"
19 #include "clang/AST/ExprCXX.h"
20 #include "clang/AST/ExprObjC.h"
21 #include "clang/AST/ParentMap.h"
22 #include "clang/AST/RecursiveASTVisitor.h"
23 #include "clang/AST/StmtCXX.h"
24 #include "clang/AST/StmtObjC.h"
25 #include "clang/AST/StmtVisitor.h"
26 #include "clang/Analysis/Analyses/CFGReachabilityAnalysis.h"
27 #include "clang/Analysis/Analyses/Consumed.h"
28 #include "clang/Analysis/Analyses/ReachableCode.h"
29 #include "clang/Analysis/Analyses/ThreadSafety.h"
30 #include "clang/Analysis/Analyses/UninitializedValues.h"
31 #include "clang/Analysis/AnalysisDeclContext.h"
32 #include "clang/Analysis/CFG.h"
33 #include "clang/Analysis/CFGStmtMap.h"
34 #include "clang/Basic/SourceLocation.h"
35 #include "clang/Basic/SourceManager.h"
36 #include "clang/Lex/Preprocessor.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaInternal.h"
39 #include "llvm/ADT/BitVector.h"
40 #include "llvm/ADT/MapVector.h"
41 #include "llvm/ADT/SmallString.h"
42 #include "llvm/ADT/SmallVector.h"
43 #include "llvm/ADT/StringRef.h"
44 #include "llvm/Support/Casting.h"
45 #include <algorithm>
46 #include <deque>
47 #include <iterator>
48
49 using namespace clang;
50
51 //===----------------------------------------------------------------------===//
52 // Unreachable code analysis.
53 //===----------------------------------------------------------------------===//
54
55 namespace {
56 class UnreachableCodeHandler : public reachable_code::Callback {
57 Sema &S;
58 SourceRange PreviousSilenceableCondVal;
59
60 public:
UnreachableCodeHandler(Sema & s)61 UnreachableCodeHandler(Sema &s) : S(s) {}
62
HandleUnreachable(reachable_code::UnreachableKind UK,SourceLocation L,SourceRange SilenceableCondVal,SourceRange R1,SourceRange R2)63 void HandleUnreachable(reachable_code::UnreachableKind UK,
64 SourceLocation L,
65 SourceRange SilenceableCondVal,
66 SourceRange R1,
67 SourceRange R2) override {
68 // Avoid reporting multiple unreachable code diagnostics that are
69 // triggered by the same conditional value.
70 if (PreviousSilenceableCondVal.isValid() &&
71 SilenceableCondVal.isValid() &&
72 PreviousSilenceableCondVal == SilenceableCondVal)
73 return;
74 PreviousSilenceableCondVal = SilenceableCondVal;
75
76 unsigned diag = diag::warn_unreachable;
77 switch (UK) {
78 case reachable_code::UK_Break:
79 diag = diag::warn_unreachable_break;
80 break;
81 case reachable_code::UK_Return:
82 diag = diag::warn_unreachable_return;
83 break;
84 case reachable_code::UK_Loop_Increment:
85 diag = diag::warn_unreachable_loop_increment;
86 break;
87 case reachable_code::UK_Other:
88 break;
89 }
90
91 S.Diag(L, diag) << R1 << R2;
92
93 SourceLocation Open = SilenceableCondVal.getBegin();
94 if (Open.isValid()) {
95 SourceLocation Close = SilenceableCondVal.getEnd();
96 Close = S.getLocForEndOfToken(Close);
97 if (Close.isValid()) {
98 S.Diag(Open, diag::note_unreachable_silence)
99 << FixItHint::CreateInsertion(Open, "/* DISABLES CODE */ (")
100 << FixItHint::CreateInsertion(Close, ")");
101 }
102 }
103 }
104 };
105 } // anonymous namespace
106
107 /// CheckUnreachable - Check for unreachable code.
CheckUnreachable(Sema & S,AnalysisDeclContext & AC)108 static void CheckUnreachable(Sema &S, AnalysisDeclContext &AC) {
109 // As a heuristic prune all diagnostics not in the main file. Currently
110 // the majority of warnings in headers are false positives. These
111 // are largely caused by configuration state, e.g. preprocessor
112 // defined code, etc.
113 //
114 // Note that this is also a performance optimization. Analyzing
115 // headers many times can be expensive.
116 if (!S.getSourceManager().isInMainFile(AC.getDecl()->getBeginLoc()))
117 return;
118
119 UnreachableCodeHandler UC(S);
120 reachable_code::FindUnreachableCode(AC, S.getPreprocessor(), UC);
121 }
122
123 namespace {
124 /// Warn on logical operator errors in CFGBuilder
125 class LogicalErrorHandler : public CFGCallback {
126 Sema &S;
127
128 public:
LogicalErrorHandler(Sema & S)129 LogicalErrorHandler(Sema &S) : CFGCallback(), S(S) {}
130
HasMacroID(const Expr * E)131 static bool HasMacroID(const Expr *E) {
132 if (E->getExprLoc().isMacroID())
133 return true;
134
135 // Recurse to children.
136 for (const Stmt *SubStmt : E->children())
137 if (const Expr *SubExpr = dyn_cast_or_null<Expr>(SubStmt))
138 if (HasMacroID(SubExpr))
139 return true;
140
141 return false;
142 }
143
compareAlwaysTrue(const BinaryOperator * B,bool isAlwaysTrue)144 void compareAlwaysTrue(const BinaryOperator *B, bool isAlwaysTrue) override {
145 if (HasMacroID(B))
146 return;
147
148 SourceRange DiagRange = B->getSourceRange();
149 S.Diag(B->getExprLoc(), diag::warn_tautological_overlap_comparison)
150 << DiagRange << isAlwaysTrue;
151 }
152
compareBitwiseEquality(const BinaryOperator * B,bool isAlwaysTrue)153 void compareBitwiseEquality(const BinaryOperator *B,
154 bool isAlwaysTrue) override {
155 if (HasMacroID(B))
156 return;
157
158 SourceRange DiagRange = B->getSourceRange();
159 S.Diag(B->getExprLoc(), diag::warn_comparison_bitwise_always)
160 << DiagRange << isAlwaysTrue;
161 }
162
compareBitwiseOr(const BinaryOperator * B)163 void compareBitwiseOr(const BinaryOperator *B) override {
164 if (HasMacroID(B))
165 return;
166
167 SourceRange DiagRange = B->getSourceRange();
168 S.Diag(B->getExprLoc(), diag::warn_comparison_bitwise_or) << DiagRange;
169 }
170
hasActiveDiagnostics(DiagnosticsEngine & Diags,SourceLocation Loc)171 static bool hasActiveDiagnostics(DiagnosticsEngine &Diags,
172 SourceLocation Loc) {
173 return !Diags.isIgnored(diag::warn_tautological_overlap_comparison, Loc) ||
174 !Diags.isIgnored(diag::warn_comparison_bitwise_or, Loc);
175 }
176 };
177 } // anonymous namespace
178
179 //===----------------------------------------------------------------------===//
180 // Check for infinite self-recursion in functions
181 //===----------------------------------------------------------------------===//
182
183 // Returns true if the function is called anywhere within the CFGBlock.
184 // For member functions, the additional condition of being call from the
185 // this pointer is required.
hasRecursiveCallInPath(const FunctionDecl * FD,CFGBlock & Block)186 static bool hasRecursiveCallInPath(const FunctionDecl *FD, CFGBlock &Block) {
187 // Process all the Stmt's in this block to find any calls to FD.
188 for (const auto &B : Block) {
189 if (B.getKind() != CFGElement::Statement)
190 continue;
191
192 const CallExpr *CE = dyn_cast<CallExpr>(B.getAs<CFGStmt>()->getStmt());
193 if (!CE || !CE->getCalleeDecl() ||
194 CE->getCalleeDecl()->getCanonicalDecl() != FD)
195 continue;
196
197 // Skip function calls which are qualified with a templated class.
198 if (const DeclRefExpr *DRE =
199 dyn_cast<DeclRefExpr>(CE->getCallee()->IgnoreParenImpCasts())) {
200 if (NestedNameSpecifier *NNS = DRE->getQualifier()) {
201 if (NNS->getKind() == NestedNameSpecifier::TypeSpec &&
202 isa<TemplateSpecializationType>(NNS->getAsType())) {
203 continue;
204 }
205 }
206 }
207
208 const CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(CE);
209 if (!MCE || isa<CXXThisExpr>(MCE->getImplicitObjectArgument()) ||
210 !MCE->getMethodDecl()->isVirtual())
211 return true;
212 }
213 return false;
214 }
215
216 // Returns true if every path from the entry block passes through a call to FD.
checkForRecursiveFunctionCall(const FunctionDecl * FD,CFG * cfg)217 static bool checkForRecursiveFunctionCall(const FunctionDecl *FD, CFG *cfg) {
218 llvm::SmallPtrSet<CFGBlock *, 16> Visited;
219 llvm::SmallVector<CFGBlock *, 16> WorkList;
220 // Keep track of whether we found at least one recursive path.
221 bool foundRecursion = false;
222
223 const unsigned ExitID = cfg->getExit().getBlockID();
224
225 // Seed the work list with the entry block.
226 WorkList.push_back(&cfg->getEntry());
227
228 while (!WorkList.empty()) {
229 CFGBlock *Block = WorkList.pop_back_val();
230
231 for (auto I = Block->succ_begin(), E = Block->succ_end(); I != E; ++I) {
232 if (CFGBlock *SuccBlock = *I) {
233 if (!Visited.insert(SuccBlock).second)
234 continue;
235
236 // Found a path to the exit node without a recursive call.
237 if (ExitID == SuccBlock->getBlockID())
238 return false;
239
240 // If the successor block contains a recursive call, end analysis there.
241 if (hasRecursiveCallInPath(FD, *SuccBlock)) {
242 foundRecursion = true;
243 continue;
244 }
245
246 WorkList.push_back(SuccBlock);
247 }
248 }
249 }
250 return foundRecursion;
251 }
252
checkRecursiveFunction(Sema & S,const FunctionDecl * FD,const Stmt * Body,AnalysisDeclContext & AC)253 static void checkRecursiveFunction(Sema &S, const FunctionDecl *FD,
254 const Stmt *Body, AnalysisDeclContext &AC) {
255 FD = FD->getCanonicalDecl();
256
257 // Only run on non-templated functions and non-templated members of
258 // templated classes.
259 if (FD->getTemplatedKind() != FunctionDecl::TK_NonTemplate &&
260 FD->getTemplatedKind() != FunctionDecl::TK_MemberSpecialization)
261 return;
262
263 CFG *cfg = AC.getCFG();
264 if (!cfg) return;
265
266 // If the exit block is unreachable, skip processing the function.
267 if (cfg->getExit().pred_empty())
268 return;
269
270 // Emit diagnostic if a recursive function call is detected for all paths.
271 if (checkForRecursiveFunctionCall(FD, cfg))
272 S.Diag(Body->getBeginLoc(), diag::warn_infinite_recursive_function);
273 }
274
275 //===----------------------------------------------------------------------===//
276 // Check for throw in a non-throwing function.
277 //===----------------------------------------------------------------------===//
278
279 /// Determine whether an exception thrown by E, unwinding from ThrowBlock,
280 /// can reach ExitBlock.
throwEscapes(Sema & S,const CXXThrowExpr * E,CFGBlock & ThrowBlock,CFG * Body)281 static bool throwEscapes(Sema &S, const CXXThrowExpr *E, CFGBlock &ThrowBlock,
282 CFG *Body) {
283 SmallVector<CFGBlock *, 16> Stack;
284 llvm::BitVector Queued(Body->getNumBlockIDs());
285
286 Stack.push_back(&ThrowBlock);
287 Queued[ThrowBlock.getBlockID()] = true;
288
289 while (!Stack.empty()) {
290 CFGBlock &UnwindBlock = *Stack.back();
291 Stack.pop_back();
292
293 for (auto &Succ : UnwindBlock.succs()) {
294 if (!Succ.isReachable() || Queued[Succ->getBlockID()])
295 continue;
296
297 if (Succ->getBlockID() == Body->getExit().getBlockID())
298 return true;
299
300 if (auto *Catch =
301 dyn_cast_or_null<CXXCatchStmt>(Succ->getLabel())) {
302 QualType Caught = Catch->getCaughtType();
303 if (Caught.isNull() || // catch (...) catches everything
304 !E->getSubExpr() || // throw; is considered cuaght by any handler
305 S.handlerCanCatch(Caught, E->getSubExpr()->getType()))
306 // Exception doesn't escape via this path.
307 break;
308 } else {
309 Stack.push_back(Succ);
310 Queued[Succ->getBlockID()] = true;
311 }
312 }
313 }
314
315 return false;
316 }
317
visitReachableThrows(CFG * BodyCFG,llvm::function_ref<void (const CXXThrowExpr *,CFGBlock &)> Visit)318 static void visitReachableThrows(
319 CFG *BodyCFG,
320 llvm::function_ref<void(const CXXThrowExpr *, CFGBlock &)> Visit) {
321 llvm::BitVector Reachable(BodyCFG->getNumBlockIDs());
322 clang::reachable_code::ScanReachableFromBlock(&BodyCFG->getEntry(), Reachable);
323 for (CFGBlock *B : *BodyCFG) {
324 if (!Reachable[B->getBlockID()])
325 continue;
326 for (CFGElement &E : *B) {
327 Optional<CFGStmt> S = E.getAs<CFGStmt>();
328 if (!S)
329 continue;
330 if (auto *Throw = dyn_cast<CXXThrowExpr>(S->getStmt()))
331 Visit(Throw, *B);
332 }
333 }
334 }
335
EmitDiagForCXXThrowInNonThrowingFunc(Sema & S,SourceLocation OpLoc,const FunctionDecl * FD)336 static void EmitDiagForCXXThrowInNonThrowingFunc(Sema &S, SourceLocation OpLoc,
337 const FunctionDecl *FD) {
338 if (!S.getSourceManager().isInSystemHeader(OpLoc) &&
339 FD->getTypeSourceInfo()) {
340 S.Diag(OpLoc, diag::warn_throw_in_noexcept_func) << FD;
341 if (S.getLangOpts().CPlusPlus11 &&
342 (isa<CXXDestructorDecl>(FD) ||
343 FD->getDeclName().getCXXOverloadedOperator() == OO_Delete ||
344 FD->getDeclName().getCXXOverloadedOperator() == OO_Array_Delete)) {
345 if (const auto *Ty = FD->getTypeSourceInfo()->getType()->
346 getAs<FunctionProtoType>())
347 S.Diag(FD->getLocation(), diag::note_throw_in_dtor)
348 << !isa<CXXDestructorDecl>(FD) << !Ty->hasExceptionSpec()
349 << FD->getExceptionSpecSourceRange();
350 } else
351 S.Diag(FD->getLocation(), diag::note_throw_in_function)
352 << FD->getExceptionSpecSourceRange();
353 }
354 }
355
checkThrowInNonThrowingFunc(Sema & S,const FunctionDecl * FD,AnalysisDeclContext & AC)356 static void checkThrowInNonThrowingFunc(Sema &S, const FunctionDecl *FD,
357 AnalysisDeclContext &AC) {
358 CFG *BodyCFG = AC.getCFG();
359 if (!BodyCFG)
360 return;
361 if (BodyCFG->getExit().pred_empty())
362 return;
363 visitReachableThrows(BodyCFG, [&](const CXXThrowExpr *Throw, CFGBlock &Block) {
364 if (throwEscapes(S, Throw, Block, BodyCFG))
365 EmitDiagForCXXThrowInNonThrowingFunc(S, Throw->getThrowLoc(), FD);
366 });
367 }
368
isNoexcept(const FunctionDecl * FD)369 static bool isNoexcept(const FunctionDecl *FD) {
370 const auto *FPT = FD->getType()->castAs<FunctionProtoType>();
371 if (FPT->isNothrow() || FD->hasAttr<NoThrowAttr>())
372 return true;
373 return false;
374 }
375
376 //===----------------------------------------------------------------------===//
377 // Check for missing return value.
378 //===----------------------------------------------------------------------===//
379
380 enum ControlFlowKind {
381 UnknownFallThrough,
382 NeverFallThrough,
383 MaybeFallThrough,
384 AlwaysFallThrough,
385 NeverFallThroughOrReturn
386 };
387
388 /// CheckFallThrough - Check that we don't fall off the end of a
389 /// Statement that should return a value.
390 ///
391 /// \returns AlwaysFallThrough iff we always fall off the end of the statement,
392 /// MaybeFallThrough iff we might or might not fall off the end,
393 /// NeverFallThroughOrReturn iff we never fall off the end of the statement or
394 /// return. We assume NeverFallThrough iff we never fall off the end of the
395 /// statement but we may return. We assume that functions not marked noreturn
396 /// will return.
CheckFallThrough(AnalysisDeclContext & AC)397 static ControlFlowKind CheckFallThrough(AnalysisDeclContext &AC) {
398 CFG *cfg = AC.getCFG();
399 if (!cfg) return UnknownFallThrough;
400
401 // The CFG leaves in dead things, and we don't want the dead code paths to
402 // confuse us, so we mark all live things first.
403 llvm::BitVector live(cfg->getNumBlockIDs());
404 unsigned count = reachable_code::ScanReachableFromBlock(&cfg->getEntry(),
405 live);
406
407 bool AddEHEdges = AC.getAddEHEdges();
408 if (!AddEHEdges && count != cfg->getNumBlockIDs())
409 // When there are things remaining dead, and we didn't add EH edges
410 // from CallExprs to the catch clauses, we have to go back and
411 // mark them as live.
412 for (const auto *B : *cfg) {
413 if (!live[B->getBlockID()]) {
414 if (B->pred_begin() == B->pred_end()) {
415 const Stmt *Term = B->getTerminatorStmt();
416 if (Term && isa<CXXTryStmt>(Term))
417 // When not adding EH edges from calls, catch clauses
418 // can otherwise seem dead. Avoid noting them as dead.
419 count += reachable_code::ScanReachableFromBlock(B, live);
420 continue;
421 }
422 }
423 }
424
425 // Now we know what is live, we check the live precessors of the exit block
426 // and look for fall through paths, being careful to ignore normal returns,
427 // and exceptional paths.
428 bool HasLiveReturn = false;
429 bool HasFakeEdge = false;
430 bool HasPlainEdge = false;
431 bool HasAbnormalEdge = false;
432
433 // Ignore default cases that aren't likely to be reachable because all
434 // enums in a switch(X) have explicit case statements.
435 CFGBlock::FilterOptions FO;
436 FO.IgnoreDefaultsWithCoveredEnums = 1;
437
438 for (CFGBlock::filtered_pred_iterator I =
439 cfg->getExit().filtered_pred_start_end(FO);
440 I.hasMore(); ++I) {
441 const CFGBlock &B = **I;
442 if (!live[B.getBlockID()])
443 continue;
444
445 // Skip blocks which contain an element marked as no-return. They don't
446 // represent actually viable edges into the exit block, so mark them as
447 // abnormal.
448 if (B.hasNoReturnElement()) {
449 HasAbnormalEdge = true;
450 continue;
451 }
452
453 // Destructors can appear after the 'return' in the CFG. This is
454 // normal. We need to look pass the destructors for the return
455 // statement (if it exists).
456 CFGBlock::const_reverse_iterator ri = B.rbegin(), re = B.rend();
457
458 for ( ; ri != re ; ++ri)
459 if (ri->getAs<CFGStmt>())
460 break;
461
462 // No more CFGElements in the block?
463 if (ri == re) {
464 const Stmt *Term = B.getTerminatorStmt();
465 if (Term && isa<CXXTryStmt>(Term)) {
466 HasAbnormalEdge = true;
467 continue;
468 }
469 // A labeled empty statement, or the entry block...
470 HasPlainEdge = true;
471 continue;
472 }
473
474 CFGStmt CS = ri->castAs<CFGStmt>();
475 const Stmt *S = CS.getStmt();
476 if (isa<ReturnStmt>(S) || isa<CoreturnStmt>(S)) {
477 HasLiveReturn = true;
478 continue;
479 }
480 if (isa<ObjCAtThrowStmt>(S)) {
481 HasFakeEdge = true;
482 continue;
483 }
484 if (isa<CXXThrowExpr>(S)) {
485 HasFakeEdge = true;
486 continue;
487 }
488 if (isa<MSAsmStmt>(S)) {
489 // TODO: Verify this is correct.
490 HasFakeEdge = true;
491 HasLiveReturn = true;
492 continue;
493 }
494 if (isa<CXXTryStmt>(S)) {
495 HasAbnormalEdge = true;
496 continue;
497 }
498 if (std::find(B.succ_begin(), B.succ_end(), &cfg->getExit())
499 == B.succ_end()) {
500 HasAbnormalEdge = true;
501 continue;
502 }
503
504 HasPlainEdge = true;
505 }
506 if (!HasPlainEdge) {
507 if (HasLiveReturn)
508 return NeverFallThrough;
509 return NeverFallThroughOrReturn;
510 }
511 if (HasAbnormalEdge || HasFakeEdge || HasLiveReturn)
512 return MaybeFallThrough;
513 // This says AlwaysFallThrough for calls to functions that are not marked
514 // noreturn, that don't return. If people would like this warning to be more
515 // accurate, such functions should be marked as noreturn.
516 return AlwaysFallThrough;
517 }
518
519 namespace {
520
521 struct CheckFallThroughDiagnostics {
522 unsigned diag_MaybeFallThrough_HasNoReturn;
523 unsigned diag_MaybeFallThrough_ReturnsNonVoid;
524 unsigned diag_AlwaysFallThrough_HasNoReturn;
525 unsigned diag_AlwaysFallThrough_ReturnsNonVoid;
526 unsigned diag_NeverFallThroughOrReturn;
527 enum { Function, Block, Lambda, Coroutine } funMode;
528 SourceLocation FuncLoc;
529
MakeForFunction__anone026b1520411::CheckFallThroughDiagnostics530 static CheckFallThroughDiagnostics MakeForFunction(const Decl *Func) {
531 CheckFallThroughDiagnostics D;
532 D.FuncLoc = Func->getLocation();
533 D.diag_MaybeFallThrough_HasNoReturn =
534 diag::warn_falloff_noreturn_function;
535 D.diag_MaybeFallThrough_ReturnsNonVoid =
536 diag::warn_maybe_falloff_nonvoid_function;
537 D.diag_AlwaysFallThrough_HasNoReturn =
538 diag::warn_falloff_noreturn_function;
539 D.diag_AlwaysFallThrough_ReturnsNonVoid =
540 diag::warn_falloff_nonvoid_function;
541
542 // Don't suggest that virtual functions be marked "noreturn", since they
543 // might be overridden by non-noreturn functions.
544 bool isVirtualMethod = false;
545 if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Func))
546 isVirtualMethod = Method->isVirtual();
547
548 // Don't suggest that template instantiations be marked "noreturn"
549 bool isTemplateInstantiation = false;
550 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(Func))
551 isTemplateInstantiation = Function->isTemplateInstantiation();
552
553 if (!isVirtualMethod && !isTemplateInstantiation)
554 D.diag_NeverFallThroughOrReturn =
555 diag::warn_suggest_noreturn_function;
556 else
557 D.diag_NeverFallThroughOrReturn = 0;
558
559 D.funMode = Function;
560 return D;
561 }
562
MakeForCoroutine__anone026b1520411::CheckFallThroughDiagnostics563 static CheckFallThroughDiagnostics MakeForCoroutine(const Decl *Func) {
564 CheckFallThroughDiagnostics D;
565 D.FuncLoc = Func->getLocation();
566 D.diag_MaybeFallThrough_HasNoReturn = 0;
567 D.diag_MaybeFallThrough_ReturnsNonVoid =
568 diag::warn_maybe_falloff_nonvoid_coroutine;
569 D.diag_AlwaysFallThrough_HasNoReturn = 0;
570 D.diag_AlwaysFallThrough_ReturnsNonVoid =
571 diag::warn_falloff_nonvoid_coroutine;
572 D.funMode = Coroutine;
573 return D;
574 }
575
MakeForBlock__anone026b1520411::CheckFallThroughDiagnostics576 static CheckFallThroughDiagnostics MakeForBlock() {
577 CheckFallThroughDiagnostics D;
578 D.diag_MaybeFallThrough_HasNoReturn =
579 diag::err_noreturn_block_has_return_expr;
580 D.diag_MaybeFallThrough_ReturnsNonVoid =
581 diag::err_maybe_falloff_nonvoid_block;
582 D.diag_AlwaysFallThrough_HasNoReturn =
583 diag::err_noreturn_block_has_return_expr;
584 D.diag_AlwaysFallThrough_ReturnsNonVoid =
585 diag::err_falloff_nonvoid_block;
586 D.diag_NeverFallThroughOrReturn = 0;
587 D.funMode = Block;
588 return D;
589 }
590
MakeForLambda__anone026b1520411::CheckFallThroughDiagnostics591 static CheckFallThroughDiagnostics MakeForLambda() {
592 CheckFallThroughDiagnostics D;
593 D.diag_MaybeFallThrough_HasNoReturn =
594 diag::err_noreturn_lambda_has_return_expr;
595 D.diag_MaybeFallThrough_ReturnsNonVoid =
596 diag::warn_maybe_falloff_nonvoid_lambda;
597 D.diag_AlwaysFallThrough_HasNoReturn =
598 diag::err_noreturn_lambda_has_return_expr;
599 D.diag_AlwaysFallThrough_ReturnsNonVoid =
600 diag::warn_falloff_nonvoid_lambda;
601 D.diag_NeverFallThroughOrReturn = 0;
602 D.funMode = Lambda;
603 return D;
604 }
605
checkDiagnostics__anone026b1520411::CheckFallThroughDiagnostics606 bool checkDiagnostics(DiagnosticsEngine &D, bool ReturnsVoid,
607 bool HasNoReturn) const {
608 if (funMode == Function) {
609 return (ReturnsVoid ||
610 D.isIgnored(diag::warn_maybe_falloff_nonvoid_function,
611 FuncLoc)) &&
612 (!HasNoReturn ||
613 D.isIgnored(diag::warn_noreturn_function_has_return_expr,
614 FuncLoc)) &&
615 (!ReturnsVoid ||
616 D.isIgnored(diag::warn_suggest_noreturn_block, FuncLoc));
617 }
618 if (funMode == Coroutine) {
619 return (ReturnsVoid ||
620 D.isIgnored(diag::warn_maybe_falloff_nonvoid_function, FuncLoc) ||
621 D.isIgnored(diag::warn_maybe_falloff_nonvoid_coroutine,
622 FuncLoc)) &&
623 (!HasNoReturn);
624 }
625 // For blocks / lambdas.
626 return ReturnsVoid && !HasNoReturn;
627 }
628 };
629
630 } // anonymous namespace
631
632 /// CheckFallThroughForBody - Check that we don't fall off the end of a
633 /// function that should return a value. Check that we don't fall off the end
634 /// of a noreturn function. We assume that functions and blocks not marked
635 /// noreturn will return.
CheckFallThroughForBody(Sema & S,const Decl * D,const Stmt * Body,QualType BlockType,const CheckFallThroughDiagnostics & CD,AnalysisDeclContext & AC,sema::FunctionScopeInfo * FSI)636 static void CheckFallThroughForBody(Sema &S, const Decl *D, const Stmt *Body,
637 QualType BlockType,
638 const CheckFallThroughDiagnostics &CD,
639 AnalysisDeclContext &AC,
640 sema::FunctionScopeInfo *FSI) {
641
642 bool ReturnsVoid = false;
643 bool HasNoReturn = false;
644 bool IsCoroutine = FSI->isCoroutine();
645
646 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
647 if (const auto *CBody = dyn_cast<CoroutineBodyStmt>(Body))
648 ReturnsVoid = CBody->getFallthroughHandler() != nullptr;
649 else
650 ReturnsVoid = FD->getReturnType()->isVoidType();
651 HasNoReturn = FD->isNoReturn();
652 }
653 else if (const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
654 ReturnsVoid = MD->getReturnType()->isVoidType();
655 HasNoReturn = MD->hasAttr<NoReturnAttr>();
656 }
657 else if (isa<BlockDecl>(D)) {
658 if (const FunctionType *FT =
659 BlockType->getPointeeType()->getAs<FunctionType>()) {
660 if (FT->getReturnType()->isVoidType())
661 ReturnsVoid = true;
662 if (FT->getNoReturnAttr())
663 HasNoReturn = true;
664 }
665 }
666
667 DiagnosticsEngine &Diags = S.getDiagnostics();
668
669 // Short circuit for compilation speed.
670 if (CD.checkDiagnostics(Diags, ReturnsVoid, HasNoReturn))
671 return;
672 SourceLocation LBrace = Body->getBeginLoc(), RBrace = Body->getEndLoc();
673 auto EmitDiag = [&](SourceLocation Loc, unsigned DiagID) {
674 if (IsCoroutine)
675 S.Diag(Loc, DiagID) << FSI->CoroutinePromise->getType();
676 else
677 S.Diag(Loc, DiagID);
678 };
679
680 // cpu_dispatch functions permit empty function bodies for ICC compatibility.
681 if (D->getAsFunction() && D->getAsFunction()->isCPUDispatchMultiVersion())
682 return;
683
684 // Either in a function body compound statement, or a function-try-block.
685 switch (CheckFallThrough(AC)) {
686 case UnknownFallThrough:
687 break;
688
689 case MaybeFallThrough:
690 if (HasNoReturn)
691 EmitDiag(RBrace, CD.diag_MaybeFallThrough_HasNoReturn);
692 else if (!ReturnsVoid)
693 EmitDiag(RBrace, CD.diag_MaybeFallThrough_ReturnsNonVoid);
694 break;
695 case AlwaysFallThrough:
696 if (HasNoReturn)
697 EmitDiag(RBrace, CD.diag_AlwaysFallThrough_HasNoReturn);
698 else if (!ReturnsVoid)
699 EmitDiag(RBrace, CD.diag_AlwaysFallThrough_ReturnsNonVoid);
700 break;
701 case NeverFallThroughOrReturn:
702 if (ReturnsVoid && !HasNoReturn && CD.diag_NeverFallThroughOrReturn) {
703 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
704 S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn) << 0 << FD;
705 } else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
706 S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn) << 1 << MD;
707 } else {
708 S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn);
709 }
710 }
711 break;
712 case NeverFallThrough:
713 break;
714 }
715 }
716
717 //===----------------------------------------------------------------------===//
718 // -Wuninitialized
719 //===----------------------------------------------------------------------===//
720
721 namespace {
722 /// ContainsReference - A visitor class to search for references to
723 /// a particular declaration (the needle) within any evaluated component of an
724 /// expression (recursively).
725 class ContainsReference : public ConstEvaluatedExprVisitor<ContainsReference> {
726 bool FoundReference;
727 const DeclRefExpr *Needle;
728
729 public:
730 typedef ConstEvaluatedExprVisitor<ContainsReference> Inherited;
731
ContainsReference(ASTContext & Context,const DeclRefExpr * Needle)732 ContainsReference(ASTContext &Context, const DeclRefExpr *Needle)
733 : Inherited(Context), FoundReference(false), Needle(Needle) {}
734
VisitExpr(const Expr * E)735 void VisitExpr(const Expr *E) {
736 // Stop evaluating if we already have a reference.
737 if (FoundReference)
738 return;
739
740 Inherited::VisitExpr(E);
741 }
742
VisitDeclRefExpr(const DeclRefExpr * E)743 void VisitDeclRefExpr(const DeclRefExpr *E) {
744 if (E == Needle)
745 FoundReference = true;
746 else
747 Inherited::VisitDeclRefExpr(E);
748 }
749
doesContainReference() const750 bool doesContainReference() const { return FoundReference; }
751 };
752 } // anonymous namespace
753
SuggestInitializationFixit(Sema & S,const VarDecl * VD)754 static bool SuggestInitializationFixit(Sema &S, const VarDecl *VD) {
755 QualType VariableTy = VD->getType().getCanonicalType();
756 if (VariableTy->isBlockPointerType() &&
757 !VD->hasAttr<BlocksAttr>()) {
758 S.Diag(VD->getLocation(), diag::note_block_var_fixit_add_initialization)
759 << VD->getDeclName()
760 << FixItHint::CreateInsertion(VD->getLocation(), "__block ");
761 return true;
762 }
763
764 // Don't issue a fixit if there is already an initializer.
765 if (VD->getInit())
766 return false;
767
768 // Don't suggest a fixit inside macros.
769 if (VD->getEndLoc().isMacroID())
770 return false;
771
772 SourceLocation Loc = S.getLocForEndOfToken(VD->getEndLoc());
773
774 // Suggest possible initialization (if any).
775 std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc);
776 if (Init.empty())
777 return false;
778
779 S.Diag(Loc, diag::note_var_fixit_add_initialization) << VD->getDeclName()
780 << FixItHint::CreateInsertion(Loc, Init);
781 return true;
782 }
783
784 /// Create a fixit to remove an if-like statement, on the assumption that its
785 /// condition is CondVal.
CreateIfFixit(Sema & S,const Stmt * If,const Stmt * Then,const Stmt * Else,bool CondVal,FixItHint & Fixit1,FixItHint & Fixit2)786 static void CreateIfFixit(Sema &S, const Stmt *If, const Stmt *Then,
787 const Stmt *Else, bool CondVal,
788 FixItHint &Fixit1, FixItHint &Fixit2) {
789 if (CondVal) {
790 // If condition is always true, remove all but the 'then'.
791 Fixit1 = FixItHint::CreateRemoval(
792 CharSourceRange::getCharRange(If->getBeginLoc(), Then->getBeginLoc()));
793 if (Else) {
794 SourceLocation ElseKwLoc = S.getLocForEndOfToken(Then->getEndLoc());
795 Fixit2 =
796 FixItHint::CreateRemoval(SourceRange(ElseKwLoc, Else->getEndLoc()));
797 }
798 } else {
799 // If condition is always false, remove all but the 'else'.
800 if (Else)
801 Fixit1 = FixItHint::CreateRemoval(CharSourceRange::getCharRange(
802 If->getBeginLoc(), Else->getBeginLoc()));
803 else
804 Fixit1 = FixItHint::CreateRemoval(If->getSourceRange());
805 }
806 }
807
808 /// DiagUninitUse -- Helper function to produce a diagnostic for an
809 /// uninitialized use of a variable.
DiagUninitUse(Sema & S,const VarDecl * VD,const UninitUse & Use,bool IsCapturedByBlock)810 static void DiagUninitUse(Sema &S, const VarDecl *VD, const UninitUse &Use,
811 bool IsCapturedByBlock) {
812 bool Diagnosed = false;
813
814 switch (Use.getKind()) {
815 case UninitUse::Always:
816 S.Diag(Use.getUser()->getBeginLoc(), diag::warn_uninit_var)
817 << VD->getDeclName() << IsCapturedByBlock
818 << Use.getUser()->getSourceRange();
819 return;
820
821 case UninitUse::AfterDecl:
822 case UninitUse::AfterCall:
823 S.Diag(VD->getLocation(), diag::warn_sometimes_uninit_var)
824 << VD->getDeclName() << IsCapturedByBlock
825 << (Use.getKind() == UninitUse::AfterDecl ? 4 : 5)
826 << const_cast<DeclContext*>(VD->getLexicalDeclContext())
827 << VD->getSourceRange();
828 S.Diag(Use.getUser()->getBeginLoc(), diag::note_uninit_var_use)
829 << IsCapturedByBlock << Use.getUser()->getSourceRange();
830 return;
831
832 case UninitUse::Maybe:
833 case UninitUse::Sometimes:
834 // Carry on to report sometimes-uninitialized branches, if possible,
835 // or a 'may be used uninitialized' diagnostic otherwise.
836 break;
837 }
838
839 // Diagnose each branch which leads to a sometimes-uninitialized use.
840 for (UninitUse::branch_iterator I = Use.branch_begin(), E = Use.branch_end();
841 I != E; ++I) {
842 assert(Use.getKind() == UninitUse::Sometimes);
843
844 const Expr *User = Use.getUser();
845 const Stmt *Term = I->Terminator;
846
847 // Information used when building the diagnostic.
848 unsigned DiagKind;
849 StringRef Str;
850 SourceRange Range;
851
852 // FixIts to suppress the diagnostic by removing the dead condition.
853 // For all binary terminators, branch 0 is taken if the condition is true,
854 // and branch 1 is taken if the condition is false.
855 int RemoveDiagKind = -1;
856 const char *FixitStr =
857 S.getLangOpts().CPlusPlus ? (I->Output ? "true" : "false")
858 : (I->Output ? "1" : "0");
859 FixItHint Fixit1, Fixit2;
860
861 switch (Term ? Term->getStmtClass() : Stmt::DeclStmtClass) {
862 default:
863 // Don't know how to report this. Just fall back to 'may be used
864 // uninitialized'. FIXME: Can this happen?
865 continue;
866
867 // "condition is true / condition is false".
868 case Stmt::IfStmtClass: {
869 const IfStmt *IS = cast<IfStmt>(Term);
870 DiagKind = 0;
871 Str = "if";
872 Range = IS->getCond()->getSourceRange();
873 RemoveDiagKind = 0;
874 CreateIfFixit(S, IS, IS->getThen(), IS->getElse(),
875 I->Output, Fixit1, Fixit2);
876 break;
877 }
878 case Stmt::ConditionalOperatorClass: {
879 const ConditionalOperator *CO = cast<ConditionalOperator>(Term);
880 DiagKind = 0;
881 Str = "?:";
882 Range = CO->getCond()->getSourceRange();
883 RemoveDiagKind = 0;
884 CreateIfFixit(S, CO, CO->getTrueExpr(), CO->getFalseExpr(),
885 I->Output, Fixit1, Fixit2);
886 break;
887 }
888 case Stmt::BinaryOperatorClass: {
889 const BinaryOperator *BO = cast<BinaryOperator>(Term);
890 if (!BO->isLogicalOp())
891 continue;
892 DiagKind = 0;
893 Str = BO->getOpcodeStr();
894 Range = BO->getLHS()->getSourceRange();
895 RemoveDiagKind = 0;
896 if ((BO->getOpcode() == BO_LAnd && I->Output) ||
897 (BO->getOpcode() == BO_LOr && !I->Output))
898 // true && y -> y, false || y -> y.
899 Fixit1 = FixItHint::CreateRemoval(
900 SourceRange(BO->getBeginLoc(), BO->getOperatorLoc()));
901 else
902 // false && y -> false, true || y -> true.
903 Fixit1 = FixItHint::CreateReplacement(BO->getSourceRange(), FixitStr);
904 break;
905 }
906
907 // "loop is entered / loop is exited".
908 case Stmt::WhileStmtClass:
909 DiagKind = 1;
910 Str = "while";
911 Range = cast<WhileStmt>(Term)->getCond()->getSourceRange();
912 RemoveDiagKind = 1;
913 Fixit1 = FixItHint::CreateReplacement(Range, FixitStr);
914 break;
915 case Stmt::ForStmtClass:
916 DiagKind = 1;
917 Str = "for";
918 Range = cast<ForStmt>(Term)->getCond()->getSourceRange();
919 RemoveDiagKind = 1;
920 if (I->Output)
921 Fixit1 = FixItHint::CreateRemoval(Range);
922 else
923 Fixit1 = FixItHint::CreateReplacement(Range, FixitStr);
924 break;
925 case Stmt::CXXForRangeStmtClass:
926 if (I->Output == 1) {
927 // The use occurs if a range-based for loop's body never executes.
928 // That may be impossible, and there's no syntactic fix for this,
929 // so treat it as a 'may be uninitialized' case.
930 continue;
931 }
932 DiagKind = 1;
933 Str = "for";
934 Range = cast<CXXForRangeStmt>(Term)->getRangeInit()->getSourceRange();
935 break;
936
937 // "condition is true / loop is exited".
938 case Stmt::DoStmtClass:
939 DiagKind = 2;
940 Str = "do";
941 Range = cast<DoStmt>(Term)->getCond()->getSourceRange();
942 RemoveDiagKind = 1;
943 Fixit1 = FixItHint::CreateReplacement(Range, FixitStr);
944 break;
945
946 // "switch case is taken".
947 case Stmt::CaseStmtClass:
948 DiagKind = 3;
949 Str = "case";
950 Range = cast<CaseStmt>(Term)->getLHS()->getSourceRange();
951 break;
952 case Stmt::DefaultStmtClass:
953 DiagKind = 3;
954 Str = "default";
955 Range = cast<DefaultStmt>(Term)->getDefaultLoc();
956 break;
957 }
958
959 S.Diag(Range.getBegin(), diag::warn_sometimes_uninit_var)
960 << VD->getDeclName() << IsCapturedByBlock << DiagKind
961 << Str << I->Output << Range;
962 S.Diag(User->getBeginLoc(), diag::note_uninit_var_use)
963 << IsCapturedByBlock << User->getSourceRange();
964 if (RemoveDiagKind != -1)
965 S.Diag(Fixit1.RemoveRange.getBegin(), diag::note_uninit_fixit_remove_cond)
966 << RemoveDiagKind << Str << I->Output << Fixit1 << Fixit2;
967
968 Diagnosed = true;
969 }
970
971 if (!Diagnosed)
972 S.Diag(Use.getUser()->getBeginLoc(), diag::warn_maybe_uninit_var)
973 << VD->getDeclName() << IsCapturedByBlock
974 << Use.getUser()->getSourceRange();
975 }
976
977 /// Diagnose uninitialized const reference usages.
DiagnoseUninitializedConstRefUse(Sema & S,const VarDecl * VD,const UninitUse & Use)978 static bool DiagnoseUninitializedConstRefUse(Sema &S, const VarDecl *VD,
979 const UninitUse &Use) {
980 S.Diag(Use.getUser()->getBeginLoc(), diag::warn_uninit_const_reference)
981 << VD->getDeclName() << Use.getUser()->getSourceRange();
982 return true;
983 }
984
985 /// DiagnoseUninitializedUse -- Helper function for diagnosing uses of an
986 /// uninitialized variable. This manages the different forms of diagnostic
987 /// emitted for particular types of uses. Returns true if the use was diagnosed
988 /// as a warning. If a particular use is one we omit warnings for, returns
989 /// false.
DiagnoseUninitializedUse(Sema & S,const VarDecl * VD,const UninitUse & Use,bool alwaysReportSelfInit=false)990 static bool DiagnoseUninitializedUse(Sema &S, const VarDecl *VD,
991 const UninitUse &Use,
992 bool alwaysReportSelfInit = false) {
993 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Use.getUser())) {
994 // Inspect the initializer of the variable declaration which is
995 // being referenced prior to its initialization. We emit
996 // specialized diagnostics for self-initialization, and we
997 // specifically avoid warning about self references which take the
998 // form of:
999 //
1000 // int x = x;
1001 //
1002 // This is used to indicate to GCC that 'x' is intentionally left
1003 // uninitialized. Proven code paths which access 'x' in
1004 // an uninitialized state after this will still warn.
1005 if (const Expr *Initializer = VD->getInit()) {
1006 if (!alwaysReportSelfInit && DRE == Initializer->IgnoreParenImpCasts())
1007 return false;
1008
1009 ContainsReference CR(S.Context, DRE);
1010 CR.Visit(Initializer);
1011 if (CR.doesContainReference()) {
1012 S.Diag(DRE->getBeginLoc(), diag::warn_uninit_self_reference_in_init)
1013 << VD->getDeclName() << VD->getLocation() << DRE->getSourceRange();
1014 return true;
1015 }
1016 }
1017
1018 DiagUninitUse(S, VD, Use, false);
1019 } else {
1020 const BlockExpr *BE = cast<BlockExpr>(Use.getUser());
1021 if (VD->getType()->isBlockPointerType() && !VD->hasAttr<BlocksAttr>())
1022 S.Diag(BE->getBeginLoc(),
1023 diag::warn_uninit_byref_blockvar_captured_by_block)
1024 << VD->getDeclName()
1025 << VD->getType().getQualifiers().hasObjCLifetime();
1026 else
1027 DiagUninitUse(S, VD, Use, true);
1028 }
1029
1030 // Report where the variable was declared when the use wasn't within
1031 // the initializer of that declaration & we didn't already suggest
1032 // an initialization fixit.
1033 if (!SuggestInitializationFixit(S, VD))
1034 S.Diag(VD->getBeginLoc(), diag::note_var_declared_here)
1035 << VD->getDeclName();
1036
1037 return true;
1038 }
1039
1040 namespace {
1041 class FallthroughMapper : public RecursiveASTVisitor<FallthroughMapper> {
1042 public:
FallthroughMapper(Sema & S)1043 FallthroughMapper(Sema &S)
1044 : FoundSwitchStatements(false),
1045 S(S) {
1046 }
1047
foundSwitchStatements() const1048 bool foundSwitchStatements() const { return FoundSwitchStatements; }
1049
markFallthroughVisited(const AttributedStmt * Stmt)1050 void markFallthroughVisited(const AttributedStmt *Stmt) {
1051 bool Found = FallthroughStmts.erase(Stmt);
1052 assert(Found);
1053 (void)Found;
1054 }
1055
1056 typedef llvm::SmallPtrSet<const AttributedStmt*, 8> AttrStmts;
1057
getFallthroughStmts() const1058 const AttrStmts &getFallthroughStmts() const {
1059 return FallthroughStmts;
1060 }
1061
fillReachableBlocks(CFG * Cfg)1062 void fillReachableBlocks(CFG *Cfg) {
1063 assert(ReachableBlocks.empty() && "ReachableBlocks already filled");
1064 std::deque<const CFGBlock *> BlockQueue;
1065
1066 ReachableBlocks.insert(&Cfg->getEntry());
1067 BlockQueue.push_back(&Cfg->getEntry());
1068 // Mark all case blocks reachable to avoid problems with switching on
1069 // constants, covered enums, etc.
1070 // These blocks can contain fall-through annotations, and we don't want to
1071 // issue a warn_fallthrough_attr_unreachable for them.
1072 for (const auto *B : *Cfg) {
1073 const Stmt *L = B->getLabel();
1074 if (L && isa<SwitchCase>(L) && ReachableBlocks.insert(B).second)
1075 BlockQueue.push_back(B);
1076 }
1077
1078 while (!BlockQueue.empty()) {
1079 const CFGBlock *P = BlockQueue.front();
1080 BlockQueue.pop_front();
1081 for (CFGBlock::const_succ_iterator I = P->succ_begin(),
1082 E = P->succ_end();
1083 I != E; ++I) {
1084 if (*I && ReachableBlocks.insert(*I).second)
1085 BlockQueue.push_back(*I);
1086 }
1087 }
1088 }
1089
checkFallThroughIntoBlock(const CFGBlock & B,int & AnnotatedCnt,bool IsTemplateInstantiation)1090 bool checkFallThroughIntoBlock(const CFGBlock &B, int &AnnotatedCnt,
1091 bool IsTemplateInstantiation) {
1092 assert(!ReachableBlocks.empty() && "ReachableBlocks empty");
1093
1094 int UnannotatedCnt = 0;
1095 AnnotatedCnt = 0;
1096
1097 std::deque<const CFGBlock*> BlockQueue(B.pred_begin(), B.pred_end());
1098 while (!BlockQueue.empty()) {
1099 const CFGBlock *P = BlockQueue.front();
1100 BlockQueue.pop_front();
1101 if (!P) continue;
1102
1103 const Stmt *Term = P->getTerminatorStmt();
1104 if (Term && isa<SwitchStmt>(Term))
1105 continue; // Switch statement, good.
1106
1107 const SwitchCase *SW = dyn_cast_or_null<SwitchCase>(P->getLabel());
1108 if (SW && SW->getSubStmt() == B.getLabel() && P->begin() == P->end())
1109 continue; // Previous case label has no statements, good.
1110
1111 const LabelStmt *L = dyn_cast_or_null<LabelStmt>(P->getLabel());
1112 if (L && L->getSubStmt() == B.getLabel() && P->begin() == P->end())
1113 continue; // Case label is preceded with a normal label, good.
1114
1115 if (!ReachableBlocks.count(P)) {
1116 for (CFGBlock::const_reverse_iterator ElemIt = P->rbegin(),
1117 ElemEnd = P->rend();
1118 ElemIt != ElemEnd; ++ElemIt) {
1119 if (Optional<CFGStmt> CS = ElemIt->getAs<CFGStmt>()) {
1120 if (const AttributedStmt *AS = asFallThroughAttr(CS->getStmt())) {
1121 // Don't issue a warning for an unreachable fallthrough
1122 // attribute in template instantiations as it may not be
1123 // unreachable in all instantiations of the template.
1124 if (!IsTemplateInstantiation)
1125 S.Diag(AS->getBeginLoc(),
1126 diag::warn_fallthrough_attr_unreachable);
1127 markFallthroughVisited(AS);
1128 ++AnnotatedCnt;
1129 break;
1130 }
1131 // Don't care about other unreachable statements.
1132 }
1133 }
1134 // If there are no unreachable statements, this may be a special
1135 // case in CFG:
1136 // case X: {
1137 // A a; // A has a destructor.
1138 // break;
1139 // }
1140 // // <<<< This place is represented by a 'hanging' CFG block.
1141 // case Y:
1142 continue;
1143 }
1144
1145 const Stmt *LastStmt = getLastStmt(*P);
1146 if (const AttributedStmt *AS = asFallThroughAttr(LastStmt)) {
1147 markFallthroughVisited(AS);
1148 ++AnnotatedCnt;
1149 continue; // Fallthrough annotation, good.
1150 }
1151
1152 if (!LastStmt) { // This block contains no executable statements.
1153 // Traverse its predecessors.
1154 std::copy(P->pred_begin(), P->pred_end(),
1155 std::back_inserter(BlockQueue));
1156 continue;
1157 }
1158
1159 ++UnannotatedCnt;
1160 }
1161 return !!UnannotatedCnt;
1162 }
1163
1164 // RecursiveASTVisitor setup.
shouldWalkTypesOfTypeLocs() const1165 bool shouldWalkTypesOfTypeLocs() const { return false; }
1166
VisitAttributedStmt(AttributedStmt * S)1167 bool VisitAttributedStmt(AttributedStmt *S) {
1168 if (asFallThroughAttr(S))
1169 FallthroughStmts.insert(S);
1170 return true;
1171 }
1172
VisitSwitchStmt(SwitchStmt * S)1173 bool VisitSwitchStmt(SwitchStmt *S) {
1174 FoundSwitchStatements = true;
1175 return true;
1176 }
1177
1178 // We don't want to traverse local type declarations. We analyze their
1179 // methods separately.
TraverseDecl(Decl * D)1180 bool TraverseDecl(Decl *D) { return true; }
1181
1182 // We analyze lambda bodies separately. Skip them here.
TraverseLambdaExpr(LambdaExpr * LE)1183 bool TraverseLambdaExpr(LambdaExpr *LE) {
1184 // Traverse the captures, but not the body.
1185 for (const auto C : zip(LE->captures(), LE->capture_inits()))
1186 TraverseLambdaCapture(LE, &std::get<0>(C), std::get<1>(C));
1187 return true;
1188 }
1189
1190 private:
1191
asFallThroughAttr(const Stmt * S)1192 static const AttributedStmt *asFallThroughAttr(const Stmt *S) {
1193 if (const AttributedStmt *AS = dyn_cast_or_null<AttributedStmt>(S)) {
1194 if (hasSpecificAttr<FallThroughAttr>(AS->getAttrs()))
1195 return AS;
1196 }
1197 return nullptr;
1198 }
1199
getLastStmt(const CFGBlock & B)1200 static const Stmt *getLastStmt(const CFGBlock &B) {
1201 if (const Stmt *Term = B.getTerminatorStmt())
1202 return Term;
1203 for (CFGBlock::const_reverse_iterator ElemIt = B.rbegin(),
1204 ElemEnd = B.rend();
1205 ElemIt != ElemEnd; ++ElemIt) {
1206 if (Optional<CFGStmt> CS = ElemIt->getAs<CFGStmt>())
1207 return CS->getStmt();
1208 }
1209 // Workaround to detect a statement thrown out by CFGBuilder:
1210 // case X: {} case Y:
1211 // case X: ; case Y:
1212 if (const SwitchCase *SW = dyn_cast_or_null<SwitchCase>(B.getLabel()))
1213 if (!isa<SwitchCase>(SW->getSubStmt()))
1214 return SW->getSubStmt();
1215
1216 return nullptr;
1217 }
1218
1219 bool FoundSwitchStatements;
1220 AttrStmts FallthroughStmts;
1221 Sema &S;
1222 llvm::SmallPtrSet<const CFGBlock *, 16> ReachableBlocks;
1223 };
1224 } // anonymous namespace
1225
getFallthroughAttrSpelling(Preprocessor & PP,SourceLocation Loc)1226 static StringRef getFallthroughAttrSpelling(Preprocessor &PP,
1227 SourceLocation Loc) {
1228 TokenValue FallthroughTokens[] = {
1229 tok::l_square, tok::l_square,
1230 PP.getIdentifierInfo("fallthrough"),
1231 tok::r_square, tok::r_square
1232 };
1233
1234 TokenValue ClangFallthroughTokens[] = {
1235 tok::l_square, tok::l_square, PP.getIdentifierInfo("clang"),
1236 tok::coloncolon, PP.getIdentifierInfo("fallthrough"),
1237 tok::r_square, tok::r_square
1238 };
1239
1240 bool PreferClangAttr = !PP.getLangOpts().CPlusPlus17 && !PP.getLangOpts().C2x;
1241
1242 StringRef MacroName;
1243 if (PreferClangAttr)
1244 MacroName = PP.getLastMacroWithSpelling(Loc, ClangFallthroughTokens);
1245 if (MacroName.empty())
1246 MacroName = PP.getLastMacroWithSpelling(Loc, FallthroughTokens);
1247 if (MacroName.empty() && !PreferClangAttr)
1248 MacroName = PP.getLastMacroWithSpelling(Loc, ClangFallthroughTokens);
1249 if (MacroName.empty()) {
1250 if (!PreferClangAttr)
1251 MacroName = "[[fallthrough]]";
1252 else if (PP.getLangOpts().CPlusPlus)
1253 MacroName = "[[clang::fallthrough]]";
1254 else
1255 MacroName = "__attribute__((fallthrough))";
1256 }
1257 return MacroName;
1258 }
1259
DiagnoseSwitchLabelsFallthrough(Sema & S,AnalysisDeclContext & AC,bool PerFunction)1260 static void DiagnoseSwitchLabelsFallthrough(Sema &S, AnalysisDeclContext &AC,
1261 bool PerFunction) {
1262 FallthroughMapper FM(S);
1263 FM.TraverseStmt(AC.getBody());
1264
1265 if (!FM.foundSwitchStatements())
1266 return;
1267
1268 if (PerFunction && FM.getFallthroughStmts().empty())
1269 return;
1270
1271 CFG *Cfg = AC.getCFG();
1272
1273 if (!Cfg)
1274 return;
1275
1276 FM.fillReachableBlocks(Cfg);
1277
1278 for (const CFGBlock *B : llvm::reverse(*Cfg)) {
1279 const Stmt *Label = B->getLabel();
1280
1281 if (!Label || !isa<SwitchCase>(Label))
1282 continue;
1283
1284 int AnnotatedCnt;
1285
1286 bool IsTemplateInstantiation = false;
1287 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(AC.getDecl()))
1288 IsTemplateInstantiation = Function->isTemplateInstantiation();
1289 if (!FM.checkFallThroughIntoBlock(*B, AnnotatedCnt,
1290 IsTemplateInstantiation))
1291 continue;
1292
1293 S.Diag(Label->getBeginLoc(),
1294 PerFunction ? diag::warn_unannotated_fallthrough_per_function
1295 : diag::warn_unannotated_fallthrough);
1296
1297 if (!AnnotatedCnt) {
1298 SourceLocation L = Label->getBeginLoc();
1299 if (L.isMacroID())
1300 continue;
1301
1302 const Stmt *Term = B->getTerminatorStmt();
1303 // Skip empty cases.
1304 while (B->empty() && !Term && B->succ_size() == 1) {
1305 B = *B->succ_begin();
1306 Term = B->getTerminatorStmt();
1307 }
1308 if (!(B->empty() && Term && isa<BreakStmt>(Term))) {
1309 Preprocessor &PP = S.getPreprocessor();
1310 StringRef AnnotationSpelling = getFallthroughAttrSpelling(PP, L);
1311 SmallString<64> TextToInsert(AnnotationSpelling);
1312 TextToInsert += "; ";
1313 S.Diag(L, diag::note_insert_fallthrough_fixit)
1314 << AnnotationSpelling
1315 << FixItHint::CreateInsertion(L, TextToInsert);
1316 }
1317 S.Diag(L, diag::note_insert_break_fixit)
1318 << FixItHint::CreateInsertion(L, "break; ");
1319 }
1320 }
1321
1322 for (const auto *F : FM.getFallthroughStmts())
1323 S.Diag(F->getBeginLoc(), diag::err_fallthrough_attr_invalid_placement);
1324 }
1325
isInLoop(const ASTContext & Ctx,const ParentMap & PM,const Stmt * S)1326 static bool isInLoop(const ASTContext &Ctx, const ParentMap &PM,
1327 const Stmt *S) {
1328 assert(S);
1329
1330 do {
1331 switch (S->getStmtClass()) {
1332 case Stmt::ForStmtClass:
1333 case Stmt::WhileStmtClass:
1334 case Stmt::CXXForRangeStmtClass:
1335 case Stmt::ObjCForCollectionStmtClass:
1336 return true;
1337 case Stmt::DoStmtClass: {
1338 Expr::EvalResult Result;
1339 if (!cast<DoStmt>(S)->getCond()->EvaluateAsInt(Result, Ctx))
1340 return true;
1341 return Result.Val.getInt().getBoolValue();
1342 }
1343 default:
1344 break;
1345 }
1346 } while ((S = PM.getParent(S)));
1347
1348 return false;
1349 }
1350
diagnoseRepeatedUseOfWeak(Sema & S,const sema::FunctionScopeInfo * CurFn,const Decl * D,const ParentMap & PM)1351 static void diagnoseRepeatedUseOfWeak(Sema &S,
1352 const sema::FunctionScopeInfo *CurFn,
1353 const Decl *D,
1354 const ParentMap &PM) {
1355 typedef sema::FunctionScopeInfo::WeakObjectProfileTy WeakObjectProfileTy;
1356 typedef sema::FunctionScopeInfo::WeakObjectUseMap WeakObjectUseMap;
1357 typedef sema::FunctionScopeInfo::WeakUseVector WeakUseVector;
1358 typedef std::pair<const Stmt *, WeakObjectUseMap::const_iterator>
1359 StmtUsesPair;
1360
1361 ASTContext &Ctx = S.getASTContext();
1362
1363 const WeakObjectUseMap &WeakMap = CurFn->getWeakObjectUses();
1364
1365 // Extract all weak objects that are referenced more than once.
1366 SmallVector<StmtUsesPair, 8> UsesByStmt;
1367 for (WeakObjectUseMap::const_iterator I = WeakMap.begin(), E = WeakMap.end();
1368 I != E; ++I) {
1369 const WeakUseVector &Uses = I->second;
1370
1371 // Find the first read of the weak object.
1372 WeakUseVector::const_iterator UI = Uses.begin(), UE = Uses.end();
1373 for ( ; UI != UE; ++UI) {
1374 if (UI->isUnsafe())
1375 break;
1376 }
1377
1378 // If there were only writes to this object, don't warn.
1379 if (UI == UE)
1380 continue;
1381
1382 // If there was only one read, followed by any number of writes, and the
1383 // read is not within a loop, don't warn. Additionally, don't warn in a
1384 // loop if the base object is a local variable -- local variables are often
1385 // changed in loops.
1386 if (UI == Uses.begin()) {
1387 WeakUseVector::const_iterator UI2 = UI;
1388 for (++UI2; UI2 != UE; ++UI2)
1389 if (UI2->isUnsafe())
1390 break;
1391
1392 if (UI2 == UE) {
1393 if (!isInLoop(Ctx, PM, UI->getUseExpr()))
1394 continue;
1395
1396 const WeakObjectProfileTy &Profile = I->first;
1397 if (!Profile.isExactProfile())
1398 continue;
1399
1400 const NamedDecl *Base = Profile.getBase();
1401 if (!Base)
1402 Base = Profile.getProperty();
1403 assert(Base && "A profile always has a base or property.");
1404
1405 if (const VarDecl *BaseVar = dyn_cast<VarDecl>(Base))
1406 if (BaseVar->hasLocalStorage() && !isa<ParmVarDecl>(Base))
1407 continue;
1408 }
1409 }
1410
1411 UsesByStmt.push_back(StmtUsesPair(UI->getUseExpr(), I));
1412 }
1413
1414 if (UsesByStmt.empty())
1415 return;
1416
1417 // Sort by first use so that we emit the warnings in a deterministic order.
1418 SourceManager &SM = S.getSourceManager();
1419 llvm::sort(UsesByStmt,
1420 [&SM](const StmtUsesPair &LHS, const StmtUsesPair &RHS) {
1421 return SM.isBeforeInTranslationUnit(LHS.first->getBeginLoc(),
1422 RHS.first->getBeginLoc());
1423 });
1424
1425 // Classify the current code body for better warning text.
1426 // This enum should stay in sync with the cases in
1427 // warn_arc_repeated_use_of_weak and warn_arc_possible_repeated_use_of_weak.
1428 // FIXME: Should we use a common classification enum and the same set of
1429 // possibilities all throughout Sema?
1430 enum {
1431 Function,
1432 Method,
1433 Block,
1434 Lambda
1435 } FunctionKind;
1436
1437 if (isa<sema::BlockScopeInfo>(CurFn))
1438 FunctionKind = Block;
1439 else if (isa<sema::LambdaScopeInfo>(CurFn))
1440 FunctionKind = Lambda;
1441 else if (isa<ObjCMethodDecl>(D))
1442 FunctionKind = Method;
1443 else
1444 FunctionKind = Function;
1445
1446 // Iterate through the sorted problems and emit warnings for each.
1447 for (const auto &P : UsesByStmt) {
1448 const Stmt *FirstRead = P.first;
1449 const WeakObjectProfileTy &Key = P.second->first;
1450 const WeakUseVector &Uses = P.second->second;
1451
1452 // For complicated expressions like 'a.b.c' and 'x.b.c', WeakObjectProfileTy
1453 // may not contain enough information to determine that these are different
1454 // properties. We can only be 100% sure of a repeated use in certain cases,
1455 // and we adjust the diagnostic kind accordingly so that the less certain
1456 // case can be turned off if it is too noisy.
1457 unsigned DiagKind;
1458 if (Key.isExactProfile())
1459 DiagKind = diag::warn_arc_repeated_use_of_weak;
1460 else
1461 DiagKind = diag::warn_arc_possible_repeated_use_of_weak;
1462
1463 // Classify the weak object being accessed for better warning text.
1464 // This enum should stay in sync with the cases in
1465 // warn_arc_repeated_use_of_weak and warn_arc_possible_repeated_use_of_weak.
1466 enum {
1467 Variable,
1468 Property,
1469 ImplicitProperty,
1470 Ivar
1471 } ObjectKind;
1472
1473 const NamedDecl *KeyProp = Key.getProperty();
1474 if (isa<VarDecl>(KeyProp))
1475 ObjectKind = Variable;
1476 else if (isa<ObjCPropertyDecl>(KeyProp))
1477 ObjectKind = Property;
1478 else if (isa<ObjCMethodDecl>(KeyProp))
1479 ObjectKind = ImplicitProperty;
1480 else if (isa<ObjCIvarDecl>(KeyProp))
1481 ObjectKind = Ivar;
1482 else
1483 llvm_unreachable("Unexpected weak object kind!");
1484
1485 // Do not warn about IBOutlet weak property receivers being set to null
1486 // since they are typically only used from the main thread.
1487 if (const ObjCPropertyDecl *Prop = dyn_cast<ObjCPropertyDecl>(KeyProp))
1488 if (Prop->hasAttr<IBOutletAttr>())
1489 continue;
1490
1491 // Show the first time the object was read.
1492 S.Diag(FirstRead->getBeginLoc(), DiagKind)
1493 << int(ObjectKind) << KeyProp << int(FunctionKind)
1494 << FirstRead->getSourceRange();
1495
1496 // Print all the other accesses as notes.
1497 for (const auto &Use : Uses) {
1498 if (Use.getUseExpr() == FirstRead)
1499 continue;
1500 S.Diag(Use.getUseExpr()->getBeginLoc(),
1501 diag::note_arc_weak_also_accessed_here)
1502 << Use.getUseExpr()->getSourceRange();
1503 }
1504 }
1505 }
1506
1507 namespace {
1508 class UninitValsDiagReporter : public UninitVariablesHandler {
1509 Sema &S;
1510 typedef SmallVector<UninitUse, 2> UsesVec;
1511 typedef llvm::PointerIntPair<UsesVec *, 1, bool> MappedType;
1512 // Prefer using MapVector to DenseMap, so that iteration order will be
1513 // the same as insertion order. This is needed to obtain a deterministic
1514 // order of diagnostics when calling flushDiagnostics().
1515 typedef llvm::MapVector<const VarDecl *, MappedType> UsesMap;
1516 UsesMap uses;
1517 UsesMap constRefUses;
1518
1519 public:
UninitValsDiagReporter(Sema & S)1520 UninitValsDiagReporter(Sema &S) : S(S) {}
~UninitValsDiagReporter()1521 ~UninitValsDiagReporter() override { flushDiagnostics(); }
1522
getUses(UsesMap & um,const VarDecl * vd)1523 MappedType &getUses(UsesMap &um, const VarDecl *vd) {
1524 MappedType &V = um[vd];
1525 if (!V.getPointer())
1526 V.setPointer(new UsesVec());
1527 return V;
1528 }
1529
handleUseOfUninitVariable(const VarDecl * vd,const UninitUse & use)1530 void handleUseOfUninitVariable(const VarDecl *vd,
1531 const UninitUse &use) override {
1532 getUses(uses, vd).getPointer()->push_back(use);
1533 }
1534
handleConstRefUseOfUninitVariable(const VarDecl * vd,const UninitUse & use)1535 void handleConstRefUseOfUninitVariable(const VarDecl *vd,
1536 const UninitUse &use) override {
1537 getUses(constRefUses, vd).getPointer()->push_back(use);
1538 }
1539
handleSelfInit(const VarDecl * vd)1540 void handleSelfInit(const VarDecl *vd) override {
1541 getUses(uses, vd).setInt(true);
1542 getUses(constRefUses, vd).setInt(true);
1543 }
1544
flushDiagnostics()1545 void flushDiagnostics() {
1546 for (const auto &P : uses) {
1547 const VarDecl *vd = P.first;
1548 const MappedType &V = P.second;
1549
1550 UsesVec *vec = V.getPointer();
1551 bool hasSelfInit = V.getInt();
1552
1553 // Specially handle the case where we have uses of an uninitialized
1554 // variable, but the root cause is an idiomatic self-init. We want
1555 // to report the diagnostic at the self-init since that is the root cause.
1556 if (!vec->empty() && hasSelfInit && hasAlwaysUninitializedUse(vec))
1557 DiagnoseUninitializedUse(S, vd,
1558 UninitUse(vd->getInit()->IgnoreParenCasts(),
1559 /* isAlwaysUninit */ true),
1560 /* alwaysReportSelfInit */ true);
1561 else {
1562 // Sort the uses by their SourceLocations. While not strictly
1563 // guaranteed to produce them in line/column order, this will provide
1564 // a stable ordering.
1565 llvm::sort(vec->begin(), vec->end(),
1566 [](const UninitUse &a, const UninitUse &b) {
1567 // Prefer a more confident report over a less confident one.
1568 if (a.getKind() != b.getKind())
1569 return a.getKind() > b.getKind();
1570 return a.getUser()->getBeginLoc() < b.getUser()->getBeginLoc();
1571 });
1572
1573 for (const auto &U : *vec) {
1574 // If we have self-init, downgrade all uses to 'may be uninitialized'.
1575 UninitUse Use = hasSelfInit ? UninitUse(U.getUser(), false) : U;
1576
1577 if (DiagnoseUninitializedUse(S, vd, Use))
1578 // Skip further diagnostics for this variable. We try to warn only
1579 // on the first point at which a variable is used uninitialized.
1580 break;
1581 }
1582 }
1583
1584 // Release the uses vector.
1585 delete vec;
1586 }
1587
1588 uses.clear();
1589
1590 // Flush all const reference uses diags.
1591 for (const auto &P : constRefUses) {
1592 const VarDecl *vd = P.first;
1593 const MappedType &V = P.second;
1594
1595 UsesVec *vec = V.getPointer();
1596 bool hasSelfInit = V.getInt();
1597
1598 if (!vec->empty() && hasSelfInit && hasAlwaysUninitializedUse(vec))
1599 DiagnoseUninitializedUse(S, vd,
1600 UninitUse(vd->getInit()->IgnoreParenCasts(),
1601 /* isAlwaysUninit */ true),
1602 /* alwaysReportSelfInit */ true);
1603 else {
1604 for (const auto &U : *vec) {
1605 if (DiagnoseUninitializedConstRefUse(S, vd, U))
1606 break;
1607 }
1608 }
1609
1610 // Release the uses vector.
1611 delete vec;
1612 }
1613
1614 constRefUses.clear();
1615 }
1616
1617 private:
hasAlwaysUninitializedUse(const UsesVec * vec)1618 static bool hasAlwaysUninitializedUse(const UsesVec* vec) {
1619 return std::any_of(vec->begin(), vec->end(), [](const UninitUse &U) {
1620 return U.getKind() == UninitUse::Always ||
1621 U.getKind() == UninitUse::AfterCall ||
1622 U.getKind() == UninitUse::AfterDecl;
1623 });
1624 }
1625 };
1626 } // anonymous namespace
1627
1628 namespace clang {
1629 namespace {
1630 typedef SmallVector<PartialDiagnosticAt, 1> OptionalNotes;
1631 typedef std::pair<PartialDiagnosticAt, OptionalNotes> DelayedDiag;
1632 typedef std::list<DelayedDiag> DiagList;
1633
1634 struct SortDiagBySourceLocation {
1635 SourceManager &SM;
SortDiagBySourceLocationclang::__anone026b1520f11::SortDiagBySourceLocation1636 SortDiagBySourceLocation(SourceManager &SM) : SM(SM) {}
1637
operator ()clang::__anone026b1520f11::SortDiagBySourceLocation1638 bool operator()(const DelayedDiag &left, const DelayedDiag &right) {
1639 // Although this call will be slow, this is only called when outputting
1640 // multiple warnings.
1641 return SM.isBeforeInTranslationUnit(left.first.first, right.first.first);
1642 }
1643 };
1644 } // anonymous namespace
1645 } // namespace clang
1646
1647 //===----------------------------------------------------------------------===//
1648 // -Wthread-safety
1649 //===----------------------------------------------------------------------===//
1650 namespace clang {
1651 namespace threadSafety {
1652 namespace {
1653 class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler {
1654 Sema &S;
1655 DiagList Warnings;
1656 SourceLocation FunLocation, FunEndLocation;
1657
1658 const FunctionDecl *CurrentFunction;
1659 bool Verbose;
1660
getNotes() const1661 OptionalNotes getNotes() const {
1662 if (Verbose && CurrentFunction) {
1663 PartialDiagnosticAt FNote(CurrentFunction->getBody()->getBeginLoc(),
1664 S.PDiag(diag::note_thread_warning_in_fun)
1665 << CurrentFunction);
1666 return OptionalNotes(1, FNote);
1667 }
1668 return OptionalNotes();
1669 }
1670
getNotes(const PartialDiagnosticAt & Note) const1671 OptionalNotes getNotes(const PartialDiagnosticAt &Note) const {
1672 OptionalNotes ONS(1, Note);
1673 if (Verbose && CurrentFunction) {
1674 PartialDiagnosticAt FNote(CurrentFunction->getBody()->getBeginLoc(),
1675 S.PDiag(diag::note_thread_warning_in_fun)
1676 << CurrentFunction);
1677 ONS.push_back(std::move(FNote));
1678 }
1679 return ONS;
1680 }
1681
getNotes(const PartialDiagnosticAt & Note1,const PartialDiagnosticAt & Note2) const1682 OptionalNotes getNotes(const PartialDiagnosticAt &Note1,
1683 const PartialDiagnosticAt &Note2) const {
1684 OptionalNotes ONS;
1685 ONS.push_back(Note1);
1686 ONS.push_back(Note2);
1687 if (Verbose && CurrentFunction) {
1688 PartialDiagnosticAt FNote(CurrentFunction->getBody()->getBeginLoc(),
1689 S.PDiag(diag::note_thread_warning_in_fun)
1690 << CurrentFunction);
1691 ONS.push_back(std::move(FNote));
1692 }
1693 return ONS;
1694 }
1695
makeLockedHereNote(SourceLocation LocLocked,StringRef Kind)1696 OptionalNotes makeLockedHereNote(SourceLocation LocLocked, StringRef Kind) {
1697 return LocLocked.isValid()
1698 ? getNotes(PartialDiagnosticAt(
1699 LocLocked, S.PDiag(diag::note_locked_here) << Kind))
1700 : getNotes();
1701 }
1702
makeUnlockedHereNote(SourceLocation LocUnlocked,StringRef Kind)1703 OptionalNotes makeUnlockedHereNote(SourceLocation LocUnlocked,
1704 StringRef Kind) {
1705 return LocUnlocked.isValid()
1706 ? getNotes(PartialDiagnosticAt(
1707 LocUnlocked, S.PDiag(diag::note_unlocked_here) << Kind))
1708 : getNotes();
1709 }
1710
1711 public:
ThreadSafetyReporter(Sema & S,SourceLocation FL,SourceLocation FEL)1712 ThreadSafetyReporter(Sema &S, SourceLocation FL, SourceLocation FEL)
1713 : S(S), FunLocation(FL), FunEndLocation(FEL),
1714 CurrentFunction(nullptr), Verbose(false) {}
1715
setVerbose(bool b)1716 void setVerbose(bool b) { Verbose = b; }
1717
1718 /// Emit all buffered diagnostics in order of sourcelocation.
1719 /// We need to output diagnostics produced while iterating through
1720 /// the lockset in deterministic order, so this function orders diagnostics
1721 /// and outputs them.
emitDiagnostics()1722 void emitDiagnostics() {
1723 Warnings.sort(SortDiagBySourceLocation(S.getSourceManager()));
1724 for (const auto &Diag : Warnings) {
1725 S.Diag(Diag.first.first, Diag.first.second);
1726 for (const auto &Note : Diag.second)
1727 S.Diag(Note.first, Note.second);
1728 }
1729 }
1730
handleInvalidLockExp(StringRef Kind,SourceLocation Loc)1731 void handleInvalidLockExp(StringRef Kind, SourceLocation Loc) override {
1732 PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_cannot_resolve_lock)
1733 << Loc);
1734 Warnings.emplace_back(std::move(Warning), getNotes());
1735 }
1736
handleUnmatchedUnlock(StringRef Kind,Name LockName,SourceLocation Loc,SourceLocation LocPreviousUnlock)1737 void handleUnmatchedUnlock(StringRef Kind, Name LockName, SourceLocation Loc,
1738 SourceLocation LocPreviousUnlock) override {
1739 if (Loc.isInvalid())
1740 Loc = FunLocation;
1741 PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_unlock_but_no_lock)
1742 << Kind << LockName);
1743 Warnings.emplace_back(std::move(Warning),
1744 makeUnlockedHereNote(LocPreviousUnlock, Kind));
1745 }
1746
handleIncorrectUnlockKind(StringRef Kind,Name LockName,LockKind Expected,LockKind Received,SourceLocation LocLocked,SourceLocation LocUnlock)1747 void handleIncorrectUnlockKind(StringRef Kind, Name LockName,
1748 LockKind Expected, LockKind Received,
1749 SourceLocation LocLocked,
1750 SourceLocation LocUnlock) override {
1751 if (LocUnlock.isInvalid())
1752 LocUnlock = FunLocation;
1753 PartialDiagnosticAt Warning(
1754 LocUnlock, S.PDiag(diag::warn_unlock_kind_mismatch)
1755 << Kind << LockName << Received << Expected);
1756 Warnings.emplace_back(std::move(Warning),
1757 makeLockedHereNote(LocLocked, Kind));
1758 }
1759
handleDoubleLock(StringRef Kind,Name LockName,SourceLocation LocLocked,SourceLocation LocDoubleLock)1760 void handleDoubleLock(StringRef Kind, Name LockName, SourceLocation LocLocked,
1761 SourceLocation LocDoubleLock) override {
1762 if (LocDoubleLock.isInvalid())
1763 LocDoubleLock = FunLocation;
1764 PartialDiagnosticAt Warning(LocDoubleLock, S.PDiag(diag::warn_double_lock)
1765 << Kind << LockName);
1766 Warnings.emplace_back(std::move(Warning),
1767 makeLockedHereNote(LocLocked, Kind));
1768 }
1769
handleMutexHeldEndOfScope(StringRef Kind,Name LockName,SourceLocation LocLocked,SourceLocation LocEndOfScope,LockErrorKind LEK)1770 void handleMutexHeldEndOfScope(StringRef Kind, Name LockName,
1771 SourceLocation LocLocked,
1772 SourceLocation LocEndOfScope,
1773 LockErrorKind LEK) override {
1774 unsigned DiagID = 0;
1775 switch (LEK) {
1776 case LEK_LockedSomePredecessors:
1777 DiagID = diag::warn_lock_some_predecessors;
1778 break;
1779 case LEK_LockedSomeLoopIterations:
1780 DiagID = diag::warn_expecting_lock_held_on_loop;
1781 break;
1782 case LEK_LockedAtEndOfFunction:
1783 DiagID = diag::warn_no_unlock;
1784 break;
1785 case LEK_NotLockedAtEndOfFunction:
1786 DiagID = diag::warn_expecting_locked;
1787 break;
1788 }
1789 if (LocEndOfScope.isInvalid())
1790 LocEndOfScope = FunEndLocation;
1791
1792 PartialDiagnosticAt Warning(LocEndOfScope, S.PDiag(DiagID) << Kind
1793 << LockName);
1794 Warnings.emplace_back(std::move(Warning),
1795 makeLockedHereNote(LocLocked, Kind));
1796 }
1797
handleExclusiveAndShared(StringRef Kind,Name LockName,SourceLocation Loc1,SourceLocation Loc2)1798 void handleExclusiveAndShared(StringRef Kind, Name LockName,
1799 SourceLocation Loc1,
1800 SourceLocation Loc2) override {
1801 PartialDiagnosticAt Warning(Loc1,
1802 S.PDiag(diag::warn_lock_exclusive_and_shared)
1803 << Kind << LockName);
1804 PartialDiagnosticAt Note(Loc2, S.PDiag(diag::note_lock_exclusive_and_shared)
1805 << Kind << LockName);
1806 Warnings.emplace_back(std::move(Warning), getNotes(Note));
1807 }
1808
handleNoMutexHeld(StringRef Kind,const NamedDecl * D,ProtectedOperationKind POK,AccessKind AK,SourceLocation Loc)1809 void handleNoMutexHeld(StringRef Kind, const NamedDecl *D,
1810 ProtectedOperationKind POK, AccessKind AK,
1811 SourceLocation Loc) override {
1812 assert((POK == POK_VarAccess || POK == POK_VarDereference) &&
1813 "Only works for variables");
1814 unsigned DiagID = POK == POK_VarAccess?
1815 diag::warn_variable_requires_any_lock:
1816 diag::warn_var_deref_requires_any_lock;
1817 PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID)
1818 << D << getLockKindFromAccessKind(AK));
1819 Warnings.emplace_back(std::move(Warning), getNotes());
1820 }
1821
handleMutexNotHeld(StringRef Kind,const NamedDecl * D,ProtectedOperationKind POK,Name LockName,LockKind LK,SourceLocation Loc,Name * PossibleMatch)1822 void handleMutexNotHeld(StringRef Kind, const NamedDecl *D,
1823 ProtectedOperationKind POK, Name LockName,
1824 LockKind LK, SourceLocation Loc,
1825 Name *PossibleMatch) override {
1826 unsigned DiagID = 0;
1827 if (PossibleMatch) {
1828 switch (POK) {
1829 case POK_VarAccess:
1830 DiagID = diag::warn_variable_requires_lock_precise;
1831 break;
1832 case POK_VarDereference:
1833 DiagID = diag::warn_var_deref_requires_lock_precise;
1834 break;
1835 case POK_FunctionCall:
1836 DiagID = diag::warn_fun_requires_lock_precise;
1837 break;
1838 case POK_PassByRef:
1839 DiagID = diag::warn_guarded_pass_by_reference;
1840 break;
1841 case POK_PtPassByRef:
1842 DiagID = diag::warn_pt_guarded_pass_by_reference;
1843 break;
1844 }
1845 PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) << Kind
1846 << D
1847 << LockName << LK);
1848 PartialDiagnosticAt Note(Loc, S.PDiag(diag::note_found_mutex_near_match)
1849 << *PossibleMatch);
1850 if (Verbose && POK == POK_VarAccess) {
1851 PartialDiagnosticAt VNote(D->getLocation(),
1852 S.PDiag(diag::note_guarded_by_declared_here)
1853 << D->getDeclName());
1854 Warnings.emplace_back(std::move(Warning), getNotes(Note, VNote));
1855 } else
1856 Warnings.emplace_back(std::move(Warning), getNotes(Note));
1857 } else {
1858 switch (POK) {
1859 case POK_VarAccess:
1860 DiagID = diag::warn_variable_requires_lock;
1861 break;
1862 case POK_VarDereference:
1863 DiagID = diag::warn_var_deref_requires_lock;
1864 break;
1865 case POK_FunctionCall:
1866 DiagID = diag::warn_fun_requires_lock;
1867 break;
1868 case POK_PassByRef:
1869 DiagID = diag::warn_guarded_pass_by_reference;
1870 break;
1871 case POK_PtPassByRef:
1872 DiagID = diag::warn_pt_guarded_pass_by_reference;
1873 break;
1874 }
1875 PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) << Kind
1876 << D
1877 << LockName << LK);
1878 if (Verbose && POK == POK_VarAccess) {
1879 PartialDiagnosticAt Note(D->getLocation(),
1880 S.PDiag(diag::note_guarded_by_declared_here));
1881 Warnings.emplace_back(std::move(Warning), getNotes(Note));
1882 } else
1883 Warnings.emplace_back(std::move(Warning), getNotes());
1884 }
1885 }
1886
handleNegativeNotHeld(StringRef Kind,Name LockName,Name Neg,SourceLocation Loc)1887 void handleNegativeNotHeld(StringRef Kind, Name LockName, Name Neg,
1888 SourceLocation Loc) override {
1889 PartialDiagnosticAt Warning(Loc,
1890 S.PDiag(diag::warn_acquire_requires_negative_cap)
1891 << Kind << LockName << Neg);
1892 Warnings.emplace_back(std::move(Warning), getNotes());
1893 }
1894
handleNegativeNotHeld(const NamedDecl * D,Name LockName,SourceLocation Loc)1895 void handleNegativeNotHeld(const NamedDecl *D, Name LockName,
1896 SourceLocation Loc) override {
1897 PartialDiagnosticAt Warning(
1898 Loc, S.PDiag(diag::warn_fun_requires_negative_cap) << D << LockName);
1899 Warnings.emplace_back(std::move(Warning), getNotes());
1900 }
1901
handleFunExcludesLock(StringRef Kind,Name FunName,Name LockName,SourceLocation Loc)1902 void handleFunExcludesLock(StringRef Kind, Name FunName, Name LockName,
1903 SourceLocation Loc) override {
1904 PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_fun_excludes_mutex)
1905 << Kind << FunName << LockName);
1906 Warnings.emplace_back(std::move(Warning), getNotes());
1907 }
1908
handleLockAcquiredBefore(StringRef Kind,Name L1Name,Name L2Name,SourceLocation Loc)1909 void handleLockAcquiredBefore(StringRef Kind, Name L1Name, Name L2Name,
1910 SourceLocation Loc) override {
1911 PartialDiagnosticAt Warning(Loc,
1912 S.PDiag(diag::warn_acquired_before) << Kind << L1Name << L2Name);
1913 Warnings.emplace_back(std::move(Warning), getNotes());
1914 }
1915
handleBeforeAfterCycle(Name L1Name,SourceLocation Loc)1916 void handleBeforeAfterCycle(Name L1Name, SourceLocation Loc) override {
1917 PartialDiagnosticAt Warning(Loc,
1918 S.PDiag(diag::warn_acquired_before_after_cycle) << L1Name);
1919 Warnings.emplace_back(std::move(Warning), getNotes());
1920 }
1921
enterFunction(const FunctionDecl * FD)1922 void enterFunction(const FunctionDecl* FD) override {
1923 CurrentFunction = FD;
1924 }
1925
leaveFunction(const FunctionDecl * FD)1926 void leaveFunction(const FunctionDecl* FD) override {
1927 CurrentFunction = nullptr;
1928 }
1929 };
1930 } // anonymous namespace
1931 } // namespace threadSafety
1932 } // namespace clang
1933
1934 //===----------------------------------------------------------------------===//
1935 // -Wconsumed
1936 //===----------------------------------------------------------------------===//
1937
1938 namespace clang {
1939 namespace consumed {
1940 namespace {
1941 class ConsumedWarningsHandler : public ConsumedWarningsHandlerBase {
1942
1943 Sema &S;
1944 DiagList Warnings;
1945
1946 public:
1947
ConsumedWarningsHandler(Sema & S)1948 ConsumedWarningsHandler(Sema &S) : S(S) {}
1949
emitDiagnostics()1950 void emitDiagnostics() override {
1951 Warnings.sort(SortDiagBySourceLocation(S.getSourceManager()));
1952 for (const auto &Diag : Warnings) {
1953 S.Diag(Diag.first.first, Diag.first.second);
1954 for (const auto &Note : Diag.second)
1955 S.Diag(Note.first, Note.second);
1956 }
1957 }
1958
warnLoopStateMismatch(SourceLocation Loc,StringRef VariableName)1959 void warnLoopStateMismatch(SourceLocation Loc,
1960 StringRef VariableName) override {
1961 PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_loop_state_mismatch) <<
1962 VariableName);
1963
1964 Warnings.emplace_back(std::move(Warning), OptionalNotes());
1965 }
1966
warnParamReturnTypestateMismatch(SourceLocation Loc,StringRef VariableName,StringRef ExpectedState,StringRef ObservedState)1967 void warnParamReturnTypestateMismatch(SourceLocation Loc,
1968 StringRef VariableName,
1969 StringRef ExpectedState,
1970 StringRef ObservedState) override {
1971
1972 PartialDiagnosticAt Warning(Loc, S.PDiag(
1973 diag::warn_param_return_typestate_mismatch) << VariableName <<
1974 ExpectedState << ObservedState);
1975
1976 Warnings.emplace_back(std::move(Warning), OptionalNotes());
1977 }
1978
warnParamTypestateMismatch(SourceLocation Loc,StringRef ExpectedState,StringRef ObservedState)1979 void warnParamTypestateMismatch(SourceLocation Loc, StringRef ExpectedState,
1980 StringRef ObservedState) override {
1981
1982 PartialDiagnosticAt Warning(Loc, S.PDiag(
1983 diag::warn_param_typestate_mismatch) << ExpectedState << ObservedState);
1984
1985 Warnings.emplace_back(std::move(Warning), OptionalNotes());
1986 }
1987
warnReturnTypestateForUnconsumableType(SourceLocation Loc,StringRef TypeName)1988 void warnReturnTypestateForUnconsumableType(SourceLocation Loc,
1989 StringRef TypeName) override {
1990 PartialDiagnosticAt Warning(Loc, S.PDiag(
1991 diag::warn_return_typestate_for_unconsumable_type) << TypeName);
1992
1993 Warnings.emplace_back(std::move(Warning), OptionalNotes());
1994 }
1995
warnReturnTypestateMismatch(SourceLocation Loc,StringRef ExpectedState,StringRef ObservedState)1996 void warnReturnTypestateMismatch(SourceLocation Loc, StringRef ExpectedState,
1997 StringRef ObservedState) override {
1998
1999 PartialDiagnosticAt Warning(Loc, S.PDiag(
2000 diag::warn_return_typestate_mismatch) << ExpectedState << ObservedState);
2001
2002 Warnings.emplace_back(std::move(Warning), OptionalNotes());
2003 }
2004
warnUseOfTempInInvalidState(StringRef MethodName,StringRef State,SourceLocation Loc)2005 void warnUseOfTempInInvalidState(StringRef MethodName, StringRef State,
2006 SourceLocation Loc) override {
2007
2008 PartialDiagnosticAt Warning(Loc, S.PDiag(
2009 diag::warn_use_of_temp_in_invalid_state) << MethodName << State);
2010
2011 Warnings.emplace_back(std::move(Warning), OptionalNotes());
2012 }
2013
warnUseInInvalidState(StringRef MethodName,StringRef VariableName,StringRef State,SourceLocation Loc)2014 void warnUseInInvalidState(StringRef MethodName, StringRef VariableName,
2015 StringRef State, SourceLocation Loc) override {
2016
2017 PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_use_in_invalid_state) <<
2018 MethodName << VariableName << State);
2019
2020 Warnings.emplace_back(std::move(Warning), OptionalNotes());
2021 }
2022 };
2023 } // anonymous namespace
2024 } // namespace consumed
2025 } // namespace clang
2026
2027 //===----------------------------------------------------------------------===//
2028 // AnalysisBasedWarnings - Worker object used by Sema to execute analysis-based
2029 // warnings on a function, method, or block.
2030 //===----------------------------------------------------------------------===//
2031
Policy()2032 clang::sema::AnalysisBasedWarnings::Policy::Policy() {
2033 enableCheckFallThrough = 1;
2034 enableCheckUnreachable = 0;
2035 enableThreadSafetyAnalysis = 0;
2036 enableConsumedAnalysis = 0;
2037 }
2038
isEnabled(DiagnosticsEngine & D,unsigned diag)2039 static unsigned isEnabled(DiagnosticsEngine &D, unsigned diag) {
2040 return (unsigned)!D.isIgnored(diag, SourceLocation());
2041 }
2042
AnalysisBasedWarnings(Sema & s)2043 clang::sema::AnalysisBasedWarnings::AnalysisBasedWarnings(Sema &s)
2044 : S(s),
2045 NumFunctionsAnalyzed(0),
2046 NumFunctionsWithBadCFGs(0),
2047 NumCFGBlocks(0),
2048 MaxCFGBlocksPerFunction(0),
2049 NumUninitAnalysisFunctions(0),
2050 NumUninitAnalysisVariables(0),
2051 MaxUninitAnalysisVariablesPerFunction(0),
2052 NumUninitAnalysisBlockVisits(0),
2053 MaxUninitAnalysisBlockVisitsPerFunction(0) {
2054
2055 using namespace diag;
2056 DiagnosticsEngine &D = S.getDiagnostics();
2057
2058 DefaultPolicy.enableCheckUnreachable =
2059 isEnabled(D, warn_unreachable) ||
2060 isEnabled(D, warn_unreachable_break) ||
2061 isEnabled(D, warn_unreachable_return) ||
2062 isEnabled(D, warn_unreachable_loop_increment);
2063
2064 DefaultPolicy.enableThreadSafetyAnalysis =
2065 isEnabled(D, warn_double_lock);
2066
2067 DefaultPolicy.enableConsumedAnalysis =
2068 isEnabled(D, warn_use_in_invalid_state);
2069 }
2070
flushDiagnostics(Sema & S,const sema::FunctionScopeInfo * fscope)2071 static void flushDiagnostics(Sema &S, const sema::FunctionScopeInfo *fscope) {
2072 for (const auto &D : fscope->PossiblyUnreachableDiags)
2073 S.Diag(D.Loc, D.PD);
2074 }
2075
2076 void clang::sema::
IssueWarnings(sema::AnalysisBasedWarnings::Policy P,sema::FunctionScopeInfo * fscope,const Decl * D,QualType BlockType)2077 AnalysisBasedWarnings::IssueWarnings(sema::AnalysisBasedWarnings::Policy P,
2078 sema::FunctionScopeInfo *fscope,
2079 const Decl *D, QualType BlockType) {
2080
2081 // We avoid doing analysis-based warnings when there are errors for
2082 // two reasons:
2083 // (1) The CFGs often can't be constructed (if the body is invalid), so
2084 // don't bother trying.
2085 // (2) The code already has problems; running the analysis just takes more
2086 // time.
2087 DiagnosticsEngine &Diags = S.getDiagnostics();
2088
2089 // Do not do any analysis if we are going to just ignore them.
2090 if (Diags.getIgnoreAllWarnings() ||
2091 (Diags.getSuppressSystemWarnings() &&
2092 S.SourceMgr.isInSystemHeader(D->getLocation())))
2093 return;
2094
2095 // For code in dependent contexts, we'll do this at instantiation time.
2096 if (cast<DeclContext>(D)->isDependentContext())
2097 return;
2098
2099 if (S.hasUncompilableErrorOccurred()) {
2100 // Flush out any possibly unreachable diagnostics.
2101 flushDiagnostics(S, fscope);
2102 return;
2103 }
2104
2105 const Stmt *Body = D->getBody();
2106 assert(Body);
2107
2108 // Construct the analysis context with the specified CFG build options.
2109 AnalysisDeclContext AC(/* AnalysisDeclContextManager */ nullptr, D);
2110
2111 // Don't generate EH edges for CallExprs as we'd like to avoid the n^2
2112 // explosion for destructors that can result and the compile time hit.
2113 AC.getCFGBuildOptions().PruneTriviallyFalseEdges = true;
2114 AC.getCFGBuildOptions().AddEHEdges = false;
2115 AC.getCFGBuildOptions().AddInitializers = true;
2116 AC.getCFGBuildOptions().AddImplicitDtors = true;
2117 AC.getCFGBuildOptions().AddTemporaryDtors = true;
2118 AC.getCFGBuildOptions().AddCXXNewAllocator = false;
2119 AC.getCFGBuildOptions().AddCXXDefaultInitExprInCtors = true;
2120
2121 // Force that certain expressions appear as CFGElements in the CFG. This
2122 // is used to speed up various analyses.
2123 // FIXME: This isn't the right factoring. This is here for initial
2124 // prototyping, but we need a way for analyses to say what expressions they
2125 // expect to always be CFGElements and then fill in the BuildOptions
2126 // appropriately. This is essentially a layering violation.
2127 if (P.enableCheckUnreachable || P.enableThreadSafetyAnalysis ||
2128 P.enableConsumedAnalysis) {
2129 // Unreachable code analysis and thread safety require a linearized CFG.
2130 AC.getCFGBuildOptions().setAllAlwaysAdd();
2131 }
2132 else {
2133 AC.getCFGBuildOptions()
2134 .setAlwaysAdd(Stmt::BinaryOperatorClass)
2135 .setAlwaysAdd(Stmt::CompoundAssignOperatorClass)
2136 .setAlwaysAdd(Stmt::BlockExprClass)
2137 .setAlwaysAdd(Stmt::CStyleCastExprClass)
2138 .setAlwaysAdd(Stmt::DeclRefExprClass)
2139 .setAlwaysAdd(Stmt::ImplicitCastExprClass)
2140 .setAlwaysAdd(Stmt::UnaryOperatorClass)
2141 .setAlwaysAdd(Stmt::AttributedStmtClass);
2142 }
2143
2144 // Install the logical handler.
2145 llvm::Optional<LogicalErrorHandler> LEH;
2146 if (LogicalErrorHandler::hasActiveDiagnostics(Diags, D->getBeginLoc())) {
2147 LEH.emplace(S);
2148 AC.getCFGBuildOptions().Observer = &*LEH;
2149 }
2150
2151 // Emit delayed diagnostics.
2152 if (!fscope->PossiblyUnreachableDiags.empty()) {
2153 bool analyzed = false;
2154
2155 // Register the expressions with the CFGBuilder.
2156 for (const auto &D : fscope->PossiblyUnreachableDiags) {
2157 for (const Stmt *S : D.Stmts)
2158 AC.registerForcedBlockExpression(S);
2159 }
2160
2161 if (AC.getCFG()) {
2162 analyzed = true;
2163 for (const auto &D : fscope->PossiblyUnreachableDiags) {
2164 bool AllReachable = true;
2165 for (const Stmt *S : D.Stmts) {
2166 const CFGBlock *block = AC.getBlockForRegisteredExpression(S);
2167 CFGReverseBlockReachabilityAnalysis *cra =
2168 AC.getCFGReachablityAnalysis();
2169 // FIXME: We should be able to assert that block is non-null, but
2170 // the CFG analysis can skip potentially-evaluated expressions in
2171 // edge cases; see test/Sema/vla-2.c.
2172 if (block && cra) {
2173 // Can this block be reached from the entrance?
2174 if (!cra->isReachable(&AC.getCFG()->getEntry(), block)) {
2175 AllReachable = false;
2176 break;
2177 }
2178 }
2179 // If we cannot map to a basic block, assume the statement is
2180 // reachable.
2181 }
2182
2183 if (AllReachable)
2184 S.Diag(D.Loc, D.PD);
2185 }
2186 }
2187
2188 if (!analyzed)
2189 flushDiagnostics(S, fscope);
2190 }
2191
2192 // Warning: check missing 'return'
2193 if (P.enableCheckFallThrough) {
2194 const CheckFallThroughDiagnostics &CD =
2195 (isa<BlockDecl>(D)
2196 ? CheckFallThroughDiagnostics::MakeForBlock()
2197 : (isa<CXXMethodDecl>(D) &&
2198 cast<CXXMethodDecl>(D)->getOverloadedOperator() == OO_Call &&
2199 cast<CXXMethodDecl>(D)->getParent()->isLambda())
2200 ? CheckFallThroughDiagnostics::MakeForLambda()
2201 : (fscope->isCoroutine()
2202 ? CheckFallThroughDiagnostics::MakeForCoroutine(D)
2203 : CheckFallThroughDiagnostics::MakeForFunction(D)));
2204 CheckFallThroughForBody(S, D, Body, BlockType, CD, AC, fscope);
2205 }
2206
2207 // Warning: check for unreachable code
2208 if (P.enableCheckUnreachable) {
2209 // Only check for unreachable code on non-template instantiations.
2210 // Different template instantiations can effectively change the control-flow
2211 // and it is very difficult to prove that a snippet of code in a template
2212 // is unreachable for all instantiations.
2213 bool isTemplateInstantiation = false;
2214 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D))
2215 isTemplateInstantiation = Function->isTemplateInstantiation();
2216 if (!isTemplateInstantiation)
2217 CheckUnreachable(S, AC);
2218 }
2219
2220 // Check for thread safety violations
2221 if (P.enableThreadSafetyAnalysis) {
2222 SourceLocation FL = AC.getDecl()->getLocation();
2223 SourceLocation FEL = AC.getDecl()->getEndLoc();
2224 threadSafety::ThreadSafetyReporter Reporter(S, FL, FEL);
2225 if (!Diags.isIgnored(diag::warn_thread_safety_beta, D->getBeginLoc()))
2226 Reporter.setIssueBetaWarnings(true);
2227 if (!Diags.isIgnored(diag::warn_thread_safety_verbose, D->getBeginLoc()))
2228 Reporter.setVerbose(true);
2229
2230 threadSafety::runThreadSafetyAnalysis(AC, Reporter,
2231 &S.ThreadSafetyDeclCache);
2232 Reporter.emitDiagnostics();
2233 }
2234
2235 // Check for violations of consumed properties.
2236 if (P.enableConsumedAnalysis) {
2237 consumed::ConsumedWarningsHandler WarningHandler(S);
2238 consumed::ConsumedAnalyzer Analyzer(WarningHandler);
2239 Analyzer.run(AC);
2240 }
2241
2242 if (!Diags.isIgnored(diag::warn_uninit_var, D->getBeginLoc()) ||
2243 !Diags.isIgnored(diag::warn_sometimes_uninit_var, D->getBeginLoc()) ||
2244 !Diags.isIgnored(diag::warn_maybe_uninit_var, D->getBeginLoc()) ||
2245 !Diags.isIgnored(diag::warn_uninit_const_reference, D->getBeginLoc())) {
2246 if (CFG *cfg = AC.getCFG()) {
2247 UninitValsDiagReporter reporter(S);
2248 UninitVariablesAnalysisStats stats;
2249 std::memset(&stats, 0, sizeof(UninitVariablesAnalysisStats));
2250 runUninitializedVariablesAnalysis(*cast<DeclContext>(D), *cfg, AC,
2251 reporter, stats);
2252
2253 if (S.CollectStats && stats.NumVariablesAnalyzed > 0) {
2254 ++NumUninitAnalysisFunctions;
2255 NumUninitAnalysisVariables += stats.NumVariablesAnalyzed;
2256 NumUninitAnalysisBlockVisits += stats.NumBlockVisits;
2257 MaxUninitAnalysisVariablesPerFunction =
2258 std::max(MaxUninitAnalysisVariablesPerFunction,
2259 stats.NumVariablesAnalyzed);
2260 MaxUninitAnalysisBlockVisitsPerFunction =
2261 std::max(MaxUninitAnalysisBlockVisitsPerFunction,
2262 stats.NumBlockVisits);
2263 }
2264 }
2265 }
2266
2267 bool FallThroughDiagFull =
2268 !Diags.isIgnored(diag::warn_unannotated_fallthrough, D->getBeginLoc());
2269 bool FallThroughDiagPerFunction = !Diags.isIgnored(
2270 diag::warn_unannotated_fallthrough_per_function, D->getBeginLoc());
2271 if (FallThroughDiagFull || FallThroughDiagPerFunction ||
2272 fscope->HasFallthroughStmt) {
2273 DiagnoseSwitchLabelsFallthrough(S, AC, !FallThroughDiagFull);
2274 }
2275
2276 if (S.getLangOpts().ObjCWeak &&
2277 !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, D->getBeginLoc()))
2278 diagnoseRepeatedUseOfWeak(S, fscope, D, AC.getParentMap());
2279
2280
2281 // Check for infinite self-recursion in functions
2282 if (!Diags.isIgnored(diag::warn_infinite_recursive_function,
2283 D->getBeginLoc())) {
2284 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2285 checkRecursiveFunction(S, FD, Body, AC);
2286 }
2287 }
2288
2289 // Check for throw out of non-throwing function.
2290 if (!Diags.isIgnored(diag::warn_throw_in_noexcept_func, D->getBeginLoc()))
2291 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
2292 if (S.getLangOpts().CPlusPlus && isNoexcept(FD))
2293 checkThrowInNonThrowingFunc(S, FD, AC);
2294
2295 // If none of the previous checks caused a CFG build, trigger one here
2296 // for the logical error handler.
2297 if (LogicalErrorHandler::hasActiveDiagnostics(Diags, D->getBeginLoc())) {
2298 AC.getCFG();
2299 }
2300
2301 // Collect statistics about the CFG if it was built.
2302 if (S.CollectStats && AC.isCFGBuilt()) {
2303 ++NumFunctionsAnalyzed;
2304 if (CFG *cfg = AC.getCFG()) {
2305 // If we successfully built a CFG for this context, record some more
2306 // detail information about it.
2307 NumCFGBlocks += cfg->getNumBlockIDs();
2308 MaxCFGBlocksPerFunction = std::max(MaxCFGBlocksPerFunction,
2309 cfg->getNumBlockIDs());
2310 } else {
2311 ++NumFunctionsWithBadCFGs;
2312 }
2313 }
2314 }
2315
PrintStats() const2316 void clang::sema::AnalysisBasedWarnings::PrintStats() const {
2317 llvm::errs() << "\n*** Analysis Based Warnings Stats:\n";
2318
2319 unsigned NumCFGsBuilt = NumFunctionsAnalyzed - NumFunctionsWithBadCFGs;
2320 unsigned AvgCFGBlocksPerFunction =
2321 !NumCFGsBuilt ? 0 : NumCFGBlocks/NumCFGsBuilt;
2322 llvm::errs() << NumFunctionsAnalyzed << " functions analyzed ("
2323 << NumFunctionsWithBadCFGs << " w/o CFGs).\n"
2324 << " " << NumCFGBlocks << " CFG blocks built.\n"
2325 << " " << AvgCFGBlocksPerFunction
2326 << " average CFG blocks per function.\n"
2327 << " " << MaxCFGBlocksPerFunction
2328 << " max CFG blocks per function.\n";
2329
2330 unsigned AvgUninitVariablesPerFunction = !NumUninitAnalysisFunctions ? 0
2331 : NumUninitAnalysisVariables/NumUninitAnalysisFunctions;
2332 unsigned AvgUninitBlockVisitsPerFunction = !NumUninitAnalysisFunctions ? 0
2333 : NumUninitAnalysisBlockVisits/NumUninitAnalysisFunctions;
2334 llvm::errs() << NumUninitAnalysisFunctions
2335 << " functions analyzed for uninitialiazed variables\n"
2336 << " " << NumUninitAnalysisVariables << " variables analyzed.\n"
2337 << " " << AvgUninitVariablesPerFunction
2338 << " average variables per function.\n"
2339 << " " << MaxUninitAnalysisVariablesPerFunction
2340 << " max variables per function.\n"
2341 << " " << NumUninitAnalysisBlockVisits << " block visits.\n"
2342 << " " << AvgUninitBlockVisitsPerFunction
2343 << " average block visits per function.\n"
2344 << " " << MaxUninitAnalysisBlockVisitsPerFunction
2345 << " max block visits per function.\n";
2346 }
2347