diff options
author | Anna Zaks <ganna@apple.com> | 2013-06-18 23:16:15 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2013-06-18 23:16:15 +0000 |
commit | 03256467050bddd9e6c69a4cdaded7e79beb46fa (patch) | |
tree | 58368a048e03274ce5d7ccfa2675a5dae27fce90 /clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp | |
parent | 6b083889400594b07f7f9f084e3246cd8370e949 (diff) | |
download | bcm5719-llvm-03256467050bddd9e6c69a4cdaded7e79beb46fa.tar.gz bcm5719-llvm-03256467050bddd9e6c69a4cdaded7e79beb46fa.zip |
[analyzer] Do not report uninitialized value warnings inside swap functions.
This silences warnings that could occur when one is swapping partially initialized structs. We suppress
not only the assignments of uninitialized members, but any values inside swap because swap could
potentially be used as a subroutine to swap class members.
This silences a warning from std::try::function::swap() on partially initialized objects.
llvm-svn: 184256
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp index e04f49c3746..016e3c80459 100644 --- a/clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp @@ -38,6 +38,14 @@ void UndefinedAssignmentChecker::checkBind(SVal location, SVal val, if (!val.isUndef()) return; + // Do not report assignments of uninitialized values inside swap functions. + // This should allow to swap partially uninitialized structs + // (radar://14129997) + if (const FunctionDecl *EnclosingFunctionDecl = + dyn_cast<FunctionDecl>(C.getStackFrame()->getDecl())) + if (C.getCalleeName(EnclosingFunctionDecl) == "swap") + return; + ExplodedNode *N = C.generateSink(); if (!N) |