Retire GCC FORTIFY.
NDK r18 (which removes GCC) is about to ship. We don't need this any more.
The immediate motivation for removing this right now is that the test
fails whenever we add Clang-only flags to the build system.
While we're here, clean up <stdatomic.h> too.
Bug: https://issuetracker.google.com/74404306
Test: ran tests
Change-Id: Iaad5d634d1ba76f0b6f19ad32cc27b2533771a4a
diff --git a/tests/fortify_filecheck_diagnostics_test.cpp b/tests/fortify_filecheck_diagnostics_test.cpp
index 375a156..380a344 100644
--- a/tests/fortify_filecheck_diagnostics_test.cpp
+++ b/tests/fortify_filecheck_diagnostics_test.cpp
@@ -22,8 +22,7 @@
* bionic/tests/file-check-cxx out/host/linux-x86/bin/FileCheck \
* prebuilts/clang/host/linux-x86/clang-4053586/bin/clang++ CLANG -I bionic/tests -I ...
*
- * If you delete everything before clang++ and delete "CLANG" (or "GCC" if gcc is failing), then
- * you'll end up with:
+ * If you delete everything before clang++ and delete "CLANG", then you'll end up with:
*
* prebuilts/clang/host/linux-x86/clang-4053586/bin/clang++ -I bionic/tests -I ...
*
@@ -48,13 +47,10 @@
char buf[4];
// NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to int __builtin___sprintf_chk(char*, int, {{(long )?}}unsigned int, const char*, ...) will always overflow destination buffer
// CLANG: error: call to unavailable function 'sprintf': format string will always overflow destination buffer
sprintf(buf, "foobar"); // NOLINT(runtime/printf)
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to int __builtin___sprintf_chk(char*, int, {{(long )?}}unsigned int, const char*, ...) will always overflow destination buffer
- // clang should emit a warning, but doesn't
+ // TODO: clang should emit a warning, but doesn't
sprintf(buf, "%s", "foobar"); // NOLINT(runtime/printf)
}
@@ -62,31 +58,22 @@
char buf[4];
// NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to int __builtin___snprintf_chk(char*, {{(long )?}}unsigned int, int, {{(long )?}}unsigned int, const char*, ...) will always overflow destination buffer
// CLANG: error: call to unavailable function 'snprintf': format string will always overflow destination buffer
snprintf(buf, 5, "foobar"); // NOLINT(runtime/printf)
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to int __builtin___snprintf_chk(char*, {{(long )?}}unsigned int, int, {{(long )?}}unsigned int, const char*, ...) will always overflow destination buffer
- // clang should emit a warning, but doesn't
+ // TODO: clang should emit a warning, but doesn't
snprintf(buf, 5, "%s", "foobar"); // NOLINT(runtime/printf)
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to int __builtin___snprintf_chk(char*, {{(long )?}}unsigned int, int, {{(long )?}}unsigned int, const char*, ...) will always overflow destination buffer
- // clang should emit a warning, but doesn't
+ // TODO: clang should emit a warning, but doesn't
snprintf(buf, 5, " %s ", "foobar"); // NOLINT(runtime/printf)
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to int __builtin___snprintf_chk(char*, {{(long )?}}unsigned int, int, {{(long )?}}unsigned int, const char*, ...) will always overflow destination buffer
- // clang should emit a warning, but doesn't
+ // TODO: clang should emit a warning, but doesn't
snprintf(buf, 5, "%d", 100000); // NOLINT(runtime/printf)
}
void test_memcpy() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to void* __builtin___memcpy_chk(void*, const void*, {{(long )?}}unsigned int, {{(long )?}}unsigned int) will always overflow destination buffer
// CLANG: error: 'memcpy' called with size bigger than buffer
memcpy(buf, "foobar", sizeof("foobar") + 100);
}
@@ -94,8 +81,6 @@
void test_memmove() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to void* __builtin___memmove_chk(void*, const void*, {{(long )?}}unsigned int, {{(long )?}}unsigned int) will always overflow destination buffer
// CLANG: error: 'memmove' called with size bigger than buffer
memmove(buf, "foobar", sizeof("foobar"));
}
@@ -103,8 +88,6 @@
void test_memset() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to void* __builtin___memset_chk(void*, int, {{(long )?}}unsigned int, {{(long )?}}unsigned int) will always overflow destination buffer
// CLANG: error: 'memset' called with size bigger than buffer
memset(buf, 0, 6);
}
@@ -112,13 +95,9 @@
void test_strcpy() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to {{(char\* __builtin___strcpy_chk\(char\*, const char\*, unsigned int\))|(void\* __builtin___memcpy_chk\(void\*, const void\*, (long )?unsigned int, (long )?unsigned int\))}} will always overflow destination buffer
// CLANG: error: 'strcpy' called with string bigger than buffer
strcpy(buf, "foobar"); // NOLINT(runtime/printf)
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to {{(char\* __builtin___strcpy_chk\(char\*, const char\*, unsigned int\))|(void\* __builtin___memcpy_chk\(void\*, const void\*, (long )?unsigned int, (long )?unsigned int\))}} will always overflow destination buffer
// CLANG: error: 'strcpy' called with string bigger than buffer
strcpy(buf, "quux");
}
@@ -126,13 +105,9 @@
void test_stpcpy() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to char* __builtin___stpcpy_chk(char*, const char*, {{(long )?}}unsigned int) will always overflow destination buffer
// CLANG: error: 'stpcpy' called with string bigger than buffer
stpcpy(buf, "foobar");
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to char* __builtin___stpcpy_chk(char*, const char*, {{(long )?}}unsigned int) will always overflow destination buffer
// CLANG: error: 'stpcpy' called with string bigger than buffer
stpcpy(buf, "quux");
}
@@ -140,28 +115,21 @@
void test_strncpy() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to char* __builtin___strncpy_chk(char*, const char*, {{(long )?}}unsigned int, {{(long )?}}unsigned int) will always overflow destination buffer
- // clang should emit a warning, but doesn't
+ // TODO: clang should emit a warning, but doesn't
strncpy(buf, "foobar", sizeof("foobar"));
}
void test_strcat() {
char buf[4] = "";
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to {{(char\* __builtin___strcat_chk\(char\*, const char\*, unsigned int\))|(void\* __builtin___memcpy_chk\(void\*, const void\*, (long )?unsigned int, (long )?unsigned int\))}} will always overflow destination buffer
- // clang should emit a warning, but doesn't
+ // TODO: clang should emit a warning, but doesn't
strcat(buf, "foobar"); // NOLINT(runtime/printf)
}
void test_strncat() {
char buf[4] = "";
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to {{(char\* __builtin___strcat_chk\(char\*, const char\*, unsigned int\))|(void\* __builtin___memcpy_chk\(void\*, const void\*, (long )?unsigned int, (long )?unsigned int\))}} will always overflow destination buffer
- // gcc output warning with __builtin___strcat_chk for __builtin___strncat_chk.
- // clang should emit a warning, but doesn't
+ // TODO: clang should emit a warning, but doesn't
strncat(buf, "foobar", sizeof("foobar"));
}
@@ -170,8 +138,6 @@
char buf[4];
va_start(va, fmt);
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to int __builtin___vsprintf_chk(char*, int, {{(long )?}}unsigned int, const char*, {{(__va_list)|(void\*)|(char\*)|(__va_list_tag\*)}}) will always overflow destination buffer
// clang should emit a warning, but doesn't
vsprintf(buf, "foobar", va);
va_end(va);
@@ -182,8 +148,6 @@
char buf[4];
va_start(va, fmt);
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: warning: call to int __builtin___vsnprintf_chk(char*, {{(long )?}}unsigned int, int, {{(long )?}}unsigned int, const char*, {{(__va_list)|(void\*)|(char\*)|(__va_list_tag\*)}}) will always overflow destination buffer
// clang should emit a warning, but doesn't
vsnprintf(buf, 5, "foobar", va); // NOLINT(runtime/printf)
@@ -193,13 +157,9 @@
void test_fgets() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__fgets_too_small_error' declared with attribute error: fgets called with size less than zero
// CLANG: error: in call to 'fgets', size should not be negative
fgets(buf, -1, stdin);
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__fgets_too_big_error' declared with attribute error: fgets called with size bigger than buffer
// CLANG: error: in call to 'fgets', size is larger than the destination buffer
fgets(buf, 6, stdin);
}
@@ -208,8 +168,6 @@
char buf[4];
sockaddr_in addr;
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__recvfrom_error' declared with attribute error: 'recvfrom' called with size bigger than buffer
// CLANG: error: 'recvfrom' called with size bigger than buffer
recvfrom(0, buf, 6, 0, reinterpret_cast<sockaddr*>(&addr), NULL);
}
@@ -217,43 +175,31 @@
void test_recv() {
char buf[4] = {0};
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__recvfrom_error' declared with attribute error: 'recvfrom' called with size bigger than buffer
// CLANG: error: 'recv' called with size bigger than buffer
recv(0, buf, 6, 0);
}
void test_umask() {
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__umask_invalid_mode' declared with attribute error: 'umask' called with invalid mode
// CLANG: error: 'umask' called with invalid mode
umask(01777);
}
void test_read() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__read_dest_size_error' declared with attribute error: read called with size bigger than destination
// CLANG: error: in call to 'read', 'count' bytes overflows the given object
read(0, buf, 6);
}
void test_open() {
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__creat_missing_mode' declared with attribute error: called with O_CREAT or O_TMPFILE, but missing mode
// CLANG: error: 'open' called with O_CREAT or O_TMPFILE, but missing mode
open("/dev/null", O_CREAT);
- // GCC: error: call to '__creat_missing_mode' declared with attribute error: called with O_CREAT or O_TMPFILE, but missing mode
// CLANG: error: 'open' called with O_CREAT or O_TMPFILE, but missing mode
open("/dev/null", O_TMPFILE);
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__creat_too_many_args' declared with attribute error: too many arguments
// CLANG: error: call to unavailable function 'open': too many arguments
open("/dev/null", O_CREAT, 0, 0);
- // GCC: error: call to '__creat_too_many_args' declared with attribute error: too many arguments
// CLANG: error: call to unavailable function 'open': too many arguments
open("/dev/null", O_TMPFILE, 0, 0);
@@ -266,8 +212,6 @@
void test_poll() {
pollfd fds[1];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__poll_too_small_error' declared with attribute error: poll: pollfd array smaller than fd count
// CLANG: error: in call to 'poll', fd_count is larger than the given buffer
poll(fds, 2, 0);
}
@@ -275,8 +219,6 @@
void test_ppoll() {
pollfd fds[1];
timespec timeout;
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__ppoll_too_small_error' declared with attribute error: ppoll: pollfd array smaller than fd count
// CLANG: error: in call to 'ppoll', fd_count is larger than the given buffer
ppoll(fds, 2, &timeout, nullptr);
}
@@ -291,8 +233,6 @@
void test_fread_overflow() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__fread_overflow' declared with attribute error: fread called with overflowing size * count
// CLANG: error: in call to 'fread', size * count overflows
fread(buf, 2, (size_t)-1, stdin);
}
@@ -300,16 +240,12 @@
void test_fread_too_big() {
char buf[4];
// NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__fread_too_big_error' declared with attribute error: fread called with size * count bigger than buffer
- // NOLINTNEXTLINE(whitespace/line_length)
// CLANG: error: in call to 'fread', size * count is too large for the given buffer
fread(buf, 1, 5, stdin);
}
void test_fwrite_overflow() {
char buf[4] = {0};
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__fwrite_overflow' declared with attribute error: fwrite called with overflowing size * count
// CLANG: error: in call to 'fwrite', size * count overflows
fwrite(buf, 2, (size_t)-1, stdout);
}
@@ -317,48 +253,36 @@
void test_fwrite_too_big() {
char buf[4] = {0};
// NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__fwrite_too_big_error' declared with attribute error: fwrite called with size * count bigger than buffer
- // NOLINTNEXTLINE(whitespace/line_length)
// CLANG: error: in call to 'fwrite', size * count is too large for the given buffer
fwrite(buf, 1, 5, stdout);
}
void test_getcwd() {
char buf[4];
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__getcwd_dest_size_error' declared with attribute error: getcwd called with size bigger than destination
// CLANG: error: in call to 'getcwd', 'size' bytes overflows the given object
getcwd(buf, 5);
}
void test_pwrite64_size() {
char buf[4] = {0};
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__pwrite64_dest_size_error' declared with attribute error: pwrite64 called with size bigger than destination
// CLANG: error: in call to 'pwrite64', 'count' bytes overflows the given object
pwrite64(STDOUT_FILENO, buf, 5, 0);
}
void test_pwrite64_too_big_malloc() {
void *buf = calloc(atoi("5"), 1);
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__pwrite64_count_toobig_error' declared with attribute error: pwrite64 called with count > SSIZE_MAX
// clang should emit a warning, but probably never will.
pwrite64(STDOUT_FILENO, buf, SIZE_MAX, 0);
}
void test_pwrite64_too_big() {
char buf[4] = {0};
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__pwrite64_count_toobig_error' declared with attribute error: pwrite64 called with count > SSIZE_MAX
// CLANG: error: in call to 'pwrite64', 'count' must be <= SSIZE_MAX
pwrite64(STDOUT_FILENO, buf, SIZE_MAX, 0);
}
void test_write_size() {
char buf[4] = {0};
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__write_dest_size_error' declared with attribute error: write called with size bigger than destination
// CLANG: error: in call to 'write', 'count' bytes overflows the given object
write(STDOUT_FILENO, buf, 5);
}
@@ -374,8 +298,6 @@
char buf[4] = {0};
sockaddr_in addr;
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__sendto_error' declared with attribute error: 'sendto' called with size bigger than buffer
// CLANG: error: 'sendto' called with size bigger than buffer
sendto(0, buf, 6, 0, reinterpret_cast<sockaddr*>(&addr), sizeof(sockaddr_in));
}
@@ -383,8 +305,6 @@
void test_send() {
char buf[4] = {0};
- // NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__sendto_error' declared with attribute error: 'sendto' called with size bigger than buffer
// CLANG: error: 'send' called with size bigger than buffer
send(0, buf, 6, 0);
}
@@ -392,8 +312,6 @@
void test_realpath() {
char buf[4] = {0};
// NOLINTNEXTLINE(whitespace/line_length)
- // GCC: error: call to '__realpath_size_error' declared with attribute error: 'realpath' output parameter must be NULL or a pointer to a buffer with >= PATH_MAX bytes
- // NOLINTNEXTLINE(whitespace/line_length)
// CLANG: error: 'realpath' output parameter must be NULL or a pointer to a buffer with >= PATH_MAX bytes
realpath(".", buf);