2016-04-29 15 views
0

私はValac 0.30をインストールしました。次のコードを実行すると、Genie Segfaults on easy typecast

[indent=4] 
init 
    str : string 
    str = "Hello World"; 
    data : array of uint8 
    data = (array of uint8) str; 
    print "%i\n", data.length; 

私はsegfaultを取得します。 GDBが私に告げるこの:

 
Program received signal SIGSEGV, Segmentation fault. 
__memcpy_sse2_unaligned() 
    at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:36 
36 ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S: No such file or directory. 

私はこの問題でいくつかの他の人々を見てきたが、それらのどれも私のために働いてきたソリューションを得ませんでした。

+1

GDBがあなたに伝える重要な部分は、セグメント化エラーに関する行です。次に、ファイル名と行番号を含めて、起こった機能を指示します。ここでの問題は、ライブラリ関数でクラッシュが発生し、標準ライブラリのソースがインストールされていないことです。これは心配する必要はありません。代わりに、関数呼び出しスタック( 'bt'コマンドを使用)を見てクラッシュが発生した場所を調べる必要があります。また、生成されたCコードを見て、どこを指し示すことができるかにも役立ちます。 –

答えて

2

stringarray of uint8にハードキャストするようコンパイラーに指示していますが、これらのタイプは割り当てに対応していません。

(あなたがvalac -Cを得ることができます)簡略化され、生成されたCコードは次のようになりますフードの下で:

#include <glib.h> 

int main (void) { 
     gchar* str = g_strdup ("Hello World"); 
     // Ouch: A negative number is used as length for g_memdup 
     // This will produce a segfault, because the parameter is unsigned and will overflow to a very big number. 
     // The string is only 11 bytes long however 
     guint8* data = g_memdup (str, -1 * sizeof(guint8)); 
     int data_length1 = -1; 
     g_print ("%i\n\n", data_length1); 
     g_free (data); 
     g_free (str); 
     return 0; 
} 

string data typeが何をしようとするために意味されている2つのプロパティ(Valaの構文を)持っています:

public int length { get; } 
public uint8[] data { get; } 

だから、このようなあなたのコードを書くことができます。

[indent=4] 
init 
    str: string = "Hello World"; 
    print "%i\n", str.length; 

またはこのよう:ここに完全を期すために

[indent=4] 
init 
    str: string = "Hello World"; 
    data: array of uint8 = str.data; 
    print "%i\n", data.length; 

gdbバックトレースです:

(gdb) run 
Starting program: /home/user/src/genie/Test 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib64/libthread_db.so.1". 

Program received signal SIGSEGV, Segmentation fault. 
__memcpy_avx_unaligned() at ../sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S:245 
245    vmovdqu -0x80(%rsi,%rdx), %xmm5 
(gdb) bt 
#0 __memcpy_avx_unaligned() at ../sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S:245 
#1 0x00007ffff78b66c6 in memcpy (__len=4294967295, __src=0x60cdd0, __dest=<optimized out>) at /usr/include/bits/string3.h:53 
#2 g_memdup (mem=0x60cdd0, byte_size=4294967295) at /usr/src/debug/dev-libs/glib-2.46.2-r2/glib-2.46.2/glib/gstrfuncs.c:392 
#3 0x00000000004007d6 in _vala_array_dup1 (self=0x60cdd0 "Hello World", length=-1) at /home/user/src/genie/Test.gs:6 
#4 0x000000000040085e in _vala_main (args=0x7fffffffdf78, args_length1=1) at /home/user/src/genie/Test.gs:6 
#5 0x00000000004008f5 in main (argc=1, argv=0x7fffffffdf78) at /home/user/src/genie/Test.gs:2 

のでg_memdupが、ここで11バイト文字列から4294967295のバイトをコピーしようとしています。

+0

ありがとうございました。すべてを説明します。上記のコードスニペットは、私が使用しようとしているライブラリにあります。そのような頭痛になりました。再度、感謝します。 – user2784930