Valgrind错误M64 M32

胡安

我正在尝试使用valgrind验证以下代码文件test.c,当我进行gcc test.c -o test时出现以下错误

Syscall param write(buf) points to uninitialised byte(s)
==22765==    at 0x4F22870: __write_nocancel (syscall-template.S:81)
==22765==    by 0x4EB0002: _IO_file_write@@GLIBC_2.2.5 (fileops.c:1261)
==22765==    by 0x4EB14DB: _IO_do_write@@GLIBC_2.2.5 (fileops.c:538)
==22765==    by 0x4EB0D5F: _IO_file_close_it@@GLIBC_2.2.5 (fileops.c:165)
==22765==    by 0x4EA4B0F: fclose@@GLIBC_2.2.5 (iofclose.c:59)
==22765==    by 0x400986: main (in /home/grados-sanchez/git/merkle-codigos-C/test)
==22765==  Address 0x4025770 is not stack'd, malloc'd or (recently) free'd
==22765==  Uninitialised value was created by a stack allocation
==22765==    at 0x4007E2: node_write (in /home/grados-sanchez/git/merkle-codigos-C/test)

但是当我运行gcc test.c -o test然后使用valgrind时,我没有得到任何错误。我的问题是在这种情况下valgrind会发生什么?有什么办法可以让valgrind运行32或64位?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define id_lenght 6000
typedef unsigned char * ustring;
typedef struct {
    ustring ustr;
    int height;
    char id[id_lenght];
} node;

int validation_read(void * ptr_var, size_t sizeof_datatype, int num,
    FILE * ptr_file) {
    if (fread(ptr_var, sizeof_datatype, num, ptr_file) <= 0) {
        printf("Error reading file");
       return 1;
    }
return 0;
}

void node_read(FILE * node_ptr, node * n, int r) {
    int i;
    validation_read(n->id, sizeof(unsigned char), id_lenght, node_ptr);
    validation_read(&(n->height), sizeof(int), 1, node_ptr);
    validation_read(n->ustr, sizeof(unsigned char) * (r + 1), 1,node_ptr);
}

void node_init(node * n, int r) {
    memset(n, 0, sizeof(node));
    n->ustr = malloc((r + 1) * sizeof(unsigned char));
    memset(n->ustr, 0, (r + 1));
    n->ustr[r] = 0;
    n->height = -1;
    memset(n->id,0,id_lenght+1);
}


void node_write(FILE * node_ptr, node * n, int r) {
    int i;
    char newid[id_lenght];
    memset(newid,0,id_lenght);
    sprintf(newid,"%s",n->id);
    fwrite(newid, sizeof(char), id_lenght+1, node_ptr);
    fwrite(&(n->height), sizeof(int), 1, node_ptr);
    fwrite(n->ustr, sizeof(unsigned char) * (r + 1), 1,node_ptr);
}


void node_destroy(node * n) {
    free(n->ustr);
    n->height = -1;
}

int main(){
    FILE * ptr = fopen("juantest","w+");
    int r = 64/8;
    node in;
    node_init(&in, r);
    node_write(ptr, &in, r);
    node_destroy(&in);
    fclose(ptr);
}

编辑但是当我尝试读取文件时会发生问题。我编辑了上面的代码。我收到读取文件错误读取文件错误读取文件错误

钟洁

Valgrind的担心是对的。在这条线

fwrite(newid, sizeof(char), id_lenght+1, node_ptr);

您正在写入比允许的多1个字节的数据;一个超出您的新临时堆栈字符串的字符串。您可能将写一个字符串(以a+1表示结尾的零)与精确地写出所使用的(最大)缓冲区大小混淆了

fwrite(newid, sizeof(char), id_length, node_ptr);

由于要将内存内容转储到文件中,因此在使用之前先清除字符串内存是正确的sprintf您永远不知道新分配的内存中有什么!
请注意,如果您担心数据的完整性,最好改用safe变量sprintf_s,因为它可以防止您过度使用此缓冲区。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

m32和m64编译器选项提供不同的输出

来自分类Dev

gcc 不会与 -m32 链接

来自分类Dev

在64位系统上使用gcc -m32编译应用程序

来自分类Dev

在64位系统上使用gcc -m32编译应用程序

来自分类Dev

获取GCC以在32位代码(-m32)中使用AVX?

来自分类Dev

将m32标志添加到Makefile时,select()失败

来自分类Dev

-m32选项不适用于gcc,但适用于g ++

来自分类Dev

汇编:`stos m32`和`stosd`助记符有什么区别?

来自分类Dev

在OS X上使用-m32进行编译的联合的冗余大小

来自分类Dev

-m32 当参数为 unsigned long long 时会出现无法解释的问题

来自分类Dev

如何检查我的ARM64板是否支持32位二进制编译?(错误:无法识别的命令行选项“ -m32”)

来自分类Dev

使用-m64在32位计算机上编译64位时出错

来自分类Dev

此Makefile的“ sed -i's,-m64,,g'”是做什么的?

来自分类Dev

NVIDIA Jetson TX2 中无法识别的命令行选项“-m64”

来自分类Dev

C#Int32:m_value

来自分类Dev

64位x86中MOVZX r32,r / m16和MOVZX r64,r / m16之间的差异

来自分类Dev

在DotNetCore日志中[40m [32minfo [39m [22m [49m]

来自分类Dev

如何在vim中删除“ ^ [[m”和“ ^ [[32”字符

来自分类Dev

GetTextExtentPoint32(m_hAttribDC,lpszString,nCount和&size)

来自分类Dev

在64位计算机上检查32位程序时,能否获得任务列表/ m的正确DLL模块列表?

来自分类Dev

Ubuntu 13.10 32位还是64位?联想ThinkPad E531-i3-3110m-8GB内存

来自分类Dev

Ubuntu 13.10 32位还是64位?联想ThinkPad E531-i3-3110m-8GB内存

来自分类Dev

-lcrypt 错误交叉编译 64 到 32

来自分类Dev

Xcode错误。m:8794

来自分类Dev

Xcode错误。m:8794

来自分类Dev

运行时错误:大小不匹配,m1:[4 x 3136],m2:[64 x 5] 在 c:\a\w\1\s\tmp_conda_3.7_1

来自分类Dev

如何将58m32s转换为00:58:32或72m10s转换为01:12:10

来自分类Dev

仅使用Int64中间物对Int32进行模M运算的平方金字塔数

来自分类Dev

float64到float32 Cython错误

Related 相关文章

  1. 1

    m32和m64编译器选项提供不同的输出

  2. 2

    gcc 不会与 -m32 链接

  3. 3

    在64位系统上使用gcc -m32编译应用程序

  4. 4

    在64位系统上使用gcc -m32编译应用程序

  5. 5

    获取GCC以在32位代码(-m32)中使用AVX?

  6. 6

    将m32标志添加到Makefile时,select()失败

  7. 7

    -m32选项不适用于gcc,但适用于g ++

  8. 8

    汇编:`stos m32`和`stosd`助记符有什么区别?

  9. 9

    在OS X上使用-m32进行编译的联合的冗余大小

  10. 10

    -m32 当参数为 unsigned long long 时会出现无法解释的问题

  11. 11

    如何检查我的ARM64板是否支持32位二进制编译?(错误:无法识别的命令行选项“ -m32”)

  12. 12

    使用-m64在32位计算机上编译64位时出错

  13. 13

    此Makefile的“ sed -i's,-m64,,g'”是做什么的?

  14. 14

    NVIDIA Jetson TX2 中无法识别的命令行选项“-m64”

  15. 15

    C#Int32:m_value

  16. 16

    64位x86中MOVZX r32,r / m16和MOVZX r64,r / m16之间的差异

  17. 17

    在DotNetCore日志中[40m [32minfo [39m [22m [49m]

  18. 18

    如何在vim中删除“ ^ [[m”和“ ^ [[32”字符

  19. 19

    GetTextExtentPoint32(m_hAttribDC,lpszString,nCount和&size)

  20. 20

    在64位计算机上检查32位程序时,能否获得任务列表/ m的正确DLL模块列表?

  21. 21

    Ubuntu 13.10 32位还是64位?联想ThinkPad E531-i3-3110m-8GB内存

  22. 22

    Ubuntu 13.10 32位还是64位?联想ThinkPad E531-i3-3110m-8GB内存

  23. 23

    -lcrypt 错误交叉编译 64 到 32

  24. 24

    Xcode错误。m:8794

  25. 25

    Xcode错误。m:8794

  26. 26

    运行时错误:大小不匹配,m1:[4 x 3136],m2:[64 x 5] 在 c:\a\w\1\s\tmp_conda_3.7_1

  27. 27

    如何将58m32s转换为00:58:32或72m10s转换为01:12:10

  28. 28

    仅使用Int64中间物对Int32进行模M运算的平方金字塔数

  29. 29

    float64到float32 Cython错误

热门标签

归档