Kev*_*ith 4 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?
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
请注意,我们正在利用模板的类型判断系统来强制编译错误buf = bar.这是强类型系统可以做的一个例子(另请注意,强制转换可以100%破坏键入 - 在C++中).