Re: Broken tests
| From: | Dmitry Stogov | Date: | Fri, 26 Dec 2014 20:40:01 +0000 |
| Subject: | Re: Broken tests | ||
| References: | 1 2 3 4 5 6 7 8 9 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-83890@lists.php.net to get a copy of this message | ||
the problem that libmysql behavior is different (tested at least on two
different boxes).
Thanks. Dmitry.
On Fri, Dec 26, 2014 at 11:21 PM, Keyur Govande <keyurgovande@gmail.com>
wrote:
>
>
> On Fri, Dec 26, 2014 at 1:13 PM, Dmitry Stogov <dmitry@zend.com> wrote:
>
>> $ gcc --version
>> gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
>>
>> $ rpm -qa | grep -i mariadb
>> mariadb-libs-5.5.39-1.fc19.x86_64
>> mariadb-devel-5.5.39-1.fc19.x86_64
>> mariadb-server-5.5.39-1.fc19.x86_64
>> mariadb-libs-5.5.39-1.fc19.i686
>> mariadb-5.5.39-1.fc19.x86_64
>>
>> Thanks. Dmitry.
>>
>>
> Thanks Dmitry.
>
> I have a program to reproduce the issue and you're initial hunch about
> volatile was totally correct.
>
> #include <stdio.h>
> #include <string.h>
>
> double getValue(float f) {
> typedef float dec32 __attribute__((mode(SD)));
> dec32 d32 = f;
> return (double)d32;
> }
>
> int main(int argc, char **argv) {
> float f = 3.14159274f;
>
> double good = getValue(f);
> double bad = (double)f;
>
> printf("good double: %.15f, bad double: %.15f, (good == bad): %d\n",
> good, bad, (good == bad));
> return 0;
> }
>
> I had developed the feature using gcc 4.4.7 and the feature works
> flawlessly over there. The output with -O2 is:
> good double: 3.141593000000000, bad double: 3.141592741012573, (good ==
> bad): 0
>
> When the exact same code is compiled with gcc 4.8.3 and -O2 though the
> compiler optimizes away the conversion and the output becomes:
> good double: 3.141592741012573, bad double: 3.141592741012573, (good ==
> bad): 1
>
> When I add a volatile to the assignment of variable "d32" though, the
> optimization is removed and the output is again as expected. Note that with
> gcc 4.8.3 and -O0 the compiler does not try to be clever and hence the
> output is the same as with gcc 4.4.7 which is why the DEBUG build continues
> to work.
>
> With the fix the tests pass again. I will commit a fix to the repo.
>
>
>>
>> On Fri, Dec 26, 2014 at 9:09 PM, Keyur Govande <keyurgovande@gmail.com>
>> wrote:
>>
>>>
>>>
>>> On Fri, Dec 26, 2014 at 1:07 PM, Dmitry Stogov <dmitry@zend.com> wrote:
>>>
>>>> I'm not sure if these results reflect the latest committed tests...
>>>> But we definitely have some problem.
>>>>
>>>> I also tried "9.99" as was mentioned in your comments and got
>>>> "9.99" in
>>>> DEBUG build but, "9.99899..." in RELEASE and build with libmysql.
>>>>
>>>
>>> So to get my environment set up correctly, can you tell me the versions
>>> of gcc/clang, libmysqlclient, the Mysql server and PHP you're using?
>>>
>>>
>>>>
>>>> Thanks. Dmitry.
>>>>
>>>> > mysqli fetch float values [ext/mysqli/tests/010.phpt]
>>>> > mysqli fetch mixed values [ext/mysqli/tests/011.phpt]
>>>> > mysqli fetch mixed values 2 [ext/mysqli/tests/012.phpt]
>>>>
>>>> $ cat ../ext/mysqli/tests/010.diff
>>>> 003+ float(3.141593)
>>>> 003- float(3.14159274101)
>>>> 005+ float(-1.0E-6)
>>>> 005- float(-9.99999997475E-7)
>>>> 009+ float(1.0E+12)
>>>> 009- float(999999995904)
>>>> 011+ float(0.5646425)
>>>> 011- float(0.564642488956)
>>>> 015+ float(8.888889E+14)
>>>> 015- float(8.88888914608E+14)
>>>>
>>>> $ cat ../ext/mysqli/tests/011.diff
>>>> 011+ float(2345.6)
>>>> 011- float(2345.60009766)
>>>>
>>>> $ cat ../ext/mysqli/tests/012.diff
>>>> 011+ float(2.6)
>>>> 011- float(2.59999990463)
>>>>
>>>> On Fri, Dec 26, 2014 at 8:56 PM, Keyur Govande <keyurgovande@gmail.com>
>>>> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Fri, Dec 26, 2014 at 12:53 PM, Dmitry Stogov <dmitry@zend.com>
>>>>> wrote:
>>>>>
>>>>>> Hi Keyer,
>>>>>>
>>>>>> In my tests (Linux x86 and x86_64) the current behavior of mysqlnd
>>>>>> differ form libmysql.
>>>>>>
>>>>>> Also your patch works differently in DEBUG and RELEASE mode.
>>>>>> GCC just eliminates double conversion and makes your patch useless
>>>>>> for RELEASE build (this may be fixed adding "volatile")
>>>>>> I'm not completely sure what behavior is right.
>>>>>> It would be great if you decide what should be done with Andrey and
>>>>>> fix this.
>>>>>>
>>>>>> The fixes back and forth were done because of misunderstanding of
>>>>>> real problem.
>>>>>>
>>>>>> Thanks. Dmitry.
>>>>>>
>>>>>
>>>>> Hi Dmitry,
>>>>>
>>>>> Can you provide a test script and outputs you're seeing so I can try
>>>>> to reproduce it?
>>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>> On Fri, Dec 26, 2014 at 8:25 PM, Keyur Govande <
>>>>>> keyurgovande@gmail.com> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Dec 26, 2014 at 10:14 AM, Dmitry Stogov <dmitry@zend.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> It seems like the source of the problem is commit c044164a authored
>>>>>>>> by Keyur,
>>>>>>>>
>>>>>>>> I caught the problem because the behavior is different in DEBUG and
>>>>>>>> RELEASE builds.
>>>>>>>> However, I think the behavior introduced by that patch may be
>>>>>>>> wrong.
>>>>>>>> At least it produces different results in comparison to libmysql.
>>>>>>>>
>>>>>>>> Andrey, please made a decision.
>>>>>>>>
>>>>>>>> Thanks. Dmitry.
>>>>>>>>
>>>>>>>
>>>>>>> Hello,
>>>>>>>
>>>>>>> I am a bit confused...I see that commit c2a047cf reverts my commit
>>>>>>> to fix failing tests (4e2c016). But then c2a047cf was also reverted
>>>>>>> back by
>>>>>>> 4409b6db3 a few hours back.
>>>>>>>
>>>>>>> Is there something I can help with? The original patch c044164a was
>>>>>>> authored to fix bug #67839 and bring mysqli in parity with
>>>>>>> libmysql's
>>>>>>> behavior on floating point numbers.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Keyur.
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> ---------- Forwarded message ----------
>>>>>>>> From: Dmitry Stogov <dmitry@zend.com>
>>>>>>>> Date: Fri, Dec 26, 2014 at 5:18 PM
>>>>>>>> Subject: Broken tests
>>>>>>>> To: Xinchen Hui <xinchen.h@zend.com>
>>>>>>>> Cc: keyur_govande@yahoo.com, "php-cvs@lists.php.net" <
>>>>>>>> php-cvs@lists.php.net>
>>>>>>>>
>>>>>>>>
>>>>>>>> Hi Xinchen,
>>>>>>>>
>>>>>>>> The commit c2a047cf99f3d020bab12701e8dafed7424673bf made few tests
>>>>>>>> to start fail on 32-bit DEBUG build. The same tests seems to work
>>>>>>>> in
>>>>>>>> RELEASE build.
>>>>>>>>
>>>>>>>> Are you sure these the are changed in a proper way?
>>>>>>>> For me it looks like something was broken in code, and then tests
>>>>>>>> were adjusted for wrong new behaviour.
>>>>>>>>
>>>>>>>> Please, find the source of the problem.
>>>>>>>>
>>>>>>>> Thanks. Dmitry.
>>>>>>>>
>>>>>>>> > mysqli fetch float values [ext/mysqli/tests/010.phpt]
>>>>>>>> > mysqli fetch mixed values [ext/mysqli/tests/011.phpt]
>>>>>>>> > mysqli fetch mixed values 2 [ext/mysqli/tests/012.phpt]
>>>>>>>>
>>>>>>>> $ cat ../ext/mysqli/tests/010.diff
>>>>>>>> 003+ float(3.141593)
>>>>>>>> 003- float(3.14159274101)
>>>>>>>> 005+ float(-1.0E-6)
>>>>>>>> 005- float(-9.99999997475E-7)
>>>>>>>> 009+ float(1.0E+12)
>>>>>>>> 009- float(999999995904)
>>>>>>>> 011+ float(0.5646425)
>>>>>>>> 011- float(0.564642488956)
>>>>>>>> 015+ float(8.888889E+14)
>>>>>>>> 015- float(8.88888914608E+14)
>>>>>>>>
>>>>>>>> $ cat ../ext/mysqli/tests/011.diff
>>>>>>>> 011+ float(2345.6)
>>>>>>>> 011- float(2345.60009766)
>>>>>>>>
>>>>>>>> $ cat ../ext/mysqli/tests/012.diff
>>>>>>>> 011+ float(2.6)
>>>>>>>> 011- float(2.59999990463)[dmitry@tpl2 CGI-DEBUG]$
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>