C - 瓦尔格林德 |大小 4 的读取无效 |地址0x5093430是大小为 4 的块内的 0 字节 free'd



valgrind日志消息:

==29896== Memcheck, a memory error detector
==29896== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==29896== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==29896== Command: ../src/controller/cyboi counter/stack/run.cybol
==29896== Parent PID: 2864
==29896== 
==29896== Invalid read of size 4
==29896==    at 0x4840D59: wcsnlen (vg_replace_strmem.c:1895)
==29896==    by 0x4AA4B07: wcsnrtombs (wcsnrtombs.c:58)
==29896==    by 0x17AE3A: encode_utf_8 (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x1BA2A1: encode (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x22FA18: send_encode (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26C2FB: send_data (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26D6A7: apply_send (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x2910E4: handle_operation (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x29432F: handle (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x293985: handle_part_element (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x293C4D: handle_part (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x294137: handle (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==  Address 0x5093430 is 0 bytes inside a block of size 4 free'd
==29896==    at 0x483AD7B: realloc (vg_replace_malloc.c:834)
==29896==    by 0x15EDEA: reallocate_array (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x17A9B1: reallocate_item (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x17ACD4: encode_utf_8 (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x1BA2A1: encode (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x22FA18: send_encode (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26C2FB: send_data (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26D6A7: apply_send (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x2910E4: handle_operation (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x29432F: handle (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x293985: handle_part_element (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x293C4D: handle_part (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==  Block was alloc'd at
==29896==    at 0x483AD7B: realloc (vg_replace_malloc.c:834)
==29896==    by 0x15EDEA: reallocate_array (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x1611DF: modify_overwrite (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x162C57: modify_array (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x1639A6: modify_item (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x25E732: encode_utf_8_append (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x25E7D8: serialise_ansi_escape_code_wide_character (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x25E856: serialise_tui_wide_character (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x25E993: serialise_tui_newline (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x2693E5: serialise (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x269D28: send_serialise (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26C2BF: send_data (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896== 
==29896== Invalid read of size 4
==29896==    at 0x4A2819F: internal_utf8_loop (loop.c:336)
==29896==    by 0x4A2819F: __gconv_transform_internal_utf8 (skeleton.c:620)
==29896==    by 0x4AA4B7F: wcsnrtombs (wcsnrtombs.c:113)
==29896==    by 0x17AE3A: encode_utf_8 (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x1BA2A1: encode (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x22FA18: send_encode (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26C2FB: send_data (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26D6A7: apply_send (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x2910E4: handle_operation (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x29432F: handle (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x293985: handle_part_element (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x293C4D: handle_part (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x294137: handle (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==  Address 0x5093430 is 0 bytes inside a block of size 4 free'd
==29896==    at 0x483AD7B: realloc (vg_replace_malloc.c:834)
==29896==    by 0x15EDEA: reallocate_array (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x17A9B1: reallocate_item (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x17ACD4: encode_utf_8 (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x1BA2A1: encode (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x22FA18: send_encode (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26C2FB: send_data (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26D6A7: apply_send (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x2910E4: handle_operation (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x29432F: handle (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x293985: handle_part_element (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x293C4D: handle_part (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==  Block was alloc'd at
==29896==    at 0x483AD7B: realloc (vg_replace_malloc.c:834)
==29896==    by 0x15EDEA: reallocate_array (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x1611DF: modify_overwrite (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x162C57: modify_array (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x1639A6: modify_item (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x25E732: encode_utf_8_append (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x25E7D8: serialise_ansi_escape_code_wide_character (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x25E856: serialise_tui_wide_character (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x25E993: serialise_tui_newline (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x2693E5: serialise (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x269D28: send_serialise (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896==    by 0x26C2BF: send_data (in /home/christian/projekt/cybop/src/controller/cyboi)
==29896== 
==29896== 
==29896== HEAP SUMMARY:
==29896==     in use at exit: 0 bytes in 0 blocks
==29896==   total heap usage: 30,295 allocs, 30,295 frees, 521,974 bytes allocated
==29896== 
==29896== All heap blocks were freed -- no leaks are possible
==29896== 
==29896== For lists of detected and suppressed errors, rerun with: -s
==29896== ERROR SUMMARY: 31 errors from 2 contexts (suppressed: 0 from 0)

源代码片段(下面引用的完整源代码文件(:

int* dst = (int*) ds;
if (nds > *dst) {
if (nds > *NUMBER_0_INTEGER_STATE_CYBOI_MODEL) {
reallocate_item(p0, (void*) &nds, (void*) CHARACTER_TEXT_STATE_CYBOI_TYPE);
}
}
char* loc = setlocale(LC_CTYPE, "");
copy_array_forward((void*) &dd, p0, (void*) POINTER_STATE_CYBOI_TYPE, (void*) FALSE_BOOLEAN_STATE_CYBOI_MODEL, (void*) PRIMITIVE_STATE_CYBOI_MODEL_COUNT, (void*) VALUE_PRIMITIVE_STATE_CYBOI_NAME, (void*) DATA_ITEM_STATE_CYBOI_NAME);
if (ds != *NULL_POINTER_STATE_CYBOI_MODEL) {
size_t tds = (size_t) *((int*) ds);
size_t tsc = (size_t) *sc;
errno = *NUMBER_0_INTEGER_STATE_CYBOI_MODEL;
int n = -1;
#if defined(__linux__) || defined(__unix__)
const wchar_t* sd = (const wchar_t*) p1;
n = (int) wcsnrtombs((char*) dd, &sd, tsc, tds, (mbstate_t*) *NULL_POINTER_STATE_CYBOI_MODEL);
#elif defined(__APPLE__) && defined(__MACH__)
const wchar_t* sd = (const wchar_t*) p1;
n = (int) wcsnrtombs((char*) dd, &sd, tsc, tds, (mbstate_t*) *NULL_POINTER_STATE_CYBOI_MODEL);
// Use __CYGWIN__ too, if _WIN32 is not known to mingw.
#elif defined(_WIN32) || defined(__CYGWIN__)
LPCWSTR sd = (LPCWSTR) p1;
int len = WideCharToMultiByte (CP_UTF8, 0, sd, *sc, NULL, 0, NULL, NULL);
n =  WideCharToMultiByte (CP_UTF8, 0, sd, *sc, (LPSTR) dd, len, NULL, NULL);
#else
#error "Could not compile system. The operating system is not supported. Check out defined preprocessor macros!"
#endif

虫子在哪里?

原始代码可在以下位置找到:

https://svn.savannah.gnu.org/viewvc/cybop/trunk/src/executor/converter/encoder/utf/utf_8_encoder.c?revision=4583&view=标记

https://svn.savannah.gnu.org/viewvc/cybop/trunk/src/executor/memoriser/reallocator/item_reallocator.c?revision=4583&view=标记

感谢您的帮助。谢谢

我发现了这个错误。

原因不是目标char*数组dd,而是源数组sd。它包含多字节字符数据。换句话说,我试图改变多字节字符数据转换为多字节字符的数据,这是无用的。相反,源数组应该包含宽字符数据。