From db57951b7d113d793864fbe12bf764eaed5427c5 Mon Sep 17 00:00:00 2001 From: zhangziyao Date: Wed, 18 Jun 2025 16:32:05 +0800 Subject: [PATCH] [source2source] fixed a bug of incorrect use of getCharacterData leading to coredump --- clang/lib/Frontend/Rewrite/RewriteBSC.cpp | 18 +++++++++++++----- .../rewrite-bsc/rewrite_bsc_func_attr/a.h | 5 +++++ .../rewrite-bsc/rewrite_bsc_func_attr/b.h | 1 + .../rewrite-bsc/rewrite_bsc_func_attr/c.hbs | 5 +++++ .../rewrite_bsc_func_attr.cbs | 17 +++++++++++++++++ 5 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/a.h create mode 100644 clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/b.h create mode 100644 clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/c.hbs create mode 100644 clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/rewrite_bsc_func_attr.cbs diff --git a/clang/lib/Frontend/Rewrite/RewriteBSC.cpp b/clang/lib/Frontend/Rewrite/RewriteBSC.cpp index 8d98c5aac561..35b3d00c23e1 100644 --- a/clang/lib/Frontend/Rewrite/RewriteBSC.cpp +++ b/clang/lib/Frontend/Rewrite/RewriteBSC.cpp @@ -790,11 +790,19 @@ void RewriteBSC::RewriteNonGenericFuncAndVar(std::vector &DeclList) { PrintDebugLineInfo(FD); FD->print(Buf, Policy); } else { - const char *startBuf = SM->getCharacterData(FD->getBeginLoc()); - const char *endBuf = SM->getCharacterData(FD->getEndLoc()); - if (startBuf == endBuf) - break; - Buf << std::string(startBuf, endBuf - startBuf + 1); + bool Invalid = false; + Lexer::getSourceText( + CharSourceRange::getCharRange(FD->getSourceRange()), *SM, + LangOpts, &Invalid); + if (Invalid) { + FD->print(Buf, Policy); + } else { + const char *startBuf = SM->getCharacterData(FD->getBeginLoc()); + const char *endBuf = SM->getCharacterData(FD->getEndLoc()); + if (startBuf == endBuf) + break; + Buf << std::string(startBuf, endBuf - startBuf + 1); + } if (FD->isThisDeclarationADefinition()) { Buf << "\n"; } diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/a.h b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/a.h new file mode 100644 index 000000000000..5a38ea5a31fe --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/a.h @@ -0,0 +1,5 @@ +#include "b.h" +#include "c.hbs" + + +void foo(const char *a, const char *b, ...) FMT_PRINT(2, 3); \ No newline at end of file diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/b.h b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/b.h new file mode 100644 index 000000000000..12adf0bb65c0 --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/b.h @@ -0,0 +1 @@ +#define FMT_PRINT(a, b) __attribute__((format(printf, (a), (b)))) \ No newline at end of file diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/c.hbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/c.hbs new file mode 100644 index 000000000000..ad7f982540ea --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/c.hbs @@ -0,0 +1,5 @@ +#include +#include +#include +#include +#include diff --git a/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/rewrite_bsc_func_attr.cbs b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/rewrite_bsc_func_attr.cbs new file mode 100644 index 000000000000..2cf2d29eb28e --- /dev/null +++ b/clang/test/BSC/Positive/Driver/rewrite-bsc/rewrite_bsc_func_attr/rewrite_bsc_func_attr.cbs @@ -0,0 +1,17 @@ +// RUN: %clang -c %s -o %t.output.o +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: FileCheck --input-file=%t-rw.c %s +// RUN: %clang -c %t-rw.c -o %t-rw.output -I%S +// expected-no-diagnostics + +#include "a.h" + +// CHECK: #include "b.h" +// CHECK-NEXT: #include +// CHECK-NEXT: #include +// CHECK-NEXT: #include +// CHECK-NEXT: #include +// CHECK-NEXT: #include +// CHECK-EMPTY: +// CHECK-EMPTY: +// CHECK-NEXT: __attribute__((format(printf, 2, 3))) void foo(const char *a, const char *b, ...); -- Gitee