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

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)

Oli*_*rth 9

strcpy()不会. 只是一直持续到找到null-terminator('\0').如果b[]不包含一个,它将只是遍历随机内存,直到它最终找到一个.


Pau*_*han 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. 
Run Code Online (Sandbox Code Playgroud)

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