[MacRuby] #1034: Requiring Mechanize gives segmentation fault

MacRuby ruby-noreply at macosforge.org
Fri Dec 17 15:34:24 PST 2010


#1034: Requiring Mechanize gives segmentation fault
------------------------------+---------------------------------------------
 Reporter:  vegar@…           |       Owner:  lsansonetti@…        
     Type:  defect            |      Status:  new                  
 Priority:  blocker           |   Milestone:                       
Component:  MacRuby           |    Keywords:  meahanize            
------------------------------+---------------------------------------------

Comment(by lsansonetti@…):

 We crash because we are compiling a bad function.

 {{{

 (gdb) p func->dump()

 define internal i64 @ruby_scope2102(i64 %self, i8* %sel, i64 %ctx, i64
 %params) {
 MainBlock:
   %argv105 = alloca [6 x i64], align 8            ; <[6 x i64]*> [#uses=9]
   %0 = load i8* @542                              ; <i8> [#uses=1]
   %1 = call i64 @vm_fast_aref(i64 %params, i64 17187762816, i8 %0) ; <i64>
 [#uses=5]
   %2 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
 140735647268441 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !0 ;
 <i64> [#uses=1]
   %3 = call i64 @vm_dispatch(i64 %self, i64 %2, i8* inttoptr (i64
 4307274176 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !0 ; <i64>
 [#uses=3]
   %4 = call i64 @rb_str_new(i8* getelementptr inbounds ([5 x i8]* @544,
 i64 0, i64 0), i32 4) ; <i64> [#uses=1]
   %5 = load i8* @562                              ; <i8> [#uses=1]
   %6 = call i64 @vm_fast_eqq(i64 %4, i64 %3, i8 %5) ; <i64> [#uses=1]
   switch i64 %6, label %then [
     i64 0, label %next_test
     i64 4, label %next_test
   ]

 case_merge:                                       ; preds =
 %next_test5.case_merge_crit_edge, %then92, %merge34
   %.0 = phi i64 [ %111, %then92 ], [ %.1, %merge34 ], [ 4,
 %next_test5.case_merge_crit_edge ] ; <i64> [#uses=2]
   %7 = bitcast [6 x i64]* %argv105 to i64*        ; <i64*> [#uses=4]
   %8 = load i64* @1875                            ; <i64> [#uses=1]
   %9 = call i64 @vm_get_const(i64 %8, i8* inttoptr (i64 4417037952 to
 i8*), i64 38861, i32 1) ; <i64> [#uses=1]
   store i64 %9, i64* %7
   %10 = call i64 @vm_dispatch(i64 %self, i64 %.0, i8* inttoptr (i64
 4307357632 to i8*), i8* null, i8 0, i32 1, i64* %7), !dbg !2 ; <i64>
 [#uses=0]
   %11 = load i8* @543                             ; <i8> [#uses=1]
   %12 = call i64 @vm_fast_aset(i64 %params, i64 17187845856, i64 %.0, i8
 %11) ; <i64> [#uses=0]
   %13 = call i8* @vm_get_block(i64 <badref>)      ; <i8*> [#uses=1]
   store i64 %ctx, i64* %7
   %14 = getelementptr [6 x i64]* %argv105, i64 0, i64 1 ; <i64*> [#uses=1]
   store i64 %params, i64* %14
   %15 = call i64 @vm_dispatch(i64 %self, i64 %self, i8* inttoptr (i64
 4343093872 to i8*), i8* %13, i8 4, i32 2, i64* %7), !dbg !3 ; <i64>
 [#uses=1]
   ret i64 %15

 then:                                             ; preds = %next_test,
 %MainBlock
   %16 = call i64 @vm_ivar_get(i64 %self, i64 17793, i8* inttoptr (i64
 4427566448 to i8*)) ; <i64> [#uses=2]
   %17 = call i64 @rb_str_new_empty()              ; <i64> [#uses=1]
   %18 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
 140735647467272 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !4 ;
 <i64> [#uses=1]
   %19 = call i64 @rb_str_new(i8* getelementptr inbounds ([2 x i8]* @761,
 i64 0, i64 0), i32 1) ; <i64> [#uses=1]
   %20 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
 140735730191293 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !4 ;
 <i64> [#uses=1]
   %21 = call i64 (i32, ...)* @rb_str_new_fast(i32 4, i64 %17, i64 %18, i64
 %19, i64 %20) ; <i64> [#uses=2]
   %22 = load i8* @542                             ; <i8> [#uses=1]
   %23 = call i64 @vm_fast_aref(i64 %16, i64 %21, i8 %22) ; <i64> [#uses=2]
   switch i64 %23, label %then.merge_crit_edge [
     i64 0, label %normal11
     i64 4, label %normal11
   ]

 then.merge_crit_edge:                             ; preds = %then
   br label %merge

 next_test:                                        ; preds = %MainBlock,
 %MainBlock
   %24 = call i64 @rb_str_new(i8* getelementptr inbounds ([6 x i8]* @545,
 i64 0, i64 0), i32 5) ; <i64> [#uses=1]
   %25 = load i8* @562                             ; <i8> [#uses=1]
   %26 = call i64 @vm_fast_eqq(i64 %24, i64 %3, i8 %25) ; <i64> [#uses=1]
   switch i64 %26, label %then [
     i64 0, label %next_test5
     i64 4, label %next_test5
   ]

 next_test5:                                       ; preds = %next_test,
 %next_test
   %27 = call i64 @rb_str_new(i8* getelementptr inbounds ([5 x i8]* @547,
 i64 0, i64 0), i32 4) ; <i64> [#uses=1]
   %28 = load i8* @562                             ; <i8> [#uses=1]
   %29 = call i64 @vm_fast_eqq(i64 %27, i64 %3, i8 %28) ; <i64> [#uses=1]
   switch i64 %29, label %then92 [
     i64 0, label %next_test5.case_merge_crit_edge
     i64 4, label %next_test5.case_merge_crit_edge
   ]

 next_test5.case_merge_crit_edge:                  ; preds = %next_test5,
 %next_test5
   br label %case_merge

 normal11:                                         ; preds = %then, %then
   %30 = call i64 @vm_rhash_new()                  ; <i64> [#uses=3]
   call void @vm_rhash_store(i64 %30, i64 17187845856, i64 4)
   %31 = call i64 @vm_rhash_new()                  ; <i64> [#uses=1]
   call void @vm_rhash_store(i64 %30, i64 17188228064, i64 %31)
   %32 = load i8* @543                             ; <i8> [#uses=1]
   %33 = call i64 @vm_fast_aset(i64 %16, i64 %21, i64 %30, i8 %32) ; <i64>
 [#uses=1]
   br label %merge

 merge:                                            ; preds =
 %then.merge_crit_edge, %normal11
   %34 = phi i64 [ %33, %normal11 ], [ %23, %then.merge_crit_edge ] ; <i64>
 [#uses=6]
   %35 = load i8* @542                             ; <i8> [#uses=1]
   %36 = call i64 @vm_fast_aref(i64 %34, i64 17187845856, i8 %35) ; <i64>
 [#uses=3]
   %37 = call i64 @vm_dispatch(i64 %self, i64 %36, i8* inttoptr (i64
 4306887728 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !5 ; <i64>
 [#uses=2]
   switch i64 %37, label %merge.merge13_crit_edge [
     i64 0, label %left_not_true
     i64 4, label %left_not_true
   ]

 merge.merge13_crit_edge:                          ; preds = %merge
   br label %merge13

 left_not_true:                                    ; preds = %merge, %merge
   %38 = call i64 @vm_dispatch(i64 %self, i64 %36, i8* inttoptr (i64
 4387596112 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !5 ; <i64>
 [#uses=1]
   switch i64 %38, label %40 [
     i64 0, label %left_not_true._crit_edge
     i64 4, label %left_not_true._crit_edge
   ]

 left_not_true._crit_edge:                         ; preds =
 %left_not_true, %left_not_true
   br label %41

 merge13:                                          ; preds =
 %merge.merge13_crit_edge, %41
   %39 = phi i64 [ %37, %merge.merge13_crit_edge ], [ %42, %41 ] ; <i64>
 [#uses=1]
   switch i64 %39, label %then17 [
     i64 0, label %merge13.merge18_crit_edge
     i64 4, label %merge13.merge18_crit_edge
   ]

 merge13.merge18_crit_edge:                        ; preds = %merge13,
 %merge13
   br label %merge18

 ; <label>:40                                      ; preds = %left_not_true
   br label %41

 ; <label>:41                                      ; preds =
 %left_not_true._crit_edge, %40
   %42 = phi i64 [ 0, %40 ], [ 2, %left_not_true._crit_edge ] ; <i64>
 [#uses=1]
   br label %merge13

 then17:                                           ; preds = %merge13
   %43 = bitcast [6 x i64]* %argv105 to i64*       ; <i64*> [#uses=2]
   %44 = load i64* @1875                           ; <i64> [#uses=1]
   %45 = call i64 @vm_get_const(i64 %44, i8* inttoptr (i64 4387725584 to
 i8*), i64 18869, i32 1) ; <i64> [#uses=1]
   %46 = call i64 @vm_get_const(i64 %45, i8* inttoptr (i64 4342662336 to
 i8*), i64 19069, i32 0) ; <i64> [#uses=1]
   %47 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
 140735647467272 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !6 ;
 <i64> [#uses=1]
   %48 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
 140735730191293 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !7 ;
 <i64> [#uses=1]
   %49 = call i64 @vm_ivar_get(i64 %self, i64 17737, i8* inttoptr (i64
 4427581408 to i8*)) ; <i64> [#uses=1]
   %50 = call i64 @vm_ivar_get(i64 %self, i64 17753, i8* inttoptr (i64
 4427407088 to i8*)) ; <i64> [#uses=1]
   %51 = call i64 @vm_ivar_get(i64 %self, i64 17761, i8* inttoptr (i64
 4427345072 to i8*)) ; <i64> [#uses=1]
   %52 = call i64 @vm_ivar_get(i64 %self, i64 17745, i8* inttoptr (i64
 4427406528 to i8*)) ; <i64> [#uses=1]
   store i64 %47, i64* %43
   %53 = getelementptr [6 x i64]* %argv105, i64 0, i64 1 ; <i64*> [#uses=1]
   store i64 %48, i64* %53
   %54 = getelementptr [6 x i64]* %argv105, i64 0, i64 2 ; <i64*> [#uses=1]
   store i64 %49, i64* %54
   %55 = getelementptr [6 x i64]* %argv105, i64 0, i64 3 ; <i64*> [#uses=1]
   store i64 %50, i64* %55
   %56 = getelementptr [6 x i64]* %argv105, i64 0, i64 4 ; <i64*> [#uses=1]
   store i64 %51, i64* %56
   %57 = getelementptr [6 x i64]* %argv105, i64 0, i64 5 ; <i64*> [#uses=1]
   store i64 %52, i64* %57
   %58 = call i64 @vm_dispatch(i64 %self, i64 %46, i8* inttoptr (i64
 4306630128 to i8*), i8* null, i8 0, i32 6, i64* %43), !dbg !8 ; <i64>
 [#uses=2]
   %59 = load i8* @543                             ; <i8> [#uses=1]
   %60 = call i64 @vm_fast_aset(i64 %34, i64 17187845856, i64 %58, i8 %59)
 ; <i64> [#uses=0]
   %61 = call i64 @vm_rhash_new()                  ; <i64> [#uses=1]
   %62 = load i8* @543                             ; <i8> [#uses=1]
   %63 = call i64 @vm_fast_aset(i64 %34, i64 17188228064, i64 %61, i8 %62)
 ; <i64> [#uses=0]
   br label %merge18

 merge18:                                          ; preds =
 %merge13.merge18_crit_edge, %then17
   %.1 = phi i64 [ %58, %then17 ], [ %36, %merge13.merge18_crit_edge ] ;
 <i64> [#uses=3]
   %64 = call i64 @vm_ivar_get(i64 %self, i64 17809, i8* inttoptr (i64
 4427504160 to i8*)) ; <i64> [#uses=2]
   switch i64 %64, label %left_is_true28 [
     i64 0, label %merge18.merge30_crit_edge
     i64 4, label %merge18.merge30_crit_edge
   ]

 merge18.merge30_crit_edge:                        ; preds = %merge18,
 %merge18
   br label %merge30

 left_is_true28:                                   ; preds = %merge18
   %65 = call i64 @vm_dispatch(i64 %self, i64 %.1, i8* inttoptr (i64
 4387596112 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !9 ; <i64>
 [#uses=1]
   br label %merge30

 merge30:                                          ; preds =
 %merge18.merge30_crit_edge, %left_is_true28
   %66 = phi i64 [ %64, %merge18.merge30_crit_edge ], [ %65,
 %left_is_true28 ] ; <i64> [#uses=1]
   switch i64 %66, label %then32 [
     i64 0, label %merge34
     i64 4, label %merge34
   ]

 then32:                                           ; preds = %merge30
   %67 = load i8* @542                             ; <i8> [#uses=1]
   %68 = call i64 @vm_fast_aref(i64 %34, i64 17188228064, i8 %67) ; <i64>
 [#uses=4]
   %69 = load i8* @542                             ; <i8> [#uses=1]
   %70 = call i64 @vm_fast_aref(i64 %68, i64 17184783136, i8 %69) ; <i64>
 [#uses=2]
   switch i64 %70, label %left_is_true45 [
     i64 0, label %then32.merge50_crit_edge
     i64 4, label %then32.merge50_crit_edge
   ]

 then32.merge50_crit_edge:                         ; preds = %then32,
 %then32
   br label %merge50

 merge34:                                          ; preds = %merge43,
 %merge43, %merge79, %merge30, %merge30
   %71 = load i64* @1875                           ; <i64> [#uses=1]
   %72 = call i64 @vm_get_const(i64 %71, i8* inttoptr (i64 4340611040 to
 i8*), i64 10733, i32 1) ; <i64> [#uses=1]
   %73 = call i64 @vm_dispatch(i64 %self, i64 %72, i8* inttoptr (i64
 140735637114523 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !10 ;
 <i64> [#uses=1]
   %74 = call i64 @vm_dispatch(i64 %self, i64 %73, i8* inttoptr (i64
 4307210912 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !10 ; <i64>
 [#uses=1]
   %75 = load i8* @543                             ; <i8> [#uses=1]
   %76 = call i64 @vm_fast_aset(i64 %34, i64 17189695712, i64 %74, i8 %75)
 ; <i64> [#uses=0]
   br label %case_merge

 left_not_true38:                                  ; preds = %merge50,
 %merge50
   %77 = load i8* @542                             ; <i8> [#uses=1]
   %78 = call i64 @vm_fast_aref(i64 %68, i64 17184784832, i8 %77) ; <i64>
 [#uses=2]
   switch i64 %78, label %left_is_true61 [
     i64 0, label %left_not_true38.merge43_crit_edge
     i64 4, label %left_not_true38.merge43_crit_edge
   ]

 left_not_true38.merge43_crit_edge:                ; preds =
 %left_not_true38, %left_not_true38
   br label %merge43

 merge43:                                          ; preds =
 %merge50.merge43_crit_edge, %left_not_true38.merge43_crit_edge,
 %left_is_true61
   %79 = phi i64 [ %93, %merge50.merge43_crit_edge ], [ %78,
 %left_not_true38.merge43_crit_edge ], [ %98, %left_is_true61 ] ; <i64>
 [#uses=1]
   switch i64 %79, label %then71 [
     i64 0, label %merge34
     i64 4, label %merge34
   ]

 left_is_true45:                                   ; preds = %then32
   %80 = load i64* @1875                           ; <i64> [#uses=1]
   %81 = call i64 @vm_get_const(i64 %80, i8* inttoptr (i64 4340611040 to
 i8*), i64 10733, i32 1) ; <i64> [#uses=1]
   %82 = call i64 @vm_dispatch(i64 %self, i64 %81, i8* inttoptr (i64
 140735637114523 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !11 ;
 <i64> [#uses=1]
   %83 = call i64 @vm_dispatch(i64 %self, i64 %82, i8* inttoptr (i64
 4307210912 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !11 ; <i64>
 [#uses=1]
   %84 = load i8* @542                             ; <i8> [#uses=1]
   %85 = call i64 @vm_fast_aref(i64 %34, i64 17189695712, i8 %84) ; <i64>
 [#uses=1]
   %86 = load i8* @601                             ; <i8> [#uses=1]
   %87 = call i64 @vm_fast_minus(i64 %83, i64 %85, i8 %86) ; <i64>
 [#uses=1]
   %88 = load i8* @542                             ; <i8> [#uses=1]
   %89 = call i64 @vm_fast_aref(i64 %68, i64 17184783136, i8 %88) ; <i64>
 [#uses=1]
   %90 = call i64 @vm_dispatch(i64 %self, i64 %89, i8* inttoptr (i64
 4307210912 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !11 ; <i64>
 [#uses=1]
   %91 = load i8* @580                             ; <i8> [#uses=1]
   %92 = call i64 @vm_fast_gt(i64 %87, i64 %90, i8 %91) ; <i64> [#uses=1]
   br label %merge50

 merge50:                                          ; preds =
 %then32.merge50_crit_edge, %left_is_true45
   %93 = phi i64 [ %70, %then32.merge50_crit_edge ], [ %92, %left_is_true45
 ] ; <i64> [#uses=2]
   switch i64 %93, label %merge50.merge43_crit_edge [
     i64 0, label %left_not_true38
     i64 4, label %left_not_true38
   ]

 merge50.merge43_crit_edge:                        ; preds = %merge50
   br label %merge43

 left_is_true61:                                   ; preds =
 %left_not_true38
   %94 = load i8* @542                             ; <i8> [#uses=1]
   %95 = call i64 @vm_fast_aref(i64 %68, i64 17184784832, i8 %94) ; <i64>
 [#uses=1]
   %96 = call i64 @vm_dispatch(i64 %self, i64 %95, i8* inttoptr (i64
 4307210912 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !12 ; <i64>
 [#uses=1]
   %97 = load i8* @582                             ; <i8> [#uses=1]
   %98 = call i64 @vm_fast_eq(i64 %96, i64 5, i8 %97) ; <i64> [#uses=1]
   br label %merge43

 then71:                                           ; preds = %merge43
   %99 = load i64* @1875                           ; <i64> [#uses=1]
   %100 = call i64 @vm_get_const(i64 %99, i8* inttoptr (i64 4342871248 to
 i8*), i64 17253, i32 1) ; <i64> [#uses=1]
   %101 = call i64 @vm_dispatch(i64 %self, i64 %100, i8* inttoptr (i64
 140735586760668 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !13 ;
 <i64> [#uses=1]
   switch i64 %101, label %then77 [
     i64 0, label %merge79
     i64 4, label %merge79
   ]

 then77:                                           ; preds = %then71
   %102 = bitcast [6 x i64]* %argv105 to i64*      ; <i64*> [#uses=2]
   %103 = load i64* @1875                          ; <i64> [#uses=1]
   %104 = call i64 @vm_get_const(i64 %103, i8* inttoptr (i64 4342871248 to
 i8*), i64 17253, i32 1) ; <i64> [#uses=1]
   %105 = call i64 @vm_dispatch(i64 %self, i64 %104, i8* inttoptr (i64
 140735586760668 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !13 ;
 <i64> [#uses=1]
   %106 = call i64 @rb_str_new(i8* getelementptr inbounds ([27 x i8]*
 @1876, i64 0, i64 0), i32 26) ; <i64> [#uses=1]
   store i64 %106, i64* %102
   %107 = call i64 @vm_dispatch(i64 %self, i64 %105, i8* inttoptr (i64
 4340748592 to i8*), i8* null, i8 0, i32 1, i64* %102), !dbg !13 ; <i64>
 [#uses=0]
   br label %merge79

 merge79:                                          ; preds = %then71,
 %then71, %then77
   %108 = call i64 @vm_dispatch(i64 %self, i64 %.1, i8* inttoptr (i64
 140735722266157 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !14 ;
 <i64> [#uses=0]
   br label %merge34

 then92:                                           ; preds = %next_test5
   %109 = load i64* @1875                          ; <i64> [#uses=1]
   %110 = call i64 @vm_get_const(i64 %109, i8* inttoptr (i64 4387571792 to
 i8*), i64 8229, i32 1) ; <i64> [#uses=1]
   %111 = call i64 @vm_dispatch(i64 %self, i64 %110, i8* inttoptr (i64
 140735647727148 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !15 ;
 <i64> [#uses=2]
   %112 = call i64 @rb_singleton_class(i64 %111)   ; <i64> [#uses=4]
   store i64 %112, i64* @1877
   call void @vm_set_current_scope(i64 %112, i32 1)
   %113 = call i64 @ruby_scope2103(i64 %112, i8* null) ; <i64> [#uses=0]
   call void @vm_set_current_scope(i64 %112, i32 0)
   br label %case_merge
 }
 }}}

 vm_get_block is called with a badref

-- 
Ticket URL: <http://www.macruby.org/trac/ticket/1034#comment:3>
MacRuby <http://macruby.org/>



More information about the macruby-tickets mailing list