Skip to content

iOS Build using cmake fails due to 64 to 32bits conversion precision loss #808

@kenji21

Description

@kenji21

Describe the bug

Can't build for iOS 64bits without ignoring 64 to 32bits conversion precision loss

Steps To Reproduce

Using guide https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#switching-between-device-and-simulator

$ cmake -S. -B_builds -GXcode     -DCMAKE_SYSTEM_NAME=iOS      -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0     -DCMAKE_INSTALL_PREFIX=`pwd`/_install     -DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO     -DCMAKE_IOS_INSTALL_COMBINED=YES
[REDACTED]
$ cmake --build _builds --config Release --target json-c-static -- -sdk iphonesimulator
[...]
CompileC /Users/kenji/Desktop/json-c/_builds/build/json-c-static.build/Release-iphonesimulator/Objects-normal/arm64/json_object.o /Users/kenji/Desktop/json-c/json_object.c normal arm64 c com.apple.compilers.llvm.clang.1_0.compiler (in target 'json-c-static' from project 'json-c')
    cd /Users/kenji/Desktop/json-c
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c -target arm64-apple-ios13.0-simulator -fmessage-length\=242 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit\=0 -fcolor-diagnostics -Wno-trigraphs -fpascal-strings -O2 -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-return-type -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-float-conversion -Wno-non-literal-null-conversion -Wno-objc-literal-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-implicit-fallthrough -DCMAKE_INTDIR\=\"Release-iphonesimulator\" -D_GNU_SOURCE -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator16.2.sdk -fstrict-aliasing -Wdeprecated-declarations -Wno-sign-conversion -Wno-infinite-recursion -Wno-comma -Wno-block-capture-autoreleasing -Wno-strict-prototypes -Wno-semicolon-before-method-body -I/Users/kenji/Desktop/json-c/_builds/Release-iphonesimulator/include -I/Users/kenji/Desktop/json-c -I/Users/kenji/Desktop/json-c/_builds -I/Users/kenji/Desktop/json-c/_builds/build/json-c-static.build/Release-iphonesimulator/DerivedSources-normal/arm64 -I/Users/kenji/Desktop/json-c/_builds/build/json-c-static.build/Release-iphonesimulator/DerivedSources/arm64 -I/Users/kenji/Desktop/json-c/_builds/build/json-c-static.build/Release-iphonesimulator/DerivedSources -F/Users/kenji/Desktop/json-c/_builds/Release-iphonesimulator -ffunction-sections -fdata-sections -Werror -Wall -Wcast-qual -Wno-error\=deprecated-declarations -Wextra -Wwrite-strings -Wno-unused-parameter -Wstrict-prototypes -DNDEBUG -fPIC -D_REENTRANT -D JSON_C_DLL -MMD -MT dependencies -MF /Users/kenji/Desktop/json-c/_builds/build/json-c-static.build/Release-iphonesimulator/Objects-normal/arm64/json_object.d --serialize-diagnostics /Users/kenji/Desktop/json-c/_builds/build/json-c-static.build/Release-iphonesimulator/Objects-normal/arm64/json_object.dia -c /Users/kenji/Desktop/json-c/json_object.c -o /Users/kenji/Desktop/json-c/_builds/build/json-c-static.build/Release-iphonesimulator/Objects-normal/arm64/json_object.o

    Task input dependencies:
        /Users/kenji/Desktop/json-c/json_object.c

    Task output dependencies:
        /Users/kenji/Desktop/json-c/_builds/build/json-c-static.build/Release-iphonesimulator/Objects-normal/arm64/json_object.o

    Run reason: rule has never built
/Users/kenji/Desktop/json-c/json_object.c:52:2: error: Unable to determine size of ssize_t
#error Unable to determine size of ssize_t
 ^
/Users/kenji/Desktop/json-c/json_object.c:204:52: error: implicit conversion loses integer precision: 'unsigned long' to 'int' [-Werror,-Wshorten-64-to-32]
                                printbuf_memappend(pb, str + start_offset, pos - start_offset);
                                ~~~~~~~~~~~~~~~~~~                         ~~~~^~~~~~~~~~~~~~
/Users/kenji/Desktop/json-c/json_object.c:231:29: error: implicit conversion loses integer precision: 'unsigned long' to 'int' [-Werror,-Wshorten-64-to-32]
                                                           pos - start_offset);
                                                           ~~~~^~~~~~~~~~~~~~
/Users/kenji/Desktop/json-c/json_object.c:242:50: error: implicit conversion loses integer precision: 'unsigned long' to 'int' [-Werror,-Wshorten-64-to-32]
                printbuf_memappend(pb, str + start_offset, pos - start_offset);
                ~~~~~~~~~~~~~~~~~~                         ~~~~^~~~~~~~~~~~~~
/Users/kenji/Desktop/json-c/json_object.c:682:38: error: implicit conversion loses integer precision: 'unsigned long' to 'int' [-Werror,-Wshorten-64-to-32]
        return printbuf_memappend(pb, sbuf, strlen(sbuf));
               ~~~~~~~~~~~~~~~~~~           ^~~~~~~~~~~~
/Users/kenji/Desktop/json-c/json_object.c:1065:13: error: implicit conversion loses integer precision: 'long' to 'int' [-Werror,-Wshorten-64-to-32]
                        size = p - buf;
                             ~ ~~^~~~~
/Users/kenji/Desktop/json-c/json_object.c:1136:21: error: implicit conversion loses integer precision: 'unsigned long' to 'int' [-Werror,-Wshorten-64-to-32]
        int userdata_len = strlen((const char *)jso->_userdata);
            ~~~~~~~~~~~~   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/kenji/Desktop/json-c/json_object.c:1251:13: error: use of undeclared identifier 'SSIZE_T_MAX'
        if (len > (SSIZE_T_MAX - (sizeof(*jso) - sizeof(jso->c_string)) - 1))
                   ^
/Users/kenji/Desktop/json-c/json_object.c:1304:32: error: implicit conversion loses integer precision: 'ssize_t' (aka 'long') to 'int' [-Werror,-Wshorten-64-to-32]
        case json_type_string: return _json_object_get_string_len(JC_STRING_C(jso));
                               ~~~~~~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/kenji/Desktop/json-c/json_object.c:1676:37: error: implicit conversion loses integer precision: 'ssize_t' (aka 'long') to 'int' [-Werror,-Wshorten-64-to-32]
                                                  _json_object_get_string_len(JC_STRING(src)));
                                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 errors generated.
[...]

While ignoring the conversion (risky) succeed to build libjson.a:

cmake --build _builds --config Release --target json-c-static -- -sdk iphonesimulator GCC_WARN_64_TO_32_BIT_CONVERSION=No

Version and Platform

  • json-c version: [master]
  • OS: [macOS 13 / Xcode 14.2]
  • Custom cmake/build flags, if any => see steps to reproduce

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions