ruby 1.9.2中的rfuzz编译错误

时间:2011-03-08 19:31:42

标签: c ruby

我正在尝试编译rfuzz的c扩展名。我得到的错误是

make gcc -I. -I/usr/local/include/ruby-1.9.1/i686-linux -I/usr/local/include/ruby-1.9.1/ruby/backward -I/usr/local/include/ruby-1.9.1 -I. -D_FILE_OFFSET_BITS=64  -fPIC -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long  -o http11_client.o -c http11_client.c
http11_client.c: In function ‘client_http_field’:
http11_client.c:36:22: error: ‘struct RString’ has no member named ‘ptr’
http11_client.c:36:50: error: ‘struct RString’ has no member named ‘len’
http11_client.c: In function ‘HttpClientParser_execute’:
http11_client.c:218:23: error: ‘struct RString’ has no member named ‘ptr’
http11_client.c:219:23: error: ‘struct RString’ has no member named ‘len’
make: *** [http11_client.o] Error 1

RString在Ruby.h中。 ruby.h中的结构确实有这些成员。

struct RString {
    struct RBasic basic;
    union {
        struct {
            long len;
            char *ptr;
            union {
                long capa;  
                VALUE shared;
            } aux;
        } heap;
        char ary[RSTRING_EMBED_LEN_MAX + 1];
    } as;
};

我错过了什么?

2 个答案:

答案 0 :(得分:2)

看起来RFuzz与Ruby 1.9.2不兼容。 1.9.2的RString定义如您所列,但对于1.8.7,它看起来像这样:

struct RString {
    struct RBasic basic;
    long len;
    char *ptr;
    union {
        long capa;
        VALUE shared;
    } aux;
};

匹配RFuzz源似乎正在寻找的东西。因此,您可以使用RFuzz下拉至1.8,或者您可以尝试移植RFuzz以使用更新版本的Ruby。

自2006年以来,RFuzz网站似乎没有更新过,因此可能根本不再进行维护。

答案 1 :(得分:0)

我不知道ruby源代码;只要查看你发布的内容:

类型struct RString有2个成员:basic(类型为struct RBasic)和as(无标记联合类型)。

as标识的未标记联合有2个成员:heap未标记的结构类型和ary的char类型数组。

heap标识的未标记结构具有ptr成员。

所以要达到它你需要

struct RString x;
x.as.heap.ptr; /* this is a char* */