mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 19:06:44 +00:00
[sanitizer] LibraryNameIs in sanitizer_linux
llvm-svn: 181787
This commit is contained in:
parent
14b56186ab
commit
af05543c86
@ -854,6 +854,18 @@ void AdjustStackSizeLinux(void *attr_, int verbosity) {
|
||||
}
|
||||
}
|
||||
|
||||
// Match full names of the form /path/to/base_name{-,.}*
|
||||
bool LibraryNameIs(const char *full_name, const char *base_name) {
|
||||
const char *name = full_name;
|
||||
// Strip path.
|
||||
while (*name != '\0') name++;
|
||||
while (name > full_name && *name != '/') name--;
|
||||
if (*name == '/') name++;
|
||||
uptr base_name_length = internal_strlen(base_name);
|
||||
if (internal_strncmp(name, base_name, base_name_length)) return false;
|
||||
return (name[base_name_length] == '-' || name[base_name_length] == '.');
|
||||
}
|
||||
|
||||
} // namespace __sanitizer
|
||||
|
||||
#endif // SANITIZER_LINUX
|
||||
|
@ -56,6 +56,10 @@ void AdjustStackSizeLinux(void *attr, int verbosity);
|
||||
// Exposed for testing.
|
||||
uptr ThreadDescriptorSize();
|
||||
|
||||
// Matches a library's file name against a base name (stripping path and version
|
||||
// information).
|
||||
bool LibraryNameIs(const char *full_name, const char *base_name);
|
||||
|
||||
} // namespace __sanitizer
|
||||
|
||||
#endif // SANITIZER_LINUX_H
|
||||
|
@ -224,6 +224,30 @@ TEST(SanitizerLinux, ThreadDescriptorSize) {
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST(SanitizerCommon, LibraryNameIs) {
|
||||
EXPECT_FALSE(LibraryNameIs("", ""));
|
||||
|
||||
char full_name[256];
|
||||
const char *paths[] = { "", "/", "/path/to/" };
|
||||
const char *suffixes[] = { "", "-linux", ".1.2", "-linux.1.2" };
|
||||
const char *base_names[] = { "lib", "lib.0", "lib-i386" };
|
||||
const char *wrong_names[] = { "", "lib.9", "lib-x86_64" };
|
||||
for (uptr i = 0; i < ARRAY_SIZE(paths); i++)
|
||||
for (uptr j = 0; j < ARRAY_SIZE(suffixes); j++) {
|
||||
for (uptr k = 0; k < ARRAY_SIZE(base_names); k++) {
|
||||
internal_snprintf(full_name, ARRAY_SIZE(full_name), "%s%s%s.so",
|
||||
paths[i], base_names[k], suffixes[j]);
|
||||
EXPECT_TRUE(LibraryNameIs(full_name, base_names[k]))
|
||||
<< "Full name " << full_name
|
||||
<< " doesn't match base name " << base_names[k];
|
||||
for (uptr m = 0; m < ARRAY_SIZE(wrong_names); m++)
|
||||
EXPECT_FALSE(LibraryNameIs(full_name, wrong_names[m]))
|
||||
<< "Full name " << full_name
|
||||
<< " matches base name " << wrong_names[m];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace __sanitizer
|
||||
|
||||
#endif // SANITIZER_LINUX
|
||||
|
Loading…
x
Reference in New Issue
Block a user