'tiny_malloc_from_free_list' сделал мой указатель 'NULL'? - программирование
Подтвердить что ты не робот

'tiny_malloc_from_free_list' сделал мой указатель 'NULL'?

Я работаю над кодом, который включает, среди прочего, модуль bllipparser Python. Подавая один и тот же набор данных, он будет периодически сбой (возможно, один раз в три-десять пробегов). Пройдя через lldb, я обнаружил, что weights RerankerModel полей RerankerModel (источник), который, по-видимому, установлен только один раз (в конструкторе), случайным образом становится NULL (у меня только один RerankerModel на время моего запуска, поэтому должно быть точно один weights, который остается неизменным повсюду). Поэтому я создал засаду (я имею в виду точку наблюдения: я остановил код в watchpoint set expression -w write -- &weights конструктора и точки watchpoint set expression -w write -- &weights), и, по-видимому, виновником, который tiny_malloc_from_free_list указатель, является tiny_malloc_from_free_list из libsystem_malloc.dylib. Здесь соответствующий верх backtrace:

* thread #1, queue = 'com.apple.main-thread', stop reason = watchpoint 4
  * frame #0: 0x00007fff61caf22a libsystem_malloc.dylib'tiny_malloc_from_free_list + 151
    frame #1: 0x00007fff61cae3bf libsystem_malloc.dylib'szone_malloc_should_clear + 422
    frame #2: 0x00007fff61cae1bd libsystem_malloc.dylib'malloc_zone_malloc + 103
    frame #3: 0x00007fff61cad4c7 libsystem_malloc.dylib'malloc + 24
    frame #4: 0x00007fff5faac628 libc++abi.dylib'operator new(unsigned long) + 40
    frame #5: 0x00000001133c904c _CharniakParser.cpython-36m-darwin.so'std::__1::__split_buffer<short, std::__1::allocator<short>&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<short>&) [inlined] std::__1::__allocate(__size=4) at new:226
    frame #6: 0x00000001133c9040 _CharniakParser.cpython-36m-darwin.so'std::__1::__split_buffer<short, std::__1::allocator<short>&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<short>&) [inlined] std::__1::allocator<short>::allocate(this=0x0000000135316448, __n=2, (null)=0x0000000000000000) at memory:1747
    frame #7: 0x00000001133c8f44 _CharniakParser.cpython-36m-darwin.so'std::__1::__split_buffer<short, std::__1::allocator<short>&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<short>&) [inlined] std::__1::allocator_traits<std::__1::allocator<short> >::allocate(__a=0x0000000135316448, __n=2) at memory:1502
    frame #8: 0x00000001133c8f16 _CharniakParser.cpython-36m-darwin.so'std::__1::__split_buffer<short, std::__1::allocator<short>&>::__split_buffer(this=0x00007ffeefbf3b48, __cap=2, __start=1, __a=0x0000000135316448) at __split_buffer:311
    frame #9: 0x00000001133c878d _CharniakParser.cpython-36m-darwin.so'std::__1::__split_buffer<short, std::__1::allocator<short>&>::__split_buffer(this=0x00007ffeefbf3b48, __cap=2, __start=1, __a=0x0000000135316448) at __split_buffer:310
    frame #10: 0x00000001133c869b _CharniakParser.cpython-36m-darwin.so'void std::__1::vector<short, std::__1::allocator<short> >::__push_back_slow_path<short const>(this=0x0000000135316438 size=1, __x=0x00007ffeefbf3caa) at vector:1567
    frame #11: 0x00000001133c4446 _CharniakParser.cpython-36m-darwin.so'Val::extendTrees(Bst&, int) [inlined] std::__1::vector<short, std::__1::allocator<short> >::push_back(this=0x0000000135316438 size=1, __x=0x00007ffeefbf3caa) at vector:1588

Я очень не специалист по C++, но... Как распределитель NULLing указатель? Как распределитель даже знает, где находится указатель? Почему распределитель NULLing указатель? Я имею в виду, я могу видеть, как у меня может быть нехватка памяти, что я делаю, это не совсем свет памяти, но я бы скорее ожидал, что распределитель не сможет выделить, чем случайным образом освободить что-то, - и я понятия не имел может NULL указатель. Может ли кто-нибудь объяснить мне, как это работает, почему это произошло, как это произошло, почему он всегда является одним и тем же указателем в коде, который содержит много и много других сочных указателей, и что я могу сделать, чтобы это не произошло?

Добавление, если необходимо: здесь, где имеет место фактическое NULLing, код tiny_malloc_from_free_list, если кто-то может понять это...

libsystem_malloc.dylib'tiny_malloc_from_free_list:
    0x7fff61caf193 <+0>:    pushq  %rbp
    0x7fff61caf194 <+1>:    movq   %rsp, %rbp
    0x7fff61caf197 <+4>:    pushq  %r15
    0x7fff61caf199 <+6>:    pushq  %r14
    0x7fff61caf19b <+8>:    pushq  %r13
    0x7fff61caf19d <+10>:   pushq  %r12
    0x7fff61caf19f <+12>:   pushq  %rbx
    0x7fff61caf1a0 <+13>:   pushq  %rax
    0x7fff61caf1a1 <+14>:   movl   %edx, %r15d
    0x7fff61caf1a4 <+17>:   movq   %rsi, %r14
    0x7fff61caf1a7 <+20>:   movq   %rdi, %r12
    0x7fff61caf1aa <+23>:   leal   -0x1(%r15), %ecx
    0x7fff61caf1ae <+27>:   movq   0x18(%r14,%rcx,8), %r13
    0x7fff61caf1b3 <+32>:   testq  %r13, %r13
    0x7fff61caf1b6 <+35>:   je     0x7fff61caf22f            ; <+156>
    0x7fff61caf1b8 <+37>:   movq   0x8(%r13), %rdx
    0x7fff61caf1bc <+41>:   movq   %rdx, %rax
    0x7fff61caf1bf <+44>:   shlq   $0x4, %rax
    0x7fff61caf1c3 <+48>:   shrq   $0x3c, %rdx
    0x7fff61caf1c7 <+52>:   movq   0x278(%r12), %rsi
    0x7fff61caf1cf <+60>:   xorq   %rax, %rsi
    0x7fff61caf1d2 <+63>:   movq   %rsi, %rdi
    0x7fff61caf1d5 <+66>:   shrq   $0x8, %rdi
    0x7fff61caf1d9 <+70>:   addl   %esi, %edi
    0x7fff61caf1db <+72>:   movq   %rsi, %rbx
    0x7fff61caf1de <+75>:   shrq   $0x10, %rbx
    0x7fff61caf1e2 <+79>:   addl   %edi, %ebx
    0x7fff61caf1e4 <+81>:   movq   %rsi, %rdi
    0x7fff61caf1e7 <+84>:   shrq   $0x18, %rdi
    0x7fff61caf1eb <+88>:   addl   %ebx, %edi
    0x7fff61caf1ed <+90>:   movq   %rsi, %rbx
    0x7fff61caf1f0 <+93>:   shrq   $0x20, %rbx
    0x7fff61caf1f4 <+97>:   addl   %edi, %ebx
    0x7fff61caf1f6 <+99>:   movq   %rsi, %rdi
    0x7fff61caf1f9 <+102>:  shrq   $0x28, %rdi
    0x7fff61caf1fd <+106>:  addl   %ebx, %edi
    0x7fff61caf1ff <+108>:  movq   %rsi, %rbx
    0x7fff61caf202 <+111>:  shrq   $0x30, %rbx
    0x7fff61caf206 <+115>:  addl   %edi, %ebx
    0x7fff61caf208 <+117>:  shrq   $0x38, %rsi
    0x7fff61caf20c <+121>:  addl   %ebx, %esi
    0x7fff61caf20e <+123>:  andl   $0xf, %esi
    0x7fff61caf211 <+126>:  cmpq   %rsi, %rdx
    0x7fff61caf214 <+129>:  jne    0x7fff61caf602            ; <+1135>
    0x7fff61caf21a <+135>:  testq  %rax, %rax
    0x7fff61caf21d <+138>:  je     0x7fff61caf2de            ; <+331>
    0x7fff61caf223 <+144>:  movq   (%r13), %rdx
    0x7fff61caf227 <+148>:  movq   %rdx, (%rax)
->  0x7fff61caf22a <+151>:  jmp    0x7fff61caf2f2            ; <+351>
    0x7fff61caf22f <+156>:  movq   $-0x1, %rax
    0x7fff61caf236 <+163>:  shlq   %cl, %rax
    0x7fff61caf239 <+166>:  andq   0x818(%r14), %rax
    0x7fff61caf240 <+173>:  je     0x7fff61caf4f9            ; <+870>
    0x7fff61caf246 <+179>:  bsfq   %rax, %rcx
    0x7fff61caf24a <+183>:  cmpq   $0x3f, %rcx
    0x7fff61caf24e <+187>:  je     0x7fff61caf39d            ; <+522>
    0x7fff61caf254 <+193>:  movq   0x18(%r14,%rcx,8), %r13
    0x7fff61caf259 <+198>:  testq  %r13, %r13
    0x7fff61caf25c <+201>:  je     0x7fff61caf39d            ; <+522>
    0x7fff61caf262 <+207>:  movq   0x8(%r13), %rdx
    0x7fff61caf266 <+211>:  movq   %rdx, %rax
    0x7fff61caf269 <+214>:  shlq   $0x4, %rax
    0x7fff61caf26d <+218>:  shrq   $0x3c, %rdx
    0x7fff61caf271 <+222>:  movq   0x278(%r12), %rsi
    0x7fff61caf279 <+230>:  xorq   %rax, %rsi
    0x7fff61caf27c <+233>:  movq   %rsi, %rdi
    0x7fff61caf27f <+236>:  shrq   $0x8, %rdi
    0x7fff61caf283 <+240>:  addl   %esi, %edi
    0x7fff61caf285 <+242>:  movq   %rsi, %rbx
    0x7fff61caf288 <+245>:  shrq   $0x10, %rbx
    0x7fff61caf28c <+249>:  addl   %edi, %ebx
    0x7fff61caf28e <+251>:  movq   %rsi, %rdi
    0x7fff61caf291 <+254>:  shrq   $0x18, %rdi
    0x7fff61caf295 <+258>:  addl   %ebx, %edi
    0x7fff61caf297 <+260>:  movq   %rsi, %rbx
    0x7fff61caf29a <+263>:  shrq   $0x20, %rbx
    0x7fff61caf29e <+267>:  addl   %edi, %ebx
    0x7fff61caf2a0 <+269>:  movq   %rsi, %rdi
    0x7fff61caf2a3 <+272>:  shrq   $0x28, %rdi
    0x7fff61caf2a7 <+276>:  addl   %ebx, %edi
    0x7fff61caf2a9 <+278>:  movq   %rsi, %rbx
    0x7fff61caf2ac <+281>:  shrq   $0x30, %rbx
    0x7fff61caf2b0 <+285>:  addl   %edi, %ebx
    0x7fff61caf2b2 <+287>:  shrq   $0x38, %rsi
    0x7fff61caf2b6 <+291>:  addl   %ebx, %esi
    0x7fff61caf2b8 <+293>:  andl   $0xf, %esi
    0x7fff61caf2bb <+296>:  cmpq   %rsi, %rdx
    0x7fff61caf2be <+299>:  jne    0x7fff61caf602            ; <+1135>
    0x7fff61caf2c4 <+305>:  movq   %rax, 0x18(%r14,%rcx,8)
    0x7fff61caf2c9 <+310>:  testq  %rax, %rax
    0x7fff61caf2cc <+313>:  je     0x7fff61caf59f            ; <+1036>
    0x7fff61caf2d2 <+319>:  movq   (%r13), %rcx
    0x7fff61caf2d6 <+323>:  movq   %rcx, (%rax)
    0x7fff61caf2d9 <+326>:  jmp    0x7fff61caf5b2            ; <+1055>
    0x7fff61caf2de <+331>:  movl   $0xfffffffe, %edx         ; imm = 0xFFFFFFFE 
    0x7fff61caf2e3 <+336>:  roll   %cl, %edx
    0x7fff61caf2e5 <+338>:  movl   %ecx, %esi
    0x7fff61caf2e7 <+340>:  shrl   $0x5, %esi
    0x7fff61caf2ea <+343>:  andl   %edx, 0x818(%r14,%rsi,4)
    0x7fff61caf2f2 <+351>:  movq   %rax, 0x18(%r14,%rcx,8)
    0x7fff61caf2f7 <+356>:  incl   0x850(%r14)
    0x7fff61caf2fe <+363>:  movzwl %r15w, %esi
    0x7fff61caf302 <+367>:  movl   %esi, %ecx
    0x7fff61caf304 <+369>:  shll   $0x4, %ecx
    0x7fff61caf307 <+372>:  addq   %rcx, 0x858(%r14)
    0x7fff61caf30e <+379>:  movq   %r13, %rax
    0x7fff61caf311 <+382>:  andq   $-0x100000, %rax          ; imm = 0xFFF00000 
    0x7fff61caf317 <+388>:  addl   0xfc098(%rax), %ecx
    0x7fff61caf31d <+394>:  movl   %ecx, 0xfc098(%rax)
    0x7fff61caf323 <+400>:  cmpl   $0xbd060, %ecx            ; imm = 0xBD060 
    0x7fff61caf329 <+406>:  jb     0x7fff61caf335            ; <+418>
    0x7fff61caf32b <+408>:  movl   $0x0, 0xfc090(%rax)
    0x7fff61caf335 <+418>:  cmpl   $0x2, %esi
    0x7fff61caf338 <+421>:  jb     0x7fff61caf344            ; <+433>
    0x7fff61caf33a <+423>:  movq   %r13, %rdi
    0x7fff61caf33d <+426>:  callq  0x7fff61cc5eaa            ; set_tiny_meta_header_in_use
    0x7fff61caf342 <+431>:  jmp    0x7fff61caf38b            ; <+504>
    0x7fff61caf344 <+433>:  movq   %r13, %rcx
    0x7fff61caf347 <+436>:  shrq   $0x4, %rcx
    0x7fff61caf34b <+440>:  movl   %r13d, %edx
    0x7fff61caf34e <+443>:  shrl   $0x8, %edx
    0x7fff61caf351 <+446>:  andl   $0xffe, %edx              ; imm = 0xFFE 
    0x7fff61caf357 <+452>:  movl   $0x1, %esi
    0x7fff61caf35c <+457>:  movl   $0x1, %edi
    0x7fff61caf361 <+462>:  shll   %cl, %edi
    0x7fff61caf363 <+464>:  orl    %edi, 0xfc0a0(%rax,%rdx,4)
    0x7fff61caf36a <+471>:  orl    $0x1, %edx
    0x7fff61caf36d <+474>:  orl    %edi, 0xfc0a0(%rax,%rdx,4)
    0x7fff61caf374 <+481>:  leal   0x1(%rcx), %ecx
    0x7fff61caf377 <+484>:  movl   %ecx, %edx
    0x7fff61caf379 <+486>:  shrl   $0x4, %edx
    0x7fff61caf37c <+489>:  andl   $0xffe, %edx              ; imm = 0xFFE 
    0x7fff61caf382 <+495>:  shll   %cl, %esi
    0x7fff61caf384 <+497>:  orl    %esi, 0xfc0a0(%rax,%rdx,4)
    0x7fff61caf38b <+504>:  movq   %r13, %rax
    0x7fff61caf38e <+507>:  addq   $0x8, %rsp
    0x7fff61caf392 <+511>:  popq   %rbx
    0x7fff61caf393 <+512>:  popq   %r12
    0x7fff61caf395 <+514>:  popq   %r13
    0x7fff61caf397 <+516>:  popq   %r14
    0x7fff61caf399 <+518>:  popq   %r15
    0x7fff61caf39b <+520>:  popq   %rbp
    0x7fff61caf39c <+521>:  retq   
    0x7fff61caf39d <+522>:  movq   0x210(%r14), %r13
    0x7fff61caf3a4 <+529>:  testq  %r13, %r13
    0x7fff61caf3a7 <+532>:  je     0x7fff61caf4f9            ; <+870>
    0x7fff61caf3ad <+538>:  movq   %r13, %rdi
    0x7fff61caf3b0 <+541>:  callq  0x7fff61cb05ab            ; get_tiny_free_size
    0x7fff61caf3b5 <+546>:  movq   0x8(%r13), %rcx
    0x7fff61caf3b9 <+550>:  movq   %rcx, %r8
    0x7fff61caf3bc <+553>:  shlq   $0x4, %r8
    0x7fff61caf3c0 <+557>:  shrq   $0x3c, %rcx
    0x7fff61caf3c4 <+561>:  movq   0x278(%r12), %rsi
    0x7fff61caf3cc <+569>:  movq   %r8, %rdi
    0x7fff61caf3cf <+572>:  xorq   %rsi, %rdi
    0x7fff61caf3d2 <+575>:  movq   %rdi, %rbx
    0x7fff61caf3d5 <+578>:  shrq   $0x8, %rbx
    0x7fff61caf3d9 <+582>:  addl   %edi, %ebx
    0x7fff61caf3db <+584>:  movq   %rdi, %rdx
    0x7fff61caf3de <+587>:  shrq   $0x10, %rdx
    0x7fff61caf3e2 <+591>:  addl   %ebx, %edx
    0x7fff61caf3e4 <+593>:  movq   %rdi, %rbx
    0x7fff61caf3e7 <+596>:  shrq   $0x18, %rbx
    0x7fff61caf3eb <+600>:  addl   %edx, %ebx
    0x7fff61caf3ed <+602>:  movq   %rdi, %rdx
    0x7fff61caf3f0 <+605>:  shrq   $0x20, %rdx
    0x7fff61caf3f4 <+609>:  addl   %ebx, %edx
    0x7fff61caf3f6 <+611>:  movq   %rdi, %rbx
    0x7fff61caf3f9 <+614>:  shrq   $0x28, %rbx
    0x7fff61caf3fd <+618>:  addl   %edx, %ebx
    0x7fff61caf3ff <+620>:  movq   %rdi, %rdx
    0x7fff61caf402 <+623>:  shrq   $0x30, %rdx
    0x7fff61caf406 <+627>:  addl   %ebx, %edx
    0x7fff61caf408 <+629>:  shrq   $0x38, %rdi
    0x7fff61caf40c <+633>:  addl   %edx, %edi
    0x7fff61caf40e <+635>:  andl   $0xf, %edi
    0x7fff61caf411 <+638>:  cmpq   %rdi, %rcx
    0x7fff61caf414 <+641>:  jne    0x7fff61caf602            ; <+1135>
    0x7fff61caf41a <+647>:  movzwl %ax, %edi
    0x7fff61caf41d <+650>:  subl   %r15d, %edi
    0x7fff61caf420 <+653>:  cmpl   $0x40, %edi
    0x7fff61caf423 <+656>:  jl     0x7fff61caf58a            ; <+1015>
    0x7fff61caf429 <+662>:  movl   %r15d, %eax
    0x7fff61caf42c <+665>:  shll   $0x4, %eax
    0x7fff61caf42f <+668>:  addq   %r13, %rax
    0x7fff61caf432 <+671>:  movq   %rax, 0x210(%r14)
    0x7fff61caf439 <+678>:  movq   %rax, %rcx
    0x7fff61caf43c <+681>:  shrq   $0x4, %rcx
    0x7fff61caf440 <+685>:  testq  %r8, %r8
    0x7fff61caf443 <+688>:  je     0x7fff61caf48e            ; <+763>
    0x7fff61caf445 <+690>:  xorq   %rax, %rsi
    0x7fff61caf448 <+693>:  movq   %rsi, %rdx
    0x7fff61caf44b <+696>:  shrq   $0x8, %rdx
    0x7fff61caf44f <+700>:  addl   %esi, %edx
    0x7fff61caf451 <+702>:  movq   %rsi, %rbx
    0x7fff61caf454 <+705>:  shrq   $0x10, %rbx
    0x7fff61caf458 <+709>:  addl   %edx, %ebx
    0x7fff61caf45a <+711>:  movq   %rsi, %rdx
    0x7fff61caf45d <+714>:  shrq   $0x18, %rdx
    0x7fff61caf461 <+718>:  addl   %ebx, %edx
    0x7fff61caf463 <+720>:  movq   %rsi, %rbx
    0x7fff61caf466 <+723>:  shrq   $0x20, %rbx
    0x7fff61caf46a <+727>:  addl   %edx, %ebx
    0x7fff61caf46c <+729>:  movq   %rsi, %rdx
    0x7fff61caf46f <+732>:  shrq   $0x28, %rdx
    0x7fff61caf473 <+736>:  addl   %ebx, %edx
    0x7fff61caf475 <+738>:  movq   %rsi, %rbx
    0x7fff61caf478 <+741>:  shrq   $0x30, %rbx
    0x7fff61caf47c <+745>:  addl   %edx, %ebx
    0x7fff61caf47e <+747>:  shrq   $0x38, %rsi
    0x7fff61caf482 <+751>:  addl   %ebx, %esi
    0x7fff61caf484 <+753>:  shlq   $0x3c, %rsi
    0x7fff61caf488 <+757>:  orq    %rcx, %rsi
    0x7fff61caf48b <+760>:  movq   %rsi, (%r8)
    0x7fff61caf48e <+763>:  movq   (%r13), %rdx
    0x7fff61caf492 <+767>:  movq   %rdx, (%rax)
    0x7fff61caf495 <+770>:  movq   0x8(%r13), %rdx
    0x7fff61caf499 <+774>:  movq   %rdx, 0x8(%rax)
    0x7fff61caf49d <+778>:  movq   %rax, %rdx
    0x7fff61caf4a0 <+781>:  andq   $-0x100000, %rdx          ; imm = 0xFFF00000 
    0x7fff61caf4a7 <+788>:  movl   %eax, %esi
    0x7fff61caf4a9 <+790>:  shrl   $0x8, %esi
    0x7fff61caf4ac <+793>:  andl   $0xffe, %esi              ; imm = 0xFFE 
    0x7fff61caf4b2 <+799>:  andl   $0x1f, %ecx
    0x7fff61caf4b5 <+802>:  movl   $0x1, %ebx
    0x7fff61caf4ba <+807>:  shll   %cl, %ebx
    0x7fff61caf4bc <+809>:  orl    %ebx, 0xfc0a0(%rdx,%rsi,4)
    0x7fff61caf4c3 <+816>:  movl   $0xfffffffe, %ebx         ; imm = 0xFFFFFFFE 
    0x7fff61caf4c8 <+821>:  roll   %cl, %ebx
    0x7fff61caf4ca <+823>:  orl    $0x1, %esi
    0x7fff61caf4cd <+826>:  andl   %ebx, 0xfc0a0(%rdx,%rsi,4)
    0x7fff61caf4d4 <+833>:  movzwl %di, %ecx
    0x7fff61caf4d7 <+836>:  cmpl   $0x2, %ecx
    0x7fff61caf4da <+839>:  jb     0x7fff61caf5ee            ; <+1115>
    0x7fff61caf4e0 <+845>:  movl   %edi, %ecx
    0x7fff61caf4e2 <+847>:  shll   $0x4, %ecx
    0x7fff61caf4e5 <+850>:  andl   $0xffff0, %ecx            ; imm = 0xFFFF0 
    0x7fff61caf4eb <+856>:  movw   %di, -0x2(%rax,%rcx)
    0x7fff61caf4f0 <+861>:  movw   %di, 0x10(%rax)
    0x7fff61caf4f4 <+865>:  jmp    0x7fff61caf2f7            ; <+356>
    0x7fff61caf4f9 <+870>:  movq   0x838(%r14), %rcx
    0x7fff61caf500 <+877>:  movl   %r15d, %eax
    0x7fff61caf503 <+880>:  shll   $0x4, %eax
    0x7fff61caf506 <+883>:  movq   %rcx, %rdx
    0x7fff61caf509 <+886>:  subq   %rax, %rdx
    0x7fff61caf50c <+889>:  jae    0x7fff61caf516            ; <+899>
    0x7fff61caf50e <+891>:  xorl   %r13d, %r13d
    0x7fff61caf511 <+894>:  jmp    0x7fff61caf38b            ; <+504>
    0x7fff61caf516 <+899>:  movl   $0xfc080, %r13d           ; imm = 0xFC080 
    0x7fff61caf51c <+905>:  subq   %rcx, %r13
    0x7fff61caf51f <+908>:  addq   0x848(%r14), %r13
    0x7fff61caf526 <+915>:  movq   %rdx, 0x838(%r14)
    0x7fff61caf52d <+922>:  testq  %rdx, %rdx
    0x7fff61caf530 <+925>:  je     0x7fff61caf2f7            ; <+356>
    0x7fff61caf536 <+931>:  addq   %r13, %rax
    0x7fff61caf539 <+934>:  movq   %rax, %rdx
    0x7fff61caf53c <+937>:  andq   $-0x100000, %rdx          ; imm = 0xFFF00000 
    0x7fff61caf543 <+944>:  movq   %rax, %rcx
    0x7fff61caf546 <+947>:  shrq   $0x4, %rcx
    0x7fff61caf54a <+951>:  shrl   $0x8, %eax
    0x7fff61caf54d <+954>:  andl   $0xffe, %eax              ; imm = 0xFFE 
    0x7fff61caf552 <+959>:  movl   $0x1, %esi
    0x7fff61caf557 <+964>:  movl   $0x1, %edi
    0x7fff61caf55c <+969>:  shll   %cl, %edi
    0x7fff61caf55e <+971>:  orl    %edi, 0xfc0a0(%rdx,%rax,4)
    0x7fff61caf565 <+978>:  orl    $0x1, %eax
    0x7fff61caf568 <+981>:  orl    %edi, 0xfc0a0(%rdx,%rax,4)
    0x7fff61caf56f <+988>:  leal   0x1(%rcx), %ecx
    0x7fff61caf572 <+991>:  movl   %ecx, %eax
    0x7fff61caf574 <+993>:  shrl   $0x4, %eax
    0x7fff61caf577 <+996>:  andl   $0xffe, %eax              ; imm = 0xFFE 
    0x7fff61caf57c <+1001>: shll   %cl, %esi
    0x7fff61caf57e <+1003>: orl    %esi, 0xfc0a0(%rdx,%rax,4)
    0x7fff61caf585 <+1010>: jmp    0x7fff61caf2f7            ; <+356>
    0x7fff61caf58a <+1015>: testq  %r8, %r8
    0x7fff61caf58d <+1018>: je     0x7fff61caf596            ; <+1027>
    0x7fff61caf58f <+1020>: movq   (%r13), %rcx
    0x7fff61caf593 <+1024>: movq   %rcx, (%r8)
    0x7fff61caf596 <+1027>: movq   %r8, 0x210(%r14)
    0x7fff61caf59d <+1034>: jmp    0x7fff61caf5ba            ; <+1063>
    0x7fff61caf59f <+1036>: movl   $0xfffffffe, %eax         ; imm = 0xFFFFFFFE 
    0x7fff61caf5a4 <+1041>: roll   %cl, %eax
    0x7fff61caf5a6 <+1043>: shrq   $0x5, %rcx
    0x7fff61caf5aa <+1047>: andl   %eax, 0x818(%r14,%rcx,4)
    0x7fff61caf5b2 <+1055>: movq   %r13, %rdi
    0x7fff61caf5b5 <+1058>: callq  0x7fff61cb05ab            ; get_tiny_free_size
    0x7fff61caf5ba <+1063>: leal   -0x1(%rax), %ecx
    0x7fff61caf5bd <+1066>: cmpw   %r15w, %cx
    0x7fff61caf5c1 <+1070>: jae    0x7fff61caf5cc            ; <+1081>
    0x7fff61caf5c3 <+1072>: movw   %ax, %r15w
    0x7fff61caf5c7 <+1076>: jmp    0x7fff61caf2f7            ; <+356>
    0x7fff61caf5cc <+1081>: subl   %r15d, %eax
    0x7fff61caf5cf <+1084>: movl   %r15d, %ecx
    0x7fff61caf5d2 <+1087>: shll   $0x4, %ecx
    0x7fff61caf5d5 <+1090>: movq   %r13, %rdx
    0x7fff61caf5d8 <+1093>: addq   %rcx, %rdx
    0x7fff61caf5db <+1096>: movzwl %ax, %ecx
    0x7fff61caf5de <+1099>: movq   %r12, %rdi
    0x7fff61caf5e1 <+1102>: movq   %r14, %rsi
    0x7fff61caf5e4 <+1105>: callq  0x7fff61cafe1b            ; tiny_free_list_add_ptr
    0x7fff61caf5e9 <+1110>: jmp    0x7fff61caf2f7            ; <+356>
    0x7fff61caf5ee <+1115>: testw  %di, %di
    0x7fff61caf5f1 <+1118>: jne    0x7fff61caf2f7            ; <+356>
    0x7fff61caf5f7 <+1124>: movw   $0x0, 0x10(%rax)
    0x7fff61caf5fd <+1130>: jmp    0x7fff61caf2f7            ; <+356>
    0x7fff61caf602 <+1135>: addq   $0x8, %r13
    0x7fff61caf606 <+1139>: movl   0x26c(%r12), %edi
    0x7fff61caf60e <+1147>: movq   %r13, %rsi
    0x7fff61caf611 <+1150>: callq  0x7fff61cc5505            ; free_list_checksum_botch.352
    0x7fff61caf616 <+1155>: ud2    
    0x7fff61caf618 <+1157>: nop    

Нарушитель 0x7fff61caf227 <+148>: movq %rdx, (%rax), где rax - адрес указателя моего weights который получает нулевое значение, а rdx равно 0.

4b9b3361

Ответ 1

Которые должны быть:

  1. В наборе данных присутствует escape-последовательность \0. Размер строки вычисляется с помощью python:

    >>> len("a\0aa")
    4
    
  2. Затем строка передается на c++ (CharniakParser), и мы прокручиваем ее, чтобы проанализировать ее:

    string a = "a\0aa";
    const char* b = a.c_str();
    cout << a.size() << endl; // size == 1, \0 is the end of a string
    for(size_t i=0; i<4; i++)// 4 is the string size calculated with python
    {
        const char* c = &b[i];
        do_something_with(c); // c is corrupt after i == 0
    }
    
  3. Поскольку вы близки к нехватке памяти, вы поврежденный указатель c указывает на не нулевой адрес (предположение о том, что не всегда один и тот же указатель недействителен), указанный объект удаляется операцией, и поэтому в другой части вашего кода, у вас есть указатель, указывающий на удаляемый объект → это ваша ошибка

Я понимаю, что мое объяснение надуманно, но у нас не так много данных.