2

我有一个函数,它有一个char*as 参数来从函数内部接收一些信息。( int foo(char* param1))

我怎样才能确定这个参数有足够的分配空间来接收我需要输入的所有信息?我可以确定它是否是一个有效的指针,但我还没有找到一种方法来确定分配给参数的大小/长度。

我无法更改功能(无法添加其他带有大小的参数)。

4

4 回答 4

6

AFIAK,C++ 没有任何工具来验证分配给指针的空间量。如果输入指向一个以 NULL 结尾的字符数组(即一个 c 字符串),那么您可以使用 strlen()。通常,C 和 C++ 中的这些类型的函数必须详细说明参数的预期内容。该函数通常是在调用者遵守记录的合同的情况下实现的。

于 2012-08-28T18:54:00.220 回答
5

如果我正确理解了这个问题,那么您将无法确定与指针关联的有效内存的大小。如果这是指向一个数据数组,这是传递大小参数的常用方法,但如果您没有该选项,您将不知道您将访问什么

于 2012-08-28T18:52:58.060 回答
4

简单的回答:你不能。

稍微复杂一点的 C 风格答案:如果该字符数组有一个终止 NUL (0) 字节,则可以使用strlen().

特定于操作系统的答案:如果数组的内存是使用 获得的malloc(),您可以分别使用malloc_size()malloc_usable_size()至少在 OS X 和 Linux 上。在 Windows 上,对于使用 Microsoft C 运行时的应用程序,有该_msize()功能。

于 2012-08-28T18:58:46.767 回答
1

你不能确定。并不真地。您可以对指针有效性进行的唯一实际检查是检查它是否不是NULL.

就知道缓冲区param1指向的大小而言,唯一想到的是这个愚蠢的黑客。在调用函数之前,将缓冲区的大小放在指向的缓冲区的开头param1。然后,将数据复制到缓冲区中,完成检查后覆盖大小。

像这样:

*(unsigned int*)param1 = buf_size;
foo(param1);

int foo(char* param1)
{  
    if (0 == param1)
    {
        // fail
    }

    unsigned int buf_size = *(unsigned int*)param1;

    if (buf_size < whateverlimit)
    {
        // fail
    }

    // copy data into the buffer
}

我尚未编译此代码,因此可能需要进行一些更正。

于 2012-08-28T19:12:45.767 回答