除了安全问题,你正在尝试动态分配缓冲区。
你可以采取两种方法:
1. 在函数内部始终使用`malloc`并记录它返回的`malloced`结果。
2. 遵循某些标准库函数的做法,要求用户传递指向有效缓冲区及其大小的指针,并返回实际复制的大小。其中一些函数允许通过`check`,当你传入一个`null`缓冲区时,它们不会尝试分配它,而是返回所需的结构大小。
在我看来,你已经实现了第一种方法。
对于第二种方法,请使用以下签名:
int getMyPassword( char* buffer, size_t buff_size, size_t* p_num_copied )
{
unsigned char arr[] = { 'p', 'a', 's', 's', 'w', 'o', 'r' , 'd', '\0' };
if ( buffer == 0 )
{
*p_num_copied = sizeof(arr);
return SUCCESS;
}
if ( buff_size < sizeof(arr) )
{
*p_num_copied = sizeof(arr);
return BUFFER_TOO_SMALL;
}
memcpy( buffer, arr, sizeof(arr) );
*p_num_copied = sizeof( arr );
return SUCCESS;
}
方法#2的优点在于,调用者在很多情况下可以在堆栈上分配缓冲区,特别是如果你宣传最大所需缓冲区大小。另一个优点是内存管理现在完全由客户端处理。在通用库中,你不希望让客户端依赖于特定的库内存分配方案。
回复评论:
如果你总是想在客户端代码中使用已分配的值,那么我会这样做:
char* clientGetPasswordFromLibrary( )
{
char buffer[256];
size_t num_copied;
int status = getMyPassword( buffer, sizeof(buffer), &num_copied );
char* ret_val = NULL;
if ( status == BUFFER_TOO_SMALL )
{
ret_val = malloc( num_copied );
if ( ret_val == NULL )
{
return NULL;
}
getMyPassword( ret_val, num_copied, &num_copied );
}
else
{
ret_val = malloc( num_copied );
if ( ret_val == NULL )
{
return NULL;
}
memcpy( ret_val, buffer, num_copied );
}
return ret_val;
}
strrev()
。或者将其进行两次rot-13加密。 - Heath Hunnicuttconst *char
而应该是const char *
,怎么可能会忽略这样一个明显的错误呢? - ajay