Subject: [alpine-devel] Missing 64-bit support in jsoncpp-dev build

From: Andrew Bell <[email-masked]>
Date: Sat, 24 Feb 2018 13:41:40 -0500

Hi,

It seems that there's a problem with the way that the jsoncpp-dev package
was built. It's missing support for 64-bit integer types on x86_64 and
perhaps other platforms.

Checking the contents of the library for 64 bit Json::Values, I see that
they're missing (no long long, unsinged long long)

$ readelf -W --dyn-sym libjsoncpp.so | c++filt | grep "Value::Value"
    89: 0000000000018a3a    42 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(double)
    94: 00000000000189ba    32 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(int)
    98: 00000000000189da    32 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(unsigned int)
   100: 00000000000189fa    31 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(long)
   102: 0000000000018a1a    31 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(unsigned long)
   112: 0000000000018aa6    35 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(Json::Value&&)
   148: 0000000000018a64    35 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(Json::StaticString const&)
   260: 0000000000018cb8    51 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(char const*, char const*)
   305: 0000000000018be6   210 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(char const*)
   332: 0000000000018cb8    51 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(char const*, char const*)
   392: 0000000000018aca   162 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(Json::ValueType)
   438: 000000000001ad74   627 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(Json::Value const&)
   452: 0000000000018be6   210 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(char const*)
   453: 0000000000018a64    35 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(Json::StaticString const&)
   503: 0000000000018aca   162 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(Json::ValueType)
   559: 0000000000018a88    30 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(bool)
   561: 0000000000018a3a    42 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(double)
   564: 00000000000189ba    32 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(int)
   567: 00000000000189da    32 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(unsigned int)
   572: 00000000000189fa    31 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(long)
   574: 0000000000018dc6    46 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&)
   575: 0000000000018a1a    31 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(unsigned long)
   579: 000000000001ad74   627 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(Json::Value const&)
   585: 0000000000018dc6    46 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&)
   591: 0000000000018aa6    35 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(Json::Value&&)
   612: 0000000000018a88    30 FUNC    GLOBAL DEFAULT   10
Json::Value::Value(bool)

There's a place you can turn off 64-bit support off in config.h, but it's
commented out in the distribution and I don't know why 64-bit support
wouldn't be provided as part of the package on x86_64:

// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for
// integer
// Storages, and 64 bits integer support is disabled.
// #define JSON_NO_INT64 1

So at a minimum, there's a mismatch between the provided header file and
library.

$ apk info jsoncpp-dev
jsoncpp-dev-1.8.1-r1 description:
JSON C++ library (development files)

jsoncpp-dev-1.8.1-r1 webpage:
https://github.com/open-source-parsers/jsoncpp

jsoncpp-dev-1.8.1-r1 installed size:
122880

-- 
Andrew Bell
[email-masked]

---

From: "A. Wilcox" <[email-masked]>
Date: Sat, 24 Feb 2018 13:26:00 -0600

> they're missing (no long long, unsinged long long)

There appear to be multiple problems with this statement:

- 'long long' is a C99 data type, and is not supported in C++ pre-C++11

- sizeof(unsigned long) on at least x86_64 and ppc64 = 8 bytes (64 bits)

> Json::Value::Value(unsigned long)

This therefore provides for 64-bit values.

Do you have a reason why you think it needs to be 'long long'?  Is there
some code you have that tries to use 'long long' with jsoncpp and it
doesn't compile now?  If you're using GCC, which adds 'long long' as a
GNU C++ extension, I would think it would more than likely realise it is
the same size and alias it to 'long' (but possibly not).

Best,
--arw

-- 
A. Wilcox (awilfox)
Project Lead, Adélie Linux
http://adelielinux.org