Hello PostgreSQL hackers, I recently got the following bug report about a test suite failure on sparc64:
----- Forwarded message from Aurelien Jarno <aure...@debian.org> ----- Date: Wed, 02 Mar 2011 23:49:05 +0100 From: Aurelien Jarno <aure...@debian.org> To: Debian Bug Tracking System <sub...@bugs.debian.org> Subject: Bug#616180: postgresql-9.0: FTBFS on sparc64, testsuite issues with int8 postgresql-9.0 fails to build on sparc64 due to testsuite errors with int8. The division by 0 is not trapped and a SIGFPE is issued instead of an error. Postgresql people claims it's a gcc bug, while gcc people says the code is incorrect [1]. Whatever the real issue is, the fix is very simple (actually taken in another part from the very same file), so it's probably the best to simply apply it. [1] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29968 ----- End forwarded message ----- The C99 standard [2], section 6.5.5 paragraph 5 actually says: "The result of the / operator is the quotient from the division of the first operand by the second; the result of the % operator is the remainder. In both operations, if the value of the second operand is zero, the behavior is undefined." so the gcc folk's claim that this isn't a gcc bug looks justified. Aurelien sent a straightforward patch for this, I updated it to apply to current git head, updated the comments, and git-formatted it. Thanks for considering! Martin [2] http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf -- Martin Pitt | http://www.piware.de Ubuntu Developer (www.ubuntu.com) | Debian Developer (www.debian.org)
From 734d86c9482d545f38c9c51e173d7f2287f521bf Mon Sep 17 00:00:00 2001 From: Martin Pitt <mp...@debian.org> Date: Fri, 11 Mar 2011 18:38:54 +0100 Subject: [PATCH] Avoid undefined division by zero Various division by zero operations in the test suite currently cause test failures on sparc64, as the compiler does not throw a SIGFPE like on most other platforms. Apply the already existing NULL returns from some division functions to int{8,82,84}div() as well, and update the comment to say that it isn't a gcc bug (see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29968 and http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf section 6.5.5 paragraph 5). Thanks to Aurelien Jarno for the initial patch! --- src/backend/utils/adt/int8.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c index bbab90c..d92b599 100644 --- a/src/backend/utils/adt/int8.c +++ b/src/backend/utils/adt/int8.c @@ -590,9 +590,13 @@ int8div(PG_FUNCTION_ARGS) int64 result; if (arg2 == 0) + { ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); + /* ensure we don't reach the division, as this is undefined */ + PG_RETURN_NULL(); + } result = arg1 / arg2; @@ -813,9 +817,13 @@ int84div(PG_FUNCTION_ARGS) int64 result; if (arg2 == 0) + { ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); + /* ensure we don't reach the division, as this is undefined */ + PG_RETURN_NULL(); + } result = arg1 / arg2; @@ -912,7 +920,7 @@ int48div(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); - /* ensure compiler realizes we mustn't reach the division (gcc bug) */ + /* ensure we don't reach the division, as this is undefined */ PG_RETURN_NULL(); } @@ -997,9 +1005,13 @@ int82div(PG_FUNCTION_ARGS) int64 result; if (arg2 == 0) + { ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); + /* ensure we don't reach the division, as this is undefined */ + PG_RETURN_NULL(); + } result = arg1 / arg2; @@ -1096,7 +1108,7 @@ int28div(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); - /* ensure compiler realizes we mustn't reach the division (gcc bug) */ + /* ensure we don't reach the division, as this is undefined */ PG_RETURN_NULL(); } -- 1.7.4.1
signature.asc
Description: Digital signature