Re: problems with char * return from a function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2008-06-11 at 20:52 -0400, Vardhan, Sundara (GE Infra, Energy)
wrote:
> Hi All
> 
> I am calling a function x within strcpy as follows
> 
> strcpy(a,x("sample text","default text"));
> 
> x is defined as follows
> 
> char * x(char *m, char *n)
> {
> 	char *return_val=NULL;
> 	if (check m is in database)
> 		return_val=m;
> 	else
> 		return_val=n;
> 	return(return_val);
> }
>  This causes  the array a to have a corrupted string. The string is either m or n but with illegal characters appended.
> Thanks in advance
> 
> With Regards
> 
> Vardhan
> 

Some of the responses are incorrect. The only thing being passed to x
and to strcpy are addresses. I simulated this with:
#include <stdio.h>
#include <string.h>
char *x(char *n, char *m)
{
   char *return_val=NULL;
   if (0)
      return_val=m;
   else
      return_val=n;
   return(return_val);
}
int main()
{
   char a[100];

   strcpy(a,x("sample text","default text"));
   printf("%s\n", a);
   
   return 0;
}

It works with either if(0) or if(1). Here is the 64-bit assembly
language with some explanatory comments added:
	.file	"copy_string.c"
	.text
.globl x
	.type	x, @function
x:                                                            # char
*x(char *n, char *m)
	pushq	%rbp
	movq	%rsp, %rbp
	movq	%rdi, -24(%rbp)  # save m
	movq	%rsi, -32(%rbp)  # save n
	movq	$0, -8(%rbp)
	movq	-24(%rbp), %rax  # load m
	movq	%rax, -8(%rbp)    # return_val=m;
	movq	-8(%rbp), %rax    # return(return_val);
	leave
	ret
	.size	x, .-x
	.section	.rodata
.LC0:
	.string	"default text"
.LC1:
	.string	"sample text"
	.text
.globl main
	.type	main, @function
main:                                                            # int
main()
	pushq	%rbp
	movq	%rsp, %rbp
	subq	$112, %rsp              # a[100];
	movl	$.LC0, %esi            # address of "def...xt"
	movl	$.LC1, %edi            # address of "sam...xt"
	call	x                                # x("sam...xt","def...xt")
	movq	%rax, %rsi              # address returned by x
	leaq	-112(%rbp), %rdi  # address of a[]
	call	strcpy                      # strcpy(a,address returned by x);
	leaq	-112(%rbp), %rdi  # address of a[]
	call	puts                          # printf("%s\n", a);
	movl	$0, %eax                  # return 0;
	leave
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)"
	.section	.note.GNU-stack,"",@progbits

(The assembly language was generated with
-fno-asynchronous-unwind-tables -fno-stack-protector -O0 -S to avoid
extraneous code.)

It clearly shows that the only char array being allocated is in main.
(It allocates 112 bytes because the x86-64 ABI specifies that the stack
pointer should be on a 16-byte boundary when another function is
called.)

My first thought is that the a array is too small. Please don't be
offended by my suggestion. I've made such silly mistakes many times. :-)

-- Bob



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux