Index: clang/lib/Analysis/UnsafeBufferUsage.cpp =================================================================== --- clang/lib/Analysis/UnsafeBufferUsage.cpp +++ clang/lib/Analysis/UnsafeBufferUsage.cpp @@ -2139,6 +2139,17 @@ UnsafeBufferUsageHandler &Handler, bool EmitSuggestions) { assert(D && D->getBody()); + + // Do not emit fixit suggestions for functions declared in an + // extern "C" block. + if (D->getKind() == Decl::Function) { + for (FunctionDecl *FReDecl : dyn_cast(D)->redecls()) { + if (FReDecl->isExternC()) { + EmitSuggestions = false; + } + } + } + WarningGadgetSets UnsafeOps; FixableGadgetSets FixablesForAllVars; Index: clang/test/SemaCXX/warn-unsafe-buffer-usage-c-linkage.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/warn-unsafe-buffer-usage-c-linkage.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage -fsafe-buffer-usage-suggestions -verify %s + +extern "C" { +void foo(int *ptr) { + ptr[5] = 10; // expected-warning{{unsafe buffer access}} +} + +void bar(int *ptr); + +struct c_struct { + char *name; +}; +} + +void bar(int *ptr) { + ptr[5] = 10; // expected-warning{{unsafe buffer access}} +} + +void call_foo(int *p) { + foo(p); + struct c_struct str; + str.name[7] = 9; // expected-warning{{unsafe buffer access}} + bar(p); +}