从geant获取堆栈跟踪

时间:2017-10-31 22:28:49

标签: stack-trace type-mismatch eiffel

我正在尝试使用Gobo编译器及其工具编译项目(请参阅this SO question),并且我收到了引用标准库equal(..)的错误消息。我确定错误在我所拥有的代码中,而不是在标准库中,但我不知道如何从geant获取更多信息。我想知道我的代码调用了哪个类,函数,代码行equal(..)或任何其他可能调用它的标准库函数。是的,我已经尝试在我的代码中浏览所有equal(..)

我得到的错误信息是这样的:

  

[CATCALL] class SQL_GENERATOR_TSQL65(ANY,95,8):type' STRING_8'实际参数#1不符合类型' UC_STRING'功能`is_equal'中的正式论证在班级' UC_STRING'

这指向library\free_elks\src\elks\kernel\any.e

    frozen equal (a: detachable ANY; b: like a): BOOLEAN
        -- Are `a' and `b' either both void or attached
        -- to objects considered equal?
    do
        if a = Void then
            Result := b = Void
        else
            Result := b /= Void and then
                        a.is_equal (b) -- <<<<<<< THIS LINE
        end
    ensure
        definition: Result = (a = Void and b = Void) or else
                    ((a /= Void and b /= Void) and then
                    a.is_equal (b))
    end

1 个答案:

答案 0 :(得分:1)

报告的CAT呼叫是系统错误(与类错误相反),即作为整个系统分析的结果出现。课程UC_STRING重新定义了要素is_equal。因此,它只能用于UC_STRING类型(或其后代)的参数。

有些代码将UC_STRING视为STRING_8UC_STRING继承自STRING_8)。只要UC_STRING附加到STRING_8类型的实体,代码就有可能获得CAT呼叫。这是一个例子:

s: STRING_8
t: STRING_8
u: UC_STRING
...
s := u
if equal (s, t) then ...

equal的代码,您在is_equal的实例上提及调用UC_STRING,但接收STRING_8作为参数。但是,is_equalUC_STRING的版本只能处理UC_STRING作为参数,而不是STRING_8。这就是你收到错误的原因。

问题可以通过

解决
  • 更改is_equalUC_STRING的参数类型以接受STRING_8
  • 删除UC_STRINGSTRING_8
  • 的所有重新附加内容
  • 禁用CAT呼叫错误

在你的情况下,最后一个似乎是最好的。

相关问题