在C ++中对数组进行静态绑定检查

时间:2013-06-25 21:43:40

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

我需要就我正在参加的编程语言课程提出一些问题的指导。

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

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

” 当索引是整数类型时,不可能检测到数组索引的溢出 - 而不是索引的类型对应于数组大小(必须是数组类型的一部分)。 “

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

澄清:好的,这有一些困惑的回复,可能是因为我不清楚 - 所以我会再次强调:

  1. “静态”表示“在编译时”。 编译器应该警告用户溢出(警告/错误..)。不是运行时!
  2. 阅读给我们的“提示” - 它将被使用。具体来说,程序可能不会检查边界!特别是不能使用或模拟c ++中数组的at()方法。
  3. 鉴于这一切,我认为他们想要的是某种转变 int->(指数类型) 在数组溢出的情况下,以某种方式失败或计算这些索引的错误值。

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

1 个答案:

答案 0 :(得分:2)

也许他打算让你根据值属于类型的类型来索引数组,例如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
}

对于你的限制,这似乎相当先进,我认为你更有可能误解了你的教授。