4

强类型,在这种情况下是char防止缓冲区溢出吗?

char a[100]
char b[100]

strcpy(a,unknownFunction); // unknownFunction could overflow b 
                           // since its length is unknown

strcpy(b,a); // can b still overflow a with its now, 
             // potentially overflowed size?
4

5 回答 5

9

strcpy(),继续运行,直到找到一个空终止符 ( '\0')。如果b[]不包含一个,它只会遍历随机内存,直到最终找到一个。

于 2010-09-02T16:31:12.817 回答
5

C 没有强类型系统。

C++ 在某种程度上是强类型的,但并不是真正的强类型系统,因为它具有reinterpret_cast.

对于防止缓冲区溢出的类型系统,类型信息必须(1)表示任意长的字符串或(2)在类型本身中编码缓冲区长度。此外,类型判断系统应确保缓冲区长度小于或等于转换。

编辑:

稍加注意,并忽略 C++ 的强制转换能力,您可以在 C++ 中编写一个“相当强大”的无溢出缓冲区类。但是,根据该术语的一般定义,这不是强类型的,因为可以尝试在无效点访问缓冲区并仍然对其进行编译。比我更擅长模板的人可能会编写一个真正模板类型的 SafeBuffer。

这是我的观点:

template<int Length>
class SafeBuffer
{
    unsigned char[Length];
public:
    unsigned char& operator[](int index); //when implemented, throws exception on out-of-range access.
};

SafeBuffer<10> buf, foo;
SafeBuffer<9> bar;
buf = foo; //pass
buf = bar; //compile-time error.
buf[100]; //compiles, but generates error at runtime. 

请注意,我们正在利用模板的类型判断系统来强制buf = bar. 这是强类型系统可以做什么的一个例子(另请注意,强制转换可以 100% 破坏类型 - 在 C++ 中)。

于 2010-09-02T16:49:49.877 回答
3

的参数的类型strcopy()char *。这意味着一旦将数组传递给strcpy(),它就无法知道这些是固定大小的数组。就函数而言,它们只是指针,它会不断复制元素,直到找到\0.b

要点是,一旦函数接受一个指针参数,它就无法确定它是指向单个对象的指针、指向动态分配的缓冲区的指针,还是分配在堆栈上的固定大小的数组。

所以答案是“不”。

于 2010-09-02T16:37:11.957 回答
1

它仍然可以溢出,strcpy stops当它找到一个 NUL 来防止溢出时,你应该使用strlcpystrncpy

// using strlcpy
strlcpy(a, unknownFunction, 100);

// using strncpy
strncpy(a, unknownFunction, 100); 
a[99] = 0; // strncpy doesn't NUL-terminate the result
于 2010-09-02T16:35:36.827 回答
0

一般来说strncpy,它是一个更安全的替代方案strcpy

于 2010-09-02T16:34:24.927 回答