由于x
未被真正验证并且是通过scanf接收的,因此应该有可能被污染的数据可用于访问bytes
。
代码(从逻辑上讲,这并不是真正有意义的工作):
void getMyBytes(){
int x, byte;
int bytes[20];
scanf("%u %u", &x, &byte);
bytes[x-1] = byte;
}
此代码的一个已知的简单(难看)修复程序是:
void getMyBytes(){
int x, byte;
int bytes[20];
scanf("%u %u", &x, &byte);
if (x > sizeof(bytes)/sizeof(*bytes)) return; --> validation fix
bytes[x-1] = byte;
}
我可以在scanf中输入哪些输入以便可以访问bytes
?
答案 0 :(得分:2)
这取决于您的应用程序,但是在访问内部成员时,应始终绑定检查外部输入。您如何举报这取决于您。但是请考虑使用std::vector
或std::array
来帮助您。在您的示例中:
void getMyBytes(){
int x, byte;
std::array<int, 20> bytes; // Bad name btw, an int is very unlikely to be a byte.
scanf("%u %u", &x, &byte); // scanf is not type safe. Consider using cin <<
bytes.at(x-1) = byte; // Automatically bound checks for you and will throw an exception
// in the case that you are out of bounds. Very useful :)
}
通过边界检查返回对指定位置pos处元素的引用。 如果pos不在容器的范围内,则会引发std :: out_of_range类型的异常。
其他可能报告错误的方法包括:
assert(x >= 0 && x < bytes.size() && "I crashed here because you gave me bad input!")
if (x < 0 || x > bytes.size()) { return false; }
if (x < 0) { throw my_special_underrun_exception; }
和if (x > bytes.size()) { throw my_special_overrun_exception; }
最后考虑访问CppCoreGuidelines,以获取有关如何编写良好代码的大量提示。