diff options
author | Siddhesh Poyarekar <siddhesh@gotplt.org> | 2024-09-18 22:36:09 -0400 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@gotplt.org> | 2024-10-17 11:04:10 -0400 |
commit | 51b85dfeb19652bf3e0aaec08828ba7cee1e641c (patch) | |
tree | 037ed51c9dd196217f13b3c16d940bb8475b8777 | |
parent | b12c9ce245204abbd89ac1692b21f16d0ca13583 (diff) | |
download | gcc-51b85dfeb19652bf3e0aaec08828ba7cee1e641c.zip gcc-51b85dfeb19652bf3e0aaec08828ba7cee1e641c.tar.gz gcc-51b85dfeb19652bf3e0aaec08828ba7cee1e641c.tar.bz2 |
tree-object-size: Fall back to wholesize for non-const offset
Don't bail out early if the offset to a pointer in __builtin_object_size
is a variable, return the wholesize instead since that is a better
fallback for maximum estimate. This should keep checks in place for
fortified functions to constrain overflows to at lesat some extent.
gcc/ChangeLog:
PR middle-end/77608
* tree-object-size.cc (plus_stmt_object_size): Drop check for
constant offset.
gcc/testsuite/ChangeLog:
* gcc.dg/builtin-object-size-1.c (test12): New test.
(main): Call it.
Signed-off-by: Siddhesh Poyarekar <siddhesh@gotplt.org>
-rw-r--r-- | gcc/testsuite/gcc.dg/builtin-object-size-1.c | 21 | ||||
-rw-r--r-- | gcc/tree-object-size.cc | 6 |
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-1.c b/gcc/testsuite/gcc.dg/builtin-object-size-1.c index d6d13c5..6161adb 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-1.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-1.c @@ -712,6 +712,25 @@ test11 (void) } #endif +void +__attribute__ ((noinline)) +test12 (unsigned off) +{ + char *buf2 = malloc (10); + char *p; + size_t t; + + p = &buf2[off]; + +#ifdef __builtin_object_size + if (__builtin_object_size (p, 0) != 10 - off) + FAIL (); +#else + if (__builtin_object_size (p, 0) != 10) + FAIL (); +#endif +} + int main (void) { @@ -730,5 +749,7 @@ main (void) #ifndef SKIP_STRNDUP test11 (); #endif + test12 (0); + test12 (2); DONE (); } diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc index 78faae7..0e4bf84 100644 --- a/gcc/tree-object-size.cc +++ b/gcc/tree-object-size.cc @@ -1501,8 +1501,7 @@ plus_stmt_object_size (struct object_size_info *osi, tree var, gimple *stmt) return false; /* Handle PTR + OFFSET here. */ - if (size_valid_p (op1, object_size_type) - && (TREE_CODE (op0) == SSA_NAME || TREE_CODE (op0) == ADDR_EXPR)) + if ((TREE_CODE (op0) == SSA_NAME || TREE_CODE (op0) == ADDR_EXPR)) { if (TREE_CODE (op0) == SSA_NAME) { @@ -1528,7 +1527,8 @@ plus_stmt_object_size (struct object_size_info *osi, tree var, gimple *stmt) ; else if ((object_size_type & OST_DYNAMIC) || bytes != wholesize - || compare_tree_int (op1, offset_limit) <= 0) + || (size_valid_p (op1, object_size_type) + && compare_tree_int (op1, offset_limit) <= 0)) bytes = size_for_offset (bytes, op1, wholesize); /* In the static case, with a negative offset, the best estimate for minimum size is size_unknown but for maximum size, the wholesize is a |