简体   繁体   English

东京内阁在* sp = rec-> vsiz;的tcbdb.h中给出分段错误;

[英]Tokyo Cabinet gives segmentation fault in tcbdb.h on *sp = rec->vsiz;

I am using Tokyo Cabinet for creating persistent storage database. 我正在使用Tokyo Cabinet创建持久存储数据库。

I am using void *tcbdbget(TCBDB *bdb, const void *kbuf, int ksiz, int *sp); 我正在使用void *tcbdbget(TCBDB *bdb, const void *kbuf, int ksiz, int *sp); It gives segfault in tcbdb.h file on *sp = rec->vsiz; 它在*sp = rec->vsiz; tcbdb.h文件中提供segfault *sp = rec->vsiz; .

Is there a bug in Tokyo Cabinet or am I missing something? 东京内阁是否有虫子或我遗失了一些东西?

Because inserting the record works fine that means all the void pointers are perfectly getting inserted, just lookup has problem. 由于插入记录的工作正常,这意味着可以完全插入所有空指针,因此查找就存在问题。 The insert function is this bool tcbdbput(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz); 插入函数是这个bool tcbdbput(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz); .

It gives segfault in tcbdb.h file on *sp = rec->vsiz; 它在*sp = rec->vsiz; tcbdb.h文件中提供segfault *sp = rec->vsiz;

Tokyo Cabinet (aka TC) expects you pass a valid, non NULL pointer to store the size of the value when you call tcbdbget , eg: 东京内阁(又名TC)希望您在调用tcbdbget时传递一个有效的非NULL指针来存储值的大小,例如:

int size;
char *buf = tcbdbget(bdb, kbuf, ksiz, &size);

Passing a NULL pointer could explain the segfault at this precise code section. 传递NULL指针可以在此精确的代码部分解释segfault。 Please find below a sample code that you can build with BUG = 1 to generate a segfault - with BUG = 0 everything works like a charm :) 请在下面找到一个示例代码,您可以使用BUG = 1进行构建以生成段BUG = 0 -如果BUG = 0所有操作都像一个超级魅力:)

#include <stdio.h>
#include <string.h>
#include <tcbdb.h>

#define BUG 0

int
main(void)
{
  TCBDB *bdb = tcbdbnew();

  if (!tcbdbopen(bdb, "store.db", BDBOWRITER | BDBOCREAT)) {
    fprintf(stderr, "error: %s\n", tcbdberrmsg(tcbdbecode(bdb)));
  }

  char *key = "foo";
  char *val = "bar";

  if (!tcbdbput(bdb, key, strlen(key), val, strlen(val))) {
    fprintf(stderr, "error: %s\n", tcbdberrmsg(tcbdbecode(bdb)));
  }

  int size;
#if BUG
  char *buf = tcbdbget(bdb, key, strlen(key), NULL);
#else
  char *buf = tcbdbget(bdb, key, strlen(key), &size);
#endif

  if (!buf && tcbdbecode(bdb) != TCENOREC) {
    fprintf(stderr, "error: %s\n", tcbdberrmsg(tcbdbecode(bdb)));
  }

  if (buf)
    printf("%s -> %s\n", key, buf);

  free(buf);
  tcbdbdel(bdb);
  return 0;
}

Note: since TC always append a trailing terminator \\0 , and since I know I've stored a character string I can safely printf buf with %s . 注意:由于TC总是在末尾附加\\0 ,并且由于我知道已经存储了字符串,因此可以安全地使用%sprintf buf

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM