- Notifications
You must be signed in to change notification settings - Fork14.5k
[Sanitize] fix crash in -fsanitize-annotate-debug-info#149237
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
[Sanitize] fix crash in -fsanitize-annotate-debug-info#149237
Conversation
Created using spr 1.3.4
llvmbot commentedJul 17, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
@llvm/pr-subscribers-debuginfo @llvm/pr-subscribers-clang Author: Florian Mayer (fmayer) ChangesFull diff:https://github.com/llvm/llvm-project/pull/149237.diff 2 Files Affected:
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cppindex 75ee08a2bcfa6..f1a3ae2e057b2 100644--- a/clang/lib/CodeGen/CGDebugInfo.cpp+++ b/clang/lib/CodeGen/CGDebugInfo.cpp@@ -6480,20 +6480,23 @@ SanitizerOrdinalToCheckLabel(SanitizerKind::SanitizerOrdinal Ordinal) { llvm::DILocation *CodeGenFunction::SanitizerAnnotateDebugInfo( ArrayRef<SanitizerKind::SanitizerOrdinal> Ordinals, SanitizerHandler Handler) {+ llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation();+ auto *DI = getDebugInfo();+ if (!DI)+ return CheckDI;+ std::string Label; if (Ordinals.size() == 1) Label = SanitizerOrdinalToCheckLabel(Ordinals[0]); else Label = SanitizerHandlerToCheckLabel(Handler);- llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation();- for (auto Ord : Ordinals) { // TODO: deprecate ClArrayBoundsPseudoFn if (((ClArrayBoundsPseudoFn && Ord == SanitizerKind::SO_ArrayBounds) || CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(Ord)) && CheckDI) {- return getDebugInfo()->CreateSyntheticInlineAt(CheckDI, Label);+ return DI->CreateSyntheticInlineAt(CheckDI, Label); } }diff --git a/clang/test/CodeGen/null-sanitizer-debug-info-regression.cpp b/clang/test/CodeGen/null-sanitizer-debug-info-regression.cppnew file mode 100644index 0000000000000..0b62f24177bbd--- /dev/null+++ b/clang/test/CodeGen/null-sanitizer-debug-info-regression.cpp@@ -0,0 +1,5 @@+// RUN: %clangxx -g -fsanitize=null -fsanitize-trap=all -fsanitize-annotate-debug-info=all -O2 -std=c++17 -c -o /dev/null %s++struct foo {+ foo(int, long, const int & = int());+} foo(0, 0); |
@llvm/pr-subscribers-clang-codegen Author: Florian Mayer (fmayer) ChangesFull diff:https://github.com/llvm/llvm-project/pull/149237.diff 2 Files Affected:
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cppindex 75ee08a2bcfa6..f1a3ae2e057b2 100644--- a/clang/lib/CodeGen/CGDebugInfo.cpp+++ b/clang/lib/CodeGen/CGDebugInfo.cpp@@ -6480,20 +6480,23 @@ SanitizerOrdinalToCheckLabel(SanitizerKind::SanitizerOrdinal Ordinal) { llvm::DILocation *CodeGenFunction::SanitizerAnnotateDebugInfo( ArrayRef<SanitizerKind::SanitizerOrdinal> Ordinals, SanitizerHandler Handler) {+ llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation();+ auto *DI = getDebugInfo();+ if (!DI)+ return CheckDI;+ std::string Label; if (Ordinals.size() == 1) Label = SanitizerOrdinalToCheckLabel(Ordinals[0]); else Label = SanitizerHandlerToCheckLabel(Handler);- llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation();- for (auto Ord : Ordinals) { // TODO: deprecate ClArrayBoundsPseudoFn if (((ClArrayBoundsPseudoFn && Ord == SanitizerKind::SO_ArrayBounds) || CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(Ord)) && CheckDI) {- return getDebugInfo()->CreateSyntheticInlineAt(CheckDI, Label);+ return DI->CreateSyntheticInlineAt(CheckDI, Label); } }diff --git a/clang/test/CodeGen/null-sanitizer-debug-info-regression.cpp b/clang/test/CodeGen/null-sanitizer-debug-info-regression.cppnew file mode 100644index 0000000000000..0b62f24177bbd--- /dev/null+++ b/clang/test/CodeGen/null-sanitizer-debug-info-regression.cpp@@ -0,0 +1,5 @@+// RUN: %clangxx -g -fsanitize=null -fsanitize-trap=all -fsanitize-annotate-debug-info=all -O2 -std=c++17 -c -o /dev/null %s++struct foo {+ foo(int, long, const int & = int());+} foo(0, 0); |
clang/lib/CodeGen/CGDebugInfo.cpp Outdated
@@ -6480,20 +6480,23 @@ SanitizerOrdinalToCheckLabel(SanitizerKind::SanitizerOrdinal Ordinal) { | |||
llvm::DILocation *CodeGenFunction::SanitizerAnnotateDebugInfo( | |||
ArrayRef<SanitizerKind::SanitizerOrdinal> Ordinals, | |||
SanitizerHandler Handler) { | |||
llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Nit: variable naming - "CheckDI" is a DILocation, not DebugInfo like the similarly named "DI".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
done
clang/lib/CodeGen/CGDebugInfo.cpp Outdated
std::string Label; | ||
if (Ordinals.size() == 1) | ||
Label = SanitizerOrdinalToCheckLabel(Ordinals[0]); | ||
else | ||
Label = SanitizerHandlerToCheckLabel(Handler); | ||
llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation(); | ||
for (auto Ord : Ordinals) { | ||
// TODO: deprecate ClArrayBoundsPseudoFn | ||
if (((ClArrayBoundsPseudoFn && Ord == SanitizerKind::SO_ArrayBounds) || | ||
CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(Ord)) && | ||
CheckDI) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Q: does the DI check above provide any guarantees that CheckDI is non-null? (i.e., can&& CheckDI
be safely elided or does it require further working group approval?)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
No, we need to check both.
0f09f2c
intomainUh oh!
There was an error while loading.Please reload this page.
No description provided.