Bug report

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Bug report

Alexander Ananin
Hi, Support,

I've found the strange behavior in the rtree.c file.
I think that in the  static int writeInt64(u8 *p, i64 i) function.

static int writeInt64(u8 *p, i64 i){
#if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000
  i = (i64)__builtin_bswap64((u64)i);
  memcpy(p, &i, 8);
#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300
  i = (i64)_byteswap_uint64((u64)i);
  memcpy(p, &i, 8);
#elif SQLITE_BYTEORDER==4321
  memcpy(p, &i, 8);
#else
  p[0] = (i>>56)&0xFF;
  p[1] = (i>>48)&0xFF;
  p[2] = (i>>40)&0xFF;
  p[3] = (i>>32)&0xFF;
  p[4] = (i>>24)&0xFF;
  p[5] = (i>>16)&0xFF;
  p[6] = (i>> 8)&0xFF;
  p[7] = (i>> 0)&0xFF;
#endif
  return 8;
}

If I build the SQLite with option 'Compile as C Code (/TC)' I've got the warning warning C4013: '_byteswap_uint64' undefined; assuming extern returning int

The highlighted line of function works incorrectly if #include <stdlib.h> is missed. For example, it returns 0 value if i=1000 was passed into the function _byteswap_uint64.

Steps to reproduce:

  1.  Create console application in Visual Studio. The source code is below.
#include "stdafx.h"
//#include <stdlib.h>

static __int64 writeInt64(char *p, __int64 i) {
       i = (__int64)_byteswap_uint64((unsigned __int64)i);
       memcpy(p, &i, 8);

       return 8;
}

int main()
{
       unsigned __int64 i = 1000;
       char buff[8] = { 0, };
       i = writeInt64(buff, i);
       return 0;
}


  1.  Build it with the option 'Compile as C Code (/TC)'
  2.  Set breakpoint on the i = (__int64)_byteswap_uint64((unsigned __int64)i);
  3.  Run it and call 'Go to Disassembled'
w/o #include <stdlib.h>
i = (__int64)_byteswap_uint64((unsigned __int64)i);
008F17CE  mov         eax,dword ptr [ebp+10h]
008F17D1  push        eax
008F17D2  mov         ecx,dword ptr [i]
008F17D5  push        ecx
008F17D6  call        __byteswap_uint64 (08F1348h)
008F17DB  add         esp,8
008F17DE  cdq
008F17DF  mov         dword ptr [i],eax
008F17E2  mov         dword ptr [ebp+10h],edx
with #include <stdlib.h>
i = (__int64)_byteswap_uint64((unsigned __int64)i);

001217CE  mov         eax,dword ptr [ebp+10h]
001217D1  push        eax
001217D2  mov         ecx,dword ptr [i]
001217D5  push        ecx
001217D6  call        __byteswap_uint64 (0121348h)
001217DB  add         esp,8
001217DE  mov         dword ptr [i],eax
001217E1  mov         dword ptr [ebp+10h],edx


Best Regards,
Alexander Ananin
Confidentiality Notice: This message (including attachments) is a private communication solely for use of the intended recipient(s). If you are not the intended recipient(s) or believe you received this message in error, notify the sender immediately and then delete this message. Any other use, retention, dissemination or copying is prohibited and may be a violation of law, including the Electronic Communication Privacy Act of 1986.  
_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Bug report

Richard Hipp-3
On 2/27/18, Alexander Ananin <[hidden email]> wrote:
>
> I've found the strange behavior in the rtree.c file.

Are you trying to compile rtree.c separately, rather than using the
version that is bundled into the sqlite3.c amalgmation?  May I ask why
you want to do that?
--
D. Richard Hipp
[hidden email]
_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users