【问题标题】:Static bound checking for array in C++C++中数组的静态边界检查
【发布时间】:2013-06-22 21:15:38
【问题描述】:

我需要一些关于我正在学习的编程语言课程中的问题的指导。

我们需要想出一种方法来在 C++ 中实现一个数组类,以便静态检查访问它的元素是否溢出。 我们不会使用 C++11(静态断言)或任何其他黑盒解决方案 - 这是一个理论问题,而不是我出于编码目的需要的东西。

我们确实在演讲幻灯片中得到了强烈的暗示:

" 当索引是整数类型时,不可能检测到数组索引的溢出——如果索引的类型对应于数组大小(它必须是数组类型的一部分),则无法检测到溢出。 "

我考虑过使用固定长度(数组大小)字符串作为索引,但除了考虑这个选项之外,我真的没有得到太多:(.

澄清:好的,这得到了一些混乱的答复,可能是因为我不清楚 - 所以我会再次强调:

  1. “静态”表示“在编译时”。 编译器应该提醒用户溢出(警告/错误..)。不是运行时!
  2. 阅读给我们的“提示”——它会被使用。具体来说,程序可能不会检查边界!尤其是 c++ 中数组的 at() 方法,不得使用或模拟。

鉴于这一切,我认为他们想要的是某种转变 int->(索引类型) 在数组溢出的情况下以某种方式失败或为这些索引计算错误的值。

希望现在更清楚了。谢谢你的

【问题讨论】:

  • 如果我对你的理解正确(我可能不是),如果你想创建一个数组类一种内置的边界检查。如果用户尝试访问超出范围的元素,它应该抛出异常。我不会费心为您提供代码,但我仍然希望它作为指导有所帮助
  • 听起来他在要求你重新发明std::array::at
  • 我认为您的问题需要改写。一个类不能静态地检查自己。虽然理论上可以使用静态检查来创建函数,但我怀疑它们是否有用。可能您想问其他问题,例如运行时边界检查?
  • “静态检查”是什么意思?你想编译失败吗?还是只想在编译时确定它并在运行时指出越界?

标签: c++ arrays static-code-analysis


【解决方案1】:

也许他打算让您根据值是类型的一部分的类型来索引数组,例如std::integral_constant<int, value>。使用它,可以在编译时检查大小。然而,如果没有static_assert,就很难想出简单的方法来断言一个常数小于另一个常数。

在这里,我使用比较索引是否小于大小的技巧,将其转换为整数(如果超出范围则为 0,否则为 1),将其乘以 2 并减去 1,得到(- 1 表示越界,或 1 表示有效),然后创建一个该大小的数组。如果索引超出范围,这会导致编译错误,如果索引有效,则会进行优化。

#include <type_traits>

template<class T, int count>
struct array {
    array() : data() {}

    template<int N>
    T& operator[](std::integral_constant<int,N> index) {
        //compiler error if index is too small
        char index_is_too_large[(N<count)*2-1]={}; 
        index_is_too_large[0] = index_is_too_large[0]; 
        //second line makes the compiler ignore warnings

        return data[N];
    }
private:
    T data[count];
};

#include <iostream>
int main() {
    array<float, 3> thingy;

    std::integral_constant<int, 2> index2;
    std::cout << thingy[index2] << '\n';

    std::integral_constant<int, 3> index3;
    std::cout << thingy[index3] << '\n'; //COMPILER ERROR ON THIS LINE
}

这对你施加的限制似乎相当先进,我认为你更有可能在某个地方误解了你的教授。

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2013-02-19
    • 1970-01-01
    • 2011-05-27
    • 2018-04-17
    相关资源
    最近更新 更多