读取无法访问的内存时cl c ++运行时错误

时间:2015-01-03 16:44:06

标签: c++ runtime-error cl

我有一些c ++代码,但我不知道是什么。出于示例的目的,我们说它是:

//main.cpp
#include<iostream>
using namespace std;
int T[100];

int main()
{
    for(int i = 0; i < 100; ++i)
        T[i] = i;
    int x;
    cin>>x;
    cout<<T[x]<<endl;

    return 0;
}

我正在cl /O2 /nologo /EHsc main.cpp进行编译并按main < inFile.in运行。假设inFile.in内容是一个数字500和新行。输出是一些随机数,因为程序读取地址T+500下的内存并打印它。 我想在这种情况下得到运行时错误(任何检查的可能性都是这样的)。这可能无法访问main.cpp吗? 具体来说,我在ASP.Net MVC应用程序中通过C#中的Process类以编程方式运行所有这些。我想检查程序是否抛出异常/读取而不是保留的内存等。

2 个答案:

答案 0 :(得分:0)

这是您想要仅用于开发目的的功能,还是在生产环境中?

在开发目的的情况下,您可能会尝试在某些工具下运行您的应用程序以进行运行时检查(如Valgrind / Dr Memory),或者更改编译它的方式以包括运行时调试检查(不保证在描述中工作)案例,但在许多其他人帮助)。请记住,这会使您的应用程序更多更慢(因此应仅用于正在开发的应用程序)

说到生产环境,我不知道你想做什么的方式 - 一般来说,只有在读出可用内存时你才能依靠操作系统分段错误(如果你有运气 - 如果你不要&#34;工作&#34;)。

对于例外情况,我并非100%确定我理解你的意思 - 这是&#34;为什么程序终止&#34; ?在这种情况下,您可能会获得崩溃应用程序的核心转储(在正常终止的情况下,我假设您有返回代码),并且您可以稍后检查它以获得崩溃原因或者还可能尝试恢复某些数据。有关如何在Windows上收集转储的说明,您可以查看: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787181%28v=vs.85%29.aspx

但是,这也是一个在开发环境中比在生产环境中更有用的功能。

答案 1 :(得分:0)

如果您无法修改上述程序的来源,请在“&#39;以外的地方运行”。环境(shell)并获取返回值并将其测试为0 - 任何其他值都是我不正确的行为。

验证此类程序也是一件好事。您知道它无法处理的输入数据,而不是等待它崩溃,您可以防止它发生。

如果您可以修改程序,那么简单的解决方案就是使用std :: vector或std :: deque,这类似但重要的是使用 at()方法而不是运算符[] 运算符作为 at()方法检查边界

#include<iostream>
#include<vector>
using namespace std;

std::vector<int> T(100);

int main()
{
    for(int i = 0; i < 100; ++i)
        T[i] = i;
    int x;
    cin>>x;
    cout<<T.at(x)<<endl;

    return 0;
}

如果 at()将使用错误的越界参数调用,那么将抛出异常,您可以像这样捕获:

try{
    cin>>x;
    cout<<T.at(x)<<endl;
}
catch(...)
{
    cout << "exception while accessing vector's data" << endl;
}