0

我有一些 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 类以编程方式运行所有这些。我想检查程序是否抛出异常/读取未保留的内存等。

4

2 回答 2

0

如果您无法修改上述程序的源代码,则在“外部”环境(shell)中运行它并获取返回值并针对 0 进行测试 - 任何其他值都会导致我的行为不正确。

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

如果您可以修改程序,那么简单的解决方案是使用 std::vector 或 std::deque ,它们相似但重要的是使用at()方法而不是operator[]运算符,因为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;
}
于 2015-01-03T18:04:34.357 回答
0

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

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

当涉及到生产环境时,我不知道有什么方法可以做你想做的事 - 通常你只能指望操作系统分段错误以防读取可用内存(如果你有运气 - 如果你不它会“工作”)。

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

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

于 2015-01-03T17:10:28.660 回答