自制评论卸妆器不起作用,我做错了什么?(大小 1 的无效读取,段错误)

防护服
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *delete_comments(char *input) {
    unsigned int i = 0;
    unsigned int a = 0;

    char* dest = malloc(    (strlen(input) + 1) * sizeof(char)  );

    while (i < strlen(input)) {
         if(input[i] == '/' && input[i + 1] == '/') {
            while (input[i - 1] != '\n') {
            }         
         }
         else if (input[i] == '/' && input[i+1] == '*') {
            while (input[i-1] != '*' || input[i] != '/') {
                i++;
            }
         }

         dest[a] = input[i];
         i++;
         a++;
    }

    free(input); 
    return dest;
}

构建日志:

make -C test valgrind
make[1]: Entering directory '/home/agent/test'
sed -e 's/int[ \t]\{1,\}main[ \t]*[(]/int _no_main(/g;s/void[ \t]\{1,\}main[ \t]*[(]/void _no_main(/g;s/^main[ \t]*[(]/_no_main(/g' ../src/source.c >../src/source.c.nomain.c
gcc -pthread -g -Wall -Wvla -std=c99 -o test test_source.c tmc-check.c checkhelp.c ../src/source.c.nomain.c -lcheck_pic -pthread -lrt -lm -lsubunit
valgrind -q --log-file=valgrind.log --track-origins=yes --leak-check=yes ./test
Running suite(s): Test-08_cleaner
0%: Checks: 1, Failures: 0, Errors: 1
test_source.c:67:E:test_delete_comments:test_delete_comments:0: (after this point) Received signal 11 (Segmentation fault)
make[1]: Leaving directory '/home/agent/test'

Valgrind output:
==44== Invalid read of size 1
==44==    at 0x402FB9: delete_comments (source.c.nomain.c:19)
==44==    by 0x401E3D: test_delete_comments (test_source.c:74)
==44==    by 0x406DE2: srunner_run (in /home/agent/test/test)
==44==    by 0x402492: tmc_run_tests (tmc-check.c:134)
==44==    by 0x402127: main (test_source.c:206)
==44==  Address 0x105b3cc4f is not stack'd, malloc'd or (recently) free'd
==44== 
==44== 
==44== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==44==  Access not within mapped region at address 0x105B3CC4F
==44==    at 0x402FB9: delete_comments (source.c.nomain.c:19)
==44==    by 0x401E3D: test_delete_comments (test_source.c:74)
==44==    by 0x406DE2: srunner_run (in /home/agent/test/test)
==44==    by 0x402492: tmc_run_tests (tmc-check.c:134)
==44==    by 0x402127: main (test_source.c:206)
==44==  If you believe this happened as a result of a stack
==44==  overflow in your program's main thread (unlikely but
==44==  possible), you can try to increase the size of the
==44==  main thread stack using the --main-stacksize= flag.
==44==  The main thread stack size used in this run was 2048000

所以这里是代码和 valgrind 报告。我究竟做错了什么?这是用 C 编写的注释删除器代码。我试图查看有关无效读取大小和段错误的前线程,但我并没有真正解决我的问题。我知道如果删除任何评论,我会分配太多内存,但我认为这不会引起问题吗?

编辑:哦,如果您需要用于测试的主要功能,我也可以附加它。

欧姆

段错误发生在这里:

while (input[i - 1] != '\n') ...

你的计数器i是一个无符号整数。一开始你有i == 0并且i - 1是一个非常大的数字,可能是 2³² − 1。这可能会导致段错误。

请注意,Valgrind 说地址不是“stack'd, malloc'd”。通常,如果你打破了数组的边界,它会说有问题的地址是“超出 malloc 内存的一个字节”或类似的东西。

使用无符号整数作为计数器是一个不错的选择,但是当你倒退时要小心。在您的情况下,您根本不需要向后看:您应该向前推进//,然后根据需要继续前进。

顺便说strlen()一句在 C 中测试循环条件不是一个好主意,因为遍历strlen整个字符串并查找空终止符。一个聪明的编译器可能会优化它,但最好计算一次字符串长度,或者更好的是,测试是否`input[i] != '\0'。

在跳过具有否定条件的字符时,终止 null 也是您需要考虑的事情。例如,检查当前字符是否不是换行符是不够的。您还必须确保它不是空终止符:

while (input[i] && input[i] != '\n') i++;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无效的读取大小1 strcmp

来自分类Dev

C - 大小 1 的无效读取

来自分类Dev

valgrind对大小1的无效读取(realloc使错误“释放后使用条件”)

来自分类Dev

参数1必须是迭代器-我做错了什么?

来自分类Dev

使用valgrind时无效读取大小1

来自分类Dev

编译器中的错误,还是我做错了什么?

来自分类Dev

Valgrind 错误无效读取大小 4

来自分类Dev

重新分配段错误-无效的旧大小

来自分类Dev

使用boost :: smatch在valgrind中读取大小无效1

来自分类Dev

使用mysql_free_result“大小为1的无效读取”

来自分类Dev

分配大字符串时无效读取大小1

来自分类Dev

策略模式不起作用:我做错了什么?

来自分类Dev

此查询不起作用。我究竟做错了什么?

来自分类Dev

绑定不起作用,我做错了什么?

来自分类Dev

为什么子进程“读取”函数不返回(我认为它会返回-1),而子进程“printf”函数不起作用

来自分类Dev

为什么&x + 1不会导致段错误?

来自分类Dev

我在此SendInput代码段中做错了什么?

来自分类Dev

Oracle触发器获取了错误的值,我做错了什么?

来自分类Dev

SetUp或TearDown方法的签名无效-我做错了什么?

来自分类Dev

新的Java类无效。我究竟做错了什么?

来自分类Dev

无效的语法。我做错了什么??蟒蛇 2.7.13

来自分类Dev

c Valgrind读取大小4无效->分段错误

来自分类Dev

C分段错误,大小为4的读取无效

来自分类Dev

使用Valgrind在C中无效读取大小8的分段错误

来自分类Dev

链接器错误:无法读取符号:无效的操作

来自分类Dev

git评论不起作用?但是当我进行推送时,我就能看到自己的更改。我究竟做错了什么?

来自分类Dev

向量分割错误,但不确定我做错了什么

来自分类Dev

Git中的提交次数错误?我做错了什么?

来自分类Dev

是MSVC 2010中的错误,还是我做错了什么?

Related 相关文章

  1. 1

    无效的读取大小1 strcmp

  2. 2

    C - 大小 1 的无效读取

  3. 3

    valgrind对大小1的无效读取(realloc使错误“释放后使用条件”)

  4. 4

    参数1必须是迭代器-我做错了什么?

  5. 5

    使用valgrind时无效读取大小1

  6. 6

    编译器中的错误,还是我做错了什么?

  7. 7

    Valgrind 错误无效读取大小 4

  8. 8

    重新分配段错误-无效的旧大小

  9. 9

    使用boost :: smatch在valgrind中读取大小无效1

  10. 10

    使用mysql_free_result“大小为1的无效读取”

  11. 11

    分配大字符串时无效读取大小1

  12. 12

    策略模式不起作用:我做错了什么?

  13. 13

    此查询不起作用。我究竟做错了什么?

  14. 14

    绑定不起作用,我做错了什么?

  15. 15

    为什么子进程“读取”函数不返回(我认为它会返回-1),而子进程“printf”函数不起作用

  16. 16

    为什么&x + 1不会导致段错误?

  17. 17

    我在此SendInput代码段中做错了什么?

  18. 18

    Oracle触发器获取了错误的值,我做错了什么?

  19. 19

    SetUp或TearDown方法的签名无效-我做错了什么?

  20. 20

    新的Java类无效。我究竟做错了什么?

  21. 21

    无效的语法。我做错了什么??蟒蛇 2.7.13

  22. 22

    c Valgrind读取大小4无效->分段错误

  23. 23

    C分段错误,大小为4的读取无效

  24. 24

    使用Valgrind在C中无效读取大小8的分段错误

  25. 25

    链接器错误:无法读取符号:无效的操作

  26. 26

    git评论不起作用?但是当我进行推送时,我就能看到自己的更改。我究竟做错了什么?

  27. 27

    向量分割错误,但不确定我做错了什么

  28. 28

    Git中的提交次数错误?我做错了什么?

  29. 29

    是MSVC 2010中的错误,还是我做错了什么?

热门标签

归档