Skip to content

Commit e261352

Browse files
committed
[-Wunsafe-buffer-usage] Fix a bug and suppress libc warnings for C files
- Fix a bug in UnsafeBufferUsage.cpp related to casting to PointerType - Suppress -Wunsafe-buffer-usage-in-libc-call for C files (rdar://117182250)
1 parent e0ad34e commit e261352

File tree

3 files changed

+18
-5
lines changed

3 files changed

+18
-5
lines changed

clang/lib/Analysis/UnsafeBufferUsage.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,9 @@ AST_MATCHER_P(Stmt, ignoreUnsafeBufferInContainer,
250250

251251
AST_MATCHER_P(Stmt, ignoreUnsafeLibcCall, const UnsafeBufferUsageHandler *,
252252
Handler) {
253-
return Handler->ignoreUnsafeBufferInLibcCall(Node.getBeginLoc());
253+
if (Finder->getASTContext().getLangOpts().CPlusPlus)
254+
return Handler->ignoreUnsafeBufferInLibcCall(Node.getBeginLoc());
255+
return true; /* Only warn about libc calls for C++ */
254256
}
255257

256258
AST_MATCHER_P(CastExpr, castSubExpr, internal::Matcher<Expr>, innerMatcher) {
@@ -789,7 +791,7 @@ AST_MATCHER_P(CallExpr, hasUnsafePrintfStringArg,
789791
if (!FristParmTy->isPointerType())
790792
return false; // possibly some user-defined printf function
791793

792-
QualType FirstPteTy = (cast<PointerType>(FristParmTy))->getPointeeType();
794+
QualType FirstPteTy = FristParmTy->getAs<PointerType>()->getPointeeType();
793795

794796
if (!Ctx.getFILEType()
795797
.isNull() && //`FILE *` must be in the context if it is fprintf
@@ -865,7 +867,7 @@ AST_MATCHER(CallExpr, hasUnsafeSnprintfBuffer) {
865867
if (!FirstParmTy->isPointerType())
866868
return false; // Not an snprint
867869

868-
QualType FirstPteTy = cast<PointerType>(FirstParmTy)->getPointeeType();
870+
QualType FirstPteTy = FirstParmTy->getAs<PointerType>()->getPointeeType();
869871
const Expr *Buf = Node.getArg(0), *Size = Node.getArg(1);
870872

871873
if (FirstPteTy.isConstQualified() || !Buf->getType()->isPointerType() ||

clang/lib/Sema/AnalysisBasedWarnings.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2549,6 +2549,7 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
25492549
DiagnosticOptions &DiagOpts = Diags.getDiagnosticOptions();
25502550

25512551
// UnsafeBufferUsage analysis settings.
2552+
bool IsCXXLang = S.getLangOpts().CPlusPlus;
25522553
bool UnsafeBufferUsageCanEmitSuggestions = S.getLangOpts().CPlusPlus20;
25532554
bool UnsafeBufferUsageShouldEmitSuggestions = // Should != Can.
25542555
UnsafeBufferUsageCanEmitSuggestions &&
@@ -2567,8 +2568,9 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
25672568
Node->getBeginLoc()) ||
25682569
!Diags.isIgnored(diag::warn_unsafe_buffer_usage_in_container,
25692570
Node->getBeginLoc()) ||
2570-
!Diags.isIgnored(diag::warn_unsafe_buffer_libc_call,
2571-
Node->getBeginLoc())) {
2571+
(!Diags.isIgnored(diag::warn_unsafe_buffer_libc_call,
2572+
Node->getBeginLoc()) &&
2573+
IsCXXLang /* we only warn about libc calls in C++ files */)) {
25722574
clang::checkUnsafeBufferUsage(Node, R,
25732575
UnsafeBufferUsageShouldEmitSuggestions);
25742576
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %clang_cc1 -Wunsafe-buffer-usage %s -verify %s
2+
3+
void* memcpy(void *dst,const void *src, unsigned long size);
4+
5+
void f(int *p, int *q) {
6+
7+
memcpy(p, q, 10); // no libc warn in C
8+
++p[5]; // expected-warning{{unsafe buffer access}}
9+
}

0 commit comments

Comments
 (0)