gpt4 book ai didi

c - 信号 11 (SIGSEGV)

转载 作者:行者123 更新时间:2023-12-04 06:14:19 25 4
gpt4 key购买 nike

我写了以下代码:

FILE *book;
wchar_t bufferln[FILE_READ_BUFFER];
wchar_t buffer[FILE_READ_BUFFER];
book = fopen(file, "r");
if(book == NULL){
perror("Es ist ein Fehler beim lesen des Buches aufgetreten");
return EXIT_FAILURE;
}
while(fgetws(buffer, FILE_READ_BUFFER, book) != NULL){
if(wcscmp(buffer, L"\n") == 0){
bufferln[0] = L'\0';
continue;
}
buffer[wcsnlen(buffer, FILE_READ_BUFFER)-1] = L' ';
wcsncat(bufferln, buffer, FILE_READ_BUFFER);
}
return EXIT_SUCCESS;

它与 SIGSEGV 一起崩溃。我运行 valgrind 显示以下内容:
==11251== Conditional jump or move depends on uninitialised value(s)
==11251== at 0x40BD5CF: wcsncat (wcsncat.c:36)
==11251== by 0x804865D: read_book (book.c:18)
==11251== by 0x804872B: main (main.c:19)
==11251== Uninitialised value was created by a stack allocation
==11251== at 0x80485B7: read_book (book.c:3)
==11251==
==11251== Invalid read of size 4
==11251== at 0x40A58E2: fgetws (iofgetws.c:52)
==11251== by 0x804867D: read_book (book.c:12)
==11251== by 0x6D: ???
==11251== Address 0x65 is not stack'd, malloc'd or (recently) free'd
==11251==
==11251==
==11251== Process terminating with default action of signal 11 (SIGSEGV)
==11251== Access not within mapped region at address 0x65
==11251== at 0x40A58E2: fgetws (iofgetws.c:52)
==11251== by 0x804867D: read_book (book.c:12)
==11251== by 0x6D: ???
==11251== If you believe this happened as a result of a stack
==11251== overflow in your program's main thread (unlikely but
==11251== possible), you can try to increase the size of the
==11251== main thread stack using the --main-stacksize= flag.
==11251== The main thread stack size used in this run was 8388608.

我认为这个问题在某种程度上与我对 wcsncat 的使用有关(可能写入 *book 内存?)但为什么呢?
我想逐段阅读文档(UTF-8),然后执行此代码中尚未包含的内容。

最佳答案

可能发生的事情是您的 wcsncat() 根据文档所做的:


描述
wcsncat() 函数将不超过 ws2 指向的字符串的前 n 个字符附加到 ws1 指向的字符串的末尾。如果 NULL 字符出现在 ws2 中的 n 个字符之前,则直到 NULL 字符的所有字符都将附加到 ws1。 ws2 的第一个字符覆盖了 ws1 的终止 NULL 字符。 NULL 终止字符总是附加到结果中,如果用于复制的对象重叠,则行为未定义。


因此,它通过覆盖第一次出现的 NULL 字符开始附加到 bufferln。因此,在 if(wcscmp(buffer, L"\n") == 0) 返回 FALSE 的情况下,您最终将超出分配的 FILE_READ_BUFFER 缓冲区并将文件溢出到 bufferln 边界之外,并可能最终破坏堆栈。

在大多数情况下,堆栈会向下增长,并且它一定已经到达了一些实际上 FAULT 的区域,因为大多数系统不允许访问虚拟地址页面的前 2 页。关于它为什么在那里出错,这是一个有争议的问题。但主要原因是您必须尝试在读取数据后将其写入某处,因为您的读取和写入缓冲区的长度相同。

HTH

关于c - 信号 11 (SIGSEGV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7447643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com