强类型,在这种情况下 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?
答案 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
为防止溢出,您应使用strlcpy
或strncpy
// using strlcpy
strlcpy(a, unknownFunction, 100);
// using strncpy
strncpy(a, unknownFunction, 100);
a[99] = 0; // strncpy doesn't NUL-terminate the result
答案 4 :(得分:0)
一般来说,strncpy
是strcpy
的替代品。