Saxon- C CentOS8 Compile - PullRequest
       72

Saxon- C CentOS8 Compile

0 голосов
/ 10 марта 2020

Я пытаюсь оценить Saxon- C 1.2.1 HE на CentOS8, и кажется, что установка прошла нормально. Попытка сэмплов с помощью cd samples/cppTests && build64-linux.sh, однако, приводит к множеству ошибок компиляции в следующем порядке:

.. / .. / Saxon. C .API / SaxonProcessor.h: 599: 32: ошибка: деление 'sizeof (JNINativeMethod *) / sizeof (JNINativeMethod)' не вычисляет количество элементов массива [-Werror = sizeof-pointer-div] gMethods, sizeof (gMethods) / sizeof (gMethods [0] ));

Прежде чем я кратко и достоверно выключил -Werror = sizeof-pointer-div, я проверил исходный код, и то, что там происходит, кажется сомнительным.

bool registerCPPFunction(char * libName, JNINativeMethod * gMethods=NULL){
    if(libName != NULL) {
        setConfigurationProperty("extc", libName);

    }

    if(gMethods == NULL && nativeMethodVect.size()==0) {
    return false;
    } else {
        if(gMethods == NULL) {
            //copy vector to gMethods
            gMethods = new JNINativeMethod[nativeMethodVect.size()];
        }
        return registerNativeMethods(sxn_environ->env, "com/saxonica/functions/>
    gMethods, sizeof(gMethods) / sizeof(gMethods[0]));


    }
    return false;
}

более конкретно, sizeof(gMethods) / sizeof(gMethods[0]), похоже, не рассчитывает что-либо полезное с какой-либо разницей. Скорее всего, было намерение вывести некоторый код, который достиг бы того же значения, что и nativeMethodVect.size(), но, видя исходный код этого проекта в первый раз, я мог ошибиться, а разделение было на самом деле намеренным?

Я склонен догадываться, что на самом деле намерение было ближе к b, чем к a в следующем примере:

#include <cstdio>
struct test
{
    int x, y, z;
};
int main()
{
    test *a = new test[32], b[32];
    printf("%d %d\n", sizeof(a)/sizeof(a[0]), sizeof(b)/sizeof(b[0]));
    return 0;
}

, который выдает 0 32, что ожидается, так как sizeof (a) дает размер указателя, а не размер области памяти массива.

1 Ответ

1 голос
/ 10 марта 2020

Этот бит кода должен поддерживать функцию определенных пользователем расширений в таблицах стилей XSLT и запросах XQuery. Если пользователь не использует эти функции, ему не нужен этот бит кода. Фактически определяемые пользователем функции расширения доступны только в Saxon-PE / C и Saxon-EE / C, поэтому их не должно быть в базе кода Saxon-HE / C. Я создал следующую ошибку, чтобы исследовать вышеупомянутую ошибку и https://saxonica.plan.io/issues/4477

. Я думаю, что обходной путь может состоять в том, чтобы либо удалить рассматриваемый код, если функция функции расширения не Использовать или убрать флаг компиляции -Werror = sizeof-pointer-div.

Намерение было следующим:

jobject JNICALL cppNativeCall(jstring funcName, jobjectArray arguments, jobjectArray argTypes){
   //native call code here

}

JNINativeMethod cppMethods[] =
{
  {
     fname,
     funcParameters,
     (void *)&cppNativeCall
  }
};

bool nativeFound = processor->registerNativeMethods(env, "NativeCall",
cppMethods, sizeof(cppMethods) / sizeof(cppMethods[0]));
...