Колко стабилен е ocilib

Имам този код, който използва OCIlib:

int HoleInstrumentenDiffListeDB(GTree *tree)
{

  OCI_Connection* cn;
  OCI_Statement* st;
  OCI_Resultset* rs;
  if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT))
        return EXIT_FAILURE;
  char query[500];
  query[0] ='\0';
  cn = OCI_ConnectionCreate( "db", "user",  "pass", OCI_SESSION_DEFAULT);
  st = OCI_StatementCreate(cn);
  strcat(query, "SELECT...");
  OCI_ExecuteStmt(st, query);
  rs = OCI_GetResultset(st);
  int i = 1;
  int j = 0;
  char *symbolp;
  while (OCI_FetchNext(rs)){

    const char * symbolp = OCI_GetString(rs,2);
    switch ( * OCI_GetString(rs,3))
    {
      case 'N':
        insertQot(tree, symbolp, OCI_GetInt(rs, 1) );
        printf("new \n");
        break;
      case 'U':
        insertQot(tree, symbolp, OCI_GetInt(rs, 1) );
        printf("upd \n");
        break;
      case 'D':
        deleteQot(tree, symbolp);
        printf("del \n");
        break;
     }
  }
  OCI_Cleanup();
  return 1;
}

Връзката е направена, изборът изглежда работи. Но докато го проверявам с valgrind, получавам много грешки. Ето няколко от тях:

==21085== Source and destination overlap in memcpy(0x742dc80, 0x742dc80, 1)
==21085==    at 0x4A24F66: _intel_fast_memcpy (mc_replace_strmem.c:894)
==21085==    by 0x562E6D7: kpufprow (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x562BFDE: kpufch0 (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x562ACB6: kpufch (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x5520A2F: OCIStmtFetch2 (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x4CDAF6E: OCI_FetchData (resultset.c:506)
==21085==    by 0x4CDB405: OCI_FetchNext (resultset.c:1117)
==21085==    by 0x401B95: HoleInstrumentenDiffListeDB (unzipper_m.c:221)
==21085==    by 0x402AA9: main (unzipper_m.c:691)


==21085== Conditional jump or move depends on uninitialised value(s)
==21085==    at 0x5EC79DF: slpmloclfv (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x5EC771E: slpmloc (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x5EC4C44: lpmloadpkg (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x5EAAA8E: lfvLoadPkg (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x5EAA719: lfvSetShlMode (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x5EAA518: lfvini1 (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x5EAA234: lfvinit (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x5ACD1C9: kpummpin (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x547EED8: kpuenvcr (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x551FCD5: OCIEnvCreate (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x4CE311B: OCI_Initialize (library.c:1140)
==21085==    by 0x401942: HoleInstrumentenDiffListeDB (unzipper_m.c:207)



==21085== Use of uninitialised value of size 8
==21085==    at 0x56DFE05: ztceadecbk (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x56DC6BC: ztceb_decblk (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x56DC3BE: ztcebf (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x56DBB8A: ztcef (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x56DBC6E: ztcedec (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x57341A3: ztvo5ed (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x5734FA5: ztvo5ver (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x54C899D: kpu8lgn (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x54C649C: kpuauthxa (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x54C5EA5: kpuauth (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x551FF1A: OCISessionBegin (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==21085==    by 0x4CD45EA: OCI_ConnectionLogon (connection.c:598)

Мога ли да подобря своя код? Ако не - колко безопасно е да го оставите такъв, какъвто е?


person MaMu    schedule 03.03.2014    source източник
comment
OCI_ConnectionCreate и OCI_ConnectionCreate връщат ли стойност, различна от NULL? Вашето изявление Select.... изглежда непълно.   -  person Jabberwocky    schedule 03.03.2014
comment
Не, той се свързва и изпълнява заявката.   -  person MaMu    schedule 03.03.2014
comment
Може би някои проблеми във функцията за повикване. BTW зададохте почти същия въпрос тук.   -  person Jabberwocky    schedule 03.03.2014
comment
Да, но все още нямам решение.   -  person MaMu    schedule 03.03.2014
comment
Искате да кажете, че наричам функцията погрешно?   -  person MaMu    schedule 03.03.2014
comment
Ако искате решение, просто поправете кода, това е проект с отворен код. Ако не искате да го направите сами, изпратете грешка, въпреки че е доста важно да демонстрирате действителен провал, за да бъдете взети на сериозно.   -  person Hans Passant    schedule 03.03.2014
comment
Ако можех да го оправя, нямаше да задавам едни и същи въпроси два пъти :s..   -  person MaMu    schedule 03.03.2014


Отговори (1)


първо, трябва да извикате OCI_Initialize() и OCI_Cleanup() веднъж на приложение и за предпочитане от основната нишка.

Що се отнася до следите на Valgrind, които имате, можете да видите, че се отнася за вътрешен код от клиентска споделена библиотека на Oracle, доставена от Oracle. Ще получите същото с приложение, кодирано с чист OCI код. Тези следи не са свързани с OCILIB код, който е изграден върху горния OCI.

Създайте приложение, което просто извиква OCI повикването OCIEnvCreate() и погледнете следите на Valgrind. Ще имате подобни следи.

За разбирането,

Винсент

person Vincent Rogier    schedule 03.03.2014