[clang] 45b874b - [UBSan] Support src:*=sanitize for multiple ignorelists. (#141640)
via cfe-commits
cfe-commits at lists.llvm.org
Wed May 28 08:12:56 PDT 2025
Author: Qinkun Bao
Date: 2025-05-28T11:12:53-04:00
New Revision: 45b874bc57af1520a1a6a3118f45d12c48704987
URL: https://github.com/llvm/llvm-project/commit/45b874bc57af1520a1a6a3118f45d12c48704987
DIFF: https://github.com/llvm/llvm-project/commit/45b874bc57af1520a1a6a3118f45d12c48704987.diff
LOG: [UBSan] Support src:*=sanitize for multiple ignorelists. (#141640)
See: https://github.com/llvm/llvm-project/issues/139128 and
https://github.com/llvm/llvm-project/pull/140529 for the background.
The introduction of these new tests (ubsan-src-ignorelist-category.test)
`-fsanitize-ignorelist=%t/src.ignorelist
-fsanitize-ignorelist=%t/src.ignorelist.contradict9` in this PR will not
lead to failures in the previous implementation (without this PR). This
is because the existing logic distinguishes between Sections in
different ignorelists, even if their names are identical. The order of
these Sections is preserved using a `vector`.
Added:
Modified:
clang/include/clang/Basic/SanitizerSpecialCaseList.h
clang/lib/Basic/NoSanitizeList.cpp
clang/lib/Basic/SanitizerSpecialCaseList.cpp
clang/test/CodeGen/ubsan-src-ignorelist-category.test
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/SanitizerSpecialCaseList.h b/clang/include/clang/Basic/SanitizerSpecialCaseList.h
index 25d518e7128cf..cf7485909e409 100644
--- a/clang/include/clang/Basic/SanitizerSpecialCaseList.h
+++ b/clang/include/clang/Basic/SanitizerSpecialCaseList.h
@@ -19,6 +19,7 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/SpecialCaseList.h"
#include <memory>
+#include <utility>
#include <vector>
namespace llvm {
@@ -44,20 +45,24 @@ class SanitizerSpecialCaseList : public llvm::SpecialCaseList {
StringRef Category = StringRef()) const;
// Query ignorelisted entries if any bit in Mask matches the entry's section.
- // Return 0 if not found. If found, return the line number (starts with 1).
- unsigned inSectionBlame(SanitizerMask Mask, StringRef Prefix, StringRef Query,
- StringRef Category = StringRef()) const;
+ // Return NotFound (0,0) if not found. If found, return the file index number
+ // and the line number (FileIdx, LineNo) (FileIdx starts with 1 and LineNo
+ // starts with 0).
+ std::pair<unsigned, unsigned>
+ inSectionBlame(SanitizerMask Mask, StringRef Prefix, StringRef Query,
+ StringRef Category = StringRef()) const;
protected:
// Initialize SanitizerSections.
void createSanitizerSections();
struct SanitizerSection {
- SanitizerSection(SanitizerMask SM, SectionEntries &E)
- : Mask(SM), Entries(E) {};
+ SanitizerSection(SanitizerMask SM, SectionEntries &E, unsigned idx)
+ : Mask(SM), Entries(E), FileIdx(idx) {};
SanitizerMask Mask;
SectionEntries &Entries;
+ unsigned FileIdx;
};
std::vector<SanitizerSection> SanitizerSections;
diff --git a/clang/lib/Basic/NoSanitizeList.cpp b/clang/lib/Basic/NoSanitizeList.cpp
index 97e2acc2116b1..a3ca463fc8efb 100644
--- a/clang/lib/Basic/NoSanitizeList.cpp
+++ b/clang/lib/Basic/NoSanitizeList.cpp
@@ -44,13 +44,11 @@ bool NoSanitizeList::containsFunction(SanitizerMask Mask,
bool NoSanitizeList::containsFile(SanitizerMask Mask, StringRef FileName,
StringRef Category) const {
- unsigned NoSanLine = SSCL->inSectionBlame(Mask, "src", FileName, Category);
- if (NoSanLine == 0)
+ auto NoSan = SSCL->inSectionBlame(Mask, "src", FileName, Category);
+ if (NoSan == llvm::SpecialCaseList::NotFound)
return false;
- unsigned SanLine = SSCL->inSectionBlame(Mask, "src", FileName, "sanitize");
- // If we have two cases such as `src:a.cpp=sanitize` and `src:a.cpp`, the
- // current entry override the previous entry.
- return !SanLine || NoSanLine > SanLine;
+ auto San = SSCL->inSectionBlame(Mask, "src", FileName, "sanitize");
+ return San == llvm::SpecialCaseList::NotFound || NoSan > San;
}
bool NoSanitizeList::containsMainFile(SanitizerMask Mask, StringRef FileName,
diff --git a/clang/lib/Basic/SanitizerSpecialCaseList.cpp b/clang/lib/Basic/SanitizerSpecialCaseList.cpp
index bb68763b817e6..f7bc1d5545d75 100644
--- a/clang/lib/Basic/SanitizerSpecialCaseList.cpp
+++ b/clang/lib/Basic/SanitizerSpecialCaseList.cpp
@@ -50,27 +50,27 @@ void SanitizerSpecialCaseList::createSanitizerSections() {
#undef SANITIZER
#undef SANITIZER_GROUP
- SanitizerSections.emplace_back(Mask, S.Entries);
+ SanitizerSections.emplace_back(Mask, S.Entries, S.FileIdx);
}
}
bool SanitizerSpecialCaseList::inSection(SanitizerMask Mask, StringRef Prefix,
StringRef Query,
StringRef Category) const {
- return inSectionBlame(Mask, Prefix, Query, Category);
+ return inSectionBlame(Mask, Prefix, Query, Category) != NotFound;
}
-unsigned SanitizerSpecialCaseList::inSectionBlame(SanitizerMask Mask,
- StringRef Prefix,
- StringRef Query,
- StringRef Category) const {
+std::pair<unsigned, unsigned>
+SanitizerSpecialCaseList::inSectionBlame(SanitizerMask Mask, StringRef Prefix,
+ StringRef Query,
+ StringRef Category) const {
for (const auto &S : llvm::reverse(SanitizerSections)) {
if (S.Mask & Mask) {
- unsigned lineNum =
+ unsigned LineNum =
SpecialCaseList::inSectionBlame(S.Entries, Prefix, Query, Category);
- if (lineNum > 0)
- return lineNum;
+ if (LineNum > 0)
+ return {S.FileIdx, LineNum};
}
}
- return 0;
+ return NotFound;
}
diff --git a/clang/test/CodeGen/ubsan-src-ignorelist-category.test b/clang/test/CodeGen/ubsan-src-ignorelist-category.test
index 55967ec77c836..96a4abb1d1020 100644
--- a/clang/test/CodeGen/ubsan-src-ignorelist-category.test
+++ b/clang/test/CodeGen/ubsan-src-ignorelist-category.test
@@ -12,6 +12,9 @@
// RUN: %clang_cc1 -triple x86_64-linux-gnu -fsanitize=signed-integer-overflow -fsanitize-ignorelist=%t/src.ignorelist.contradict6 -emit-llvm %t/test1.c -o - | FileCheck %s --check-prefixes=CHECK1,SANITIZE
// RUN: %clang_cc1 -triple x86_64-linux-gnu -fsanitize=signed-integer-overflow -fsanitize-ignorelist=%t/src.ignorelist.contradict7 -emit-llvm %t/test1.c -o - | FileCheck %s --check-prefixes=CHECK1,IGNORE
// RUN: %clang_cc1 -triple x86_64-linux-gnu -fsanitize=signed-integer-overflow -fsanitize-ignorelist=%t/src.ignorelist.contradict8 -emit-llvm %t/test1.c -o - | FileCheck %s --check-prefixes=CHECK1,SANITIZE
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -fsanitize=signed-integer-overflow -fsanitize-ignorelist=%t/src.ignorelist -fsanitize-ignorelist=%t/src.ignorelist.contradict9 -emit-llvm %t/test1.c -o - | FileCheck %s --check-prefixes=CHECK1,IGNORE
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -fsanitize=signed-integer-overflow -fsanitize-ignorelist=%t/src.ignorelist.contradict9 -fsanitize-ignorelist=%t/src.ignorelist -emit-llvm %t/test1.c -o - | FileCheck %s --check-prefixes=CHECK1,SANITIZE
+
// Verify ubsan only emits checks for files in the allowlist
@@ -77,6 +80,14 @@ src:*/tes*1.c=sanitize
src:*/te*t1.c
src:*/t*st1.c=sanitize
+//--- src.ignorelist.contradict9
+src:*
+src:*/test1.c=sanitize
+src:*/test1.c
+src:*/test1.c=sanitize
+src:*/te*t1.c
+src:*/test*.c
+
//--- test1.c
// CHECK1-LABEL: define dso_local i32 @add
More information about the cfe-commits
mailing list