Re: BUG #15121: Multiple UBSAN errors

Tomas Vondra <tomas.vondra@2ndquadrant.com>

From: Tomas Vondra <tomas.vondra@2ndquadrant.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Martin Liška <marxin.liska@gmail.com>, pgsql-bugs@lists.postgresql.org
Date: 2018-03-19T21:24:53Z
Lists: pgsql-bugs

On 03/19/2018 07:20 PM, Tom Lane wrote:
> Tomas Vondra <tomas.vondra@2ndquadrant.com> writes:
>> On 03/19/2018 03:28 PM, Martin Liška wrote:
>>>>> Note that building postgresql with -03, I see some array tests failing.
> 
>> I'm getting failures in errors, union and alter_table, but none of those
>> are related to arrays. So, which tests are failing for you and how do
>> the failures look like?
> 
> I tried -O3 with gcc 7.3.1 (Fedora 26), and that passes check-world
> just fine.  Then I tried -O3 with gcc 8.0.1 (prerelease Fedora 28),
> and indeed that's got some problems.  It looks like array_out fails
> for multidimensional arrays, because all the diffs look about
> like this one:
> 
> *** 106,116 ****
>     SET c[2:2] = '{"new_word"}'                                                                                                           
>     WHERE array_dims(c) is not null;                                                                                                      
>   SELECT a,b,c FROM arrtest;                                                                                                              
> !        a       |           b           |         c                                                                                      
> ! ---------------+-----------------------+-------------------                                                                             
> !  {16,25,3,4,5} | {{{113,142},{1,147}}} | {}                                                                                             
> !  {}            | {3,4}                 | {foo,new_word}                                                                                 
> !  {16,25,23}    | {{3,4},{4,5}}         | {foobar,new_word}                                                                              
>   (3 rows)                                                                                                                                
>                                                                                                                                           
>   SELECT a[1:3],                                                                                                                          
> --- 106,116 ----
>     SET c[2:2] = '{"new_word"}'                                                                                                           
>     WHERE array_dims(c) is not null;                                                                                                      
>   SELECT a,b,c FROM arrtest;                                                                                                              
> !        a       |       b       |         c                                                                                              
> ! ---------------+---------------+-------------------                                                                                     
> !  {16,25,3,4,5} | {{            | {}                                                                                                     
> !  {}            | {3,4}         | {foo,new_word}                                                                                         
> !  {16,25,23}    | {{3,4},{4,5}} | {foobar,new_word}                                                                                      
>   (3 rows)                                                                                                                                
>                                                                                                                                           
>   SELECT a[1:3],                                                                                                                          
> 
> Note that 1-D and 2-D arrays print fine, it's only 3-D or deeper
> that print wrong.  Very odd.  Maybe it's bad code on our part,
> but I think the odds are at least as good that it's a new gcc bug.
> 

Interesting. If I run the tests with "-03" I get the same failures in
arrays. If I run them with "-O3 -fsanitize=undefined" I don't get any
failures in arrays, but I get failures in errors, union and alter_table.

I wouldn't expect -fsanitize=undefined to affect the results like this,
but if it really is a compiler bug then all bets are off.

regards

-- 
Tomas Vondra                  http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


Commits

  1. Don't read fields of a misaligned ExpandedObjectHeader or AnyArrayType.

  2. Doc: note that statement-level view triggers require an INSTEAD OF trigger.