开发者

A error about "Address 0x0 is not stack'd, malloc'd or (recently) free'd" in c program under linux environment

开发者 https://www.devze.com 2023-01-02 07:24 出处:网络
[Edit1:] For the seqName, I declare it as a global parameter at the beginning of the file as char seqName[20];

[Edit1:]

For the seqName, I declare it as a global parameter at the beginning of the file as

char seqName[20];

[Edit2:]

Aren't those number of passing to the program during the actual execution? I got the following message just by using the valgrind tool. The command I input is:

jl@ubuntu:~/work/dsr_analysis$ valgrind --tool=memcheck --leak-check=yes ./test

[Edit3:]

Sorry, since I am a new user of Valgrind, when I use it, I only typing the command in Edit2.

However, my program dose have some command-line parameters.

Therefore, I think I'd better to debug my program by the new command:

valgrind --tool=memcheck --leak-check=yes ./test foreman.cif 352 288


There is a piece of my program:

height = atoi(argv[3]);

width = atoi(argv[2]);

sprintf(seqName,"%s", argv[1]);

// strcpy(seqName, argv[1]);

After compiling it, a exe file test is generated, then I use Valgrind to check it. Then I got the following message, however I cannot understand what it tends to tell me. Can anyone provide some kind help, Thanks.

jl@ubuntu:~/work/dsr_analysis$ valgrind --tool=memcheck --leak-check=yes ./test

==28940== Memcheck, a memory error detector

==28940== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.

==28940== Using Valgrind-3.6.0.SVN-Debian and LibVEX;

rerun with -h for copyright info

==28940== Command: ./test

==28940==

==28940== Invalid read of size 1

==28940== at 0x40260CA: strcpy (mc_replace_strmem.c:311)

==28940== by 0x804A5C6: main (me_search.c:1428)

开发者_高级运维

==28940== Address 0x0 is not stack'd, malloc'd or (recently) free'd

==28940==

==28940==

==28940== Process terminating with default action of signal 11 (SIGSEGV)

==28940== Access not within mapped region at address 0x0

==28940== at 0x40260CA: strcpy (mc_replace_strmem.c:311)

==28940== by 0x804A5C6: main (me_search.c:1428)

==28940== If you believe this happened as a result of a stack

==28940== overflow in your program's main thread (unlikely but

==28940== possible), you can try to increase the size of the

==28940== main thread stack using the --main-stacksize= flag.

==28940== The main thread stack size used in this run was 8388608.

==28940==

==28940== HEAP SUMMARY:

==28940== in use at exit: 0 bytes in 0 blocks

==28940== total heap usage: 0 allocs, 0 frees, 0 bytes allocated

==28940==

==28940== All heap blocks were freed -- no leaks are possible

==28940==

==28940== For counts of detected and suppressed errors, rerun with: -v

==28940== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 13 from 8)1 contexts (suppressed: 13 from 8)

1 contexts (suppressed: 13 from 8)


You really haven't posted clear enough code to be sure, but if you call your executable with no command-line parameters, then argv[1] will contain a NULL pointer, and argv[2], argv[3] etc. will contain undefined values.

Edit: You need to provide the program with parameters on the valgrind command line (I guess - I don't use valgrind myself). Something like:

valgrind ... ./test foo bar zod

And BTW, calling an executable test is a bad idea on Linux/Unix as it is very easy to get confused with the shell built-in of the same name


There are two things you should check:

1) Make sure that you are being passed the correct number of parameters by checking the value of argc.

2) Make sure that you have used malloc() to allocate enough space in seqName before attempting the strcpy().


I think the point is this: sprintf(seqName,"%s", argv[1])

And what you actually want is sprintf((strcat(seqName,"%s"), argv[1]) judging your code.

What it tries to do here is pass the value of the expression "%s" to be interpreted in the format. That value is specifically a char pointer to a '%' in static memory with a 's' next to it, and then a '\0'.

Edit, oh wait, nevermind, I see it's sprintf, not printf. Then it's probably the argcount

Edit2: Also, is seqName properly initialized and allocated?


Do you check actual number of arguments passed to your program? (argc)

If your program gets less than 3 arguments, and you try to acess argv[1..3] - you'll get segmentation faults, and other unpredictable behaviour.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号