【问题标题】:C - unaddressable byte for dynamic memory stringC - 动态内存字符串的不可寻址字节
【发布时间】:2019-05-15 14:17:42
【问题描述】:

我有这个上下文:

char* bname(char const *mypath) {    //basename
    char* bnm = (char*) malloc((strlen(mypath)+1)*sizeof(char));
    char lim='/';
    char* z = strrchr(mypath, lim);
    if (z) {
        strcpy(bnm, z + 1);
    } else {
        strcpy(bnm,mypath);
    }
    return bnm;
}

void doX(int sockfd, char* filename) {
    if (send(sockfd, filename, 1024, 0) == -1) {
        // exit;
    }

    /*
    No error with this one:
    if (send(sockfd, "test", 1024, 0) == -1) {
        // exit
    }
    */
}

像这样在 main 中专门调用:

// argv[3] = test.jpg
char* fname= bname(argv[3]);
doX(socketd, fname);
free(fname);

编译:gcc -Wall -Werror -pedantic -std=c99 -ggdb3

Valgrind : valgrind --leak-check=full --tool=memcheck

Syscall param socketcall.sendto(msg) points to unaddressable byte(s)
==7096==    at 0x4F5EC4D: send (send.c:28)
==7096==    by 0x109197: doX (client.c:94)
==7096==    by 0x1093A0: main (client.c:146)
==7096==  Address 0x522e2f9 is 0 bytes after a block of size 9 alloc'd
==7096==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7096==    by 0x108F38: bname (client.c:43)
==7096==    by 0x109378: main (client.c:145)

我似乎找不到这个警告的原因,它很可能是 doX 的 send(),因为如果我给它一个文字字符串,则不会出现警告。

感谢您的帮助。

【问题讨论】:

  • send(sockfd, filename, 1024, 0):我相信,filename 不提供 1024 字节。因此,您越界访问,而 valgrind 不喜欢这样。
  • 顺便说一句。 send(sockfd, "test", 1024, 0) 也是错误的。 这个没有错误只是运气不好。 (或者幸运的是坏的?)
  • 我认为 send() 想要一个 'const void *',而不是一个 'char *'。
  • @GermanNerd 我认为这不是问题。如果是这样,那将是编译时问题 - 而不是 valgrind 中的运行时问题...
  • @GermanNerd C 标准保证void * 可以在任何对象之间相互转换,正是出于这个原因send() 使用它。问题是@Scheff 概述的。正确的语法应该是send(sockfd, filename, strlen(filename), 0)

标签: c compiler-errors malloc heap-memory valgrind


【解决方案1】:

改成这样

if (send(sockfd, filename, strlen(filename)+1, 0) == -1) {

文件名可能没有分配那么多内存(1024 字节)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2022-01-11
    • 2013-08-28
    • 2018-07-27
    相关资源
    最近更新 更多