强类型是否可以防止缓冲区溢出?

时间:2010-09-02 16:28:29

标签: c++ buffer-overflow

强类型,在这种情况下 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?

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分: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 ++中)。

答案 2 :(得分:3)

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

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

所以答案是“不”。

答案 3 :(得分:1)

当它找到NUL时,它仍然会溢出strcpy stops 为防止溢出,您应使用strlcpystrncpy

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

// using strncpy
strncpy(a, unknownFunction, 100); 
a[99] = 0; // strncpy doesn't NUL-terminate the result

答案 4 :(得分:0)

一般来说,strncpystrcpy的替代品。