summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/ScanfFormatString.cpp
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2012-07-31 16:37:47 +0000
committerHans Wennborg <hans@hanshq.net>2012-07-31 16:37:47 +0000
commit16250c7c1847184f543d8a837512765cd6eb4bda (patch)
tree4a296ac236ec9a95e1252490ad4cfd47f91d7ba9 /clang/lib/Analysis/ScanfFormatString.cpp
parente8a21b73ac5b4d84981fc813db9d8254a45ae477 (diff)
downloadbcm5719-llvm-16250c7c1847184f543d8a837512765cd6eb4bda.tar.gz
bcm5719-llvm-16250c7c1847184f543d8a837512765cd6eb4bda.zip
-Wformat: better handling of qualifiers on pointer arguments
Warn about using pointers to const-qualified types as arguments to scanf. Ignore the volatile qualifier when checking if types match. llvm-svn: 161052
Diffstat (limited to 'clang/lib/Analysis/ScanfFormatString.cpp')
-rw-r--r--clang/lib/Analysis/ScanfFormatString.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/Analysis/ScanfFormatString.cpp b/clang/lib/Analysis/ScanfFormatString.cpp
index 3c848f1f093..1bbd5f2d296 100644
--- a/clang/lib/Analysis/ScanfFormatString.cpp
+++ b/clang/lib/Analysis/ScanfFormatString.cpp
@@ -453,6 +453,15 @@ bool clang::analyze_format_string::ParseScanfString(FormatStringHandler &H,
}
bool ScanfArgTypeResult::matchesType(ASTContext& C, QualType argTy) const {
+ // It has to be a pointer type.
+ const PointerType *PT = argTy->getAs<PointerType>();
+ if (!PT)
+ return false;
+
+ // We cannot write through a const qualified pointer.
+ if (PT->getPointeeType().isConstQualified())
+ return false;
+
switch (K) {
case InvalidTy:
llvm_unreachable("ArgTypeResult must be valid");
@@ -463,9 +472,6 @@ bool ScanfArgTypeResult::matchesType(ASTContext& C, QualType argTy) const {
case WCStrTy:
return ArgTypeResult(ArgTypeResult::WCStrTy).matchesType(C, argTy);
case PtrToArgTypeResultTy: {
- const PointerType *PT = argTy->getAs<PointerType>();
- if (!PT)
- return false;
return A.matchesType(C, PT->getPointeeType());
}
}
OpenPOWER on IntegriCloud