如何让我的编译器更加愚蠢(索引错误)?

时间:2018-12-27 14:04:28

标签: c++ c++11

我遇到了一个可怕的情况。 我通常使用可视代码来编辑代码,并在其中进行编译和执行(F5)。 但是我发现vscode太聪明了,或者对我忽略了一些警告消息。和 输出正确的答案,在Ideone中也可以正常工作。 但是在窗口cmd或dev C ++中,我的代码无法输出任何内容,仅返回一个大数字。

我发现上面提到的事情会发生一些情况。

这样的代码

for (i = 0; i < g.size(); i++)
{
    int source;
    int dest;
    int minWeight = 999;

    for (j = 0; i < g[j].size(); j++)
    {
        // no edge, come to next condition
        if (!g[i][j])
            continue;
        if (g[i][j] < minWeight)
        {
            source = i;
            dest = j;
            minWeight = g[i][j];
        }
    }
    if
        updateGroup(index, index[source], index[dest]);
    else
        updateGroup(index, index[source], index[dest]);
}

您可能会发现第二个for循环的条件语句错误,应该更改 j = 0; i < g[j].size(); j++j = 0; j < g[i].size(); j++

所以我想知道

  1. 有什么办法让我的vscode更加严格吗?

  2. 为什么仍然可以在vscode和ideone中输出正确答案?

  3. 当这种无消息错误时,如何避免或更容易找到我的代码错误的地方?

真的希望有人能帮助我,并感谢您的所有建议!

2 个答案:

答案 0 :(得分:10)

编译器或计算机无法读懂您的想法并猜测您打算写的内容,而不是您真正的意思。

即使这个错误导致了错误,它也无法知道您不打算写这个,或者您打算写一些其他特定的东西。

即使此错误导致程序具有未定义的行为,也无法检测到许多未定义的行为,对于编译器作者来说,尝试编写代码来执行此操作也不值得,因为这样做太难了,不够用。即使他们做到了,编译器仍然无法猜测您的意思。

请记住,像这样的循环没有检查或增加您在序言中声明的相同变量;那只是一个常见的模式(现在已被更安全的range-for语句所取代)。循环递增i但检查j并没有本质上的错误。

最终,解决此问题的方法是为您的代码编写 tests ,这就是为什么许多组织都有专门的质量保证团队来搜索错误的原因,以及为什么您应该已经进行过测试将代码提交到项目之前。

请记住要集中精力并密切注意并阅读您的代码,最终这种错别字在您的工作中将变得越来越少见。当然,有时您会编写一个错误,然后您的测试将捕获该错误。有时您的测试不会捕获该消息,这是您的客户最终会注意到它并提出投诉的时候。然后,您发布修复该错误的新版本。

这都是完全正常的软件开发实践。这就是让它变得有趣的原因!

答案 1 :(得分:2)

1)尽可能提高编译器警告。

2)使用多个不同的编译器(它们都对不同的事物发出警告)。

3)精通该语言的细节(经过多年的努力),对编写的代码要非常非常小心。

4)编写(并定期运行)大量测试。

5)使用消毒剂,模糊器,棉绒,静态代码分析器等工具来帮助捕获错误。

6)在多个平台上构建和运行代码,以使其易于移植并查找不同环境/实现所暴露的错误。