У меня есть немного кода на 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?
Чтобы быть точным, я запускаю все это программно по классу Process в C # в ASP.Net MVC Application. Я хочу проверить, выдавала ли программа исключение / читать не зарезервированную память и т.д.
Это функция, которую вы хотите использовать только в целях разработки или также в своей производственной среде?
Только в целях разработки вы можете попытаться запустить ваше приложение под каким-либо инструментом для проверки во время выполнения (например, Valgrind / Dr Memory) или изменить способ компиляции, чтобы включить проверки отладки во время выполнения (не гарантируется работа в описанном случае, но помогает во многих других). Имейте в виду, что это сделает ваше приложение много медленнее (поэтому следует использовать только для разрабатываемых приложений)
Когда дело доходит до производственной среды, я не знаю ни одного способа сделать то, что вы хотите — в общем, вы можете рассчитывать только на ошибку сегментации ОС в случае чтения доступной памяти (если вам повезет — если вы этого не сделаете) это будет «работать»).
Для исключения, я не уверен на 100%, что понимаю, что вы имеете в виду — это «почему программа завершилась»? В этом случае вы можете получить дамп ядра аварийного приложения (в случае нормального завершения я предполагаю, что у вас есть коды возврата), и вы можете проверить его позже, чтобы узнать причину сбоя или, возможно, также попытаться восстановить некоторые данные. Для получения инструкций о том, как собирать дампы в Windows, вы можете проверить:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb787181%28v=vs.85%29.aspx
Однако это также более полезная функция в среде разработки, чем в рабочей.
Если Вы не можете изменить исходный код программы выше, тогда запустите ее во «внешней» среде (оболочке), получите возвращаемое значение и проверьте его на 0 — любое другое значение может привести к некорректному поведению.
Также полезно проверять входные данные таких программ, которые, как вы знаете, не могут быть обработаны, поэтому, вместо того, чтобы ждать их сбоя, вы можете предотвратить их возникновение.
Если бы вы могли модифицировать программу, то простым решением было бы использовать std :: vector или std :: deque, которые похожи, но важно использовать в() метод, а не Оператор [] оператор как в() метод проверяет границы
#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;
}
если в() будет вызван с плохим параметром out-of-of-bound, тогда будет выброшено исключение, которое вы можете поймать так:
try{
cin>>x;
cout<<T.at(x)<<endl;
}
catch(...)
{
cout << "exception while accessing vector's data" << endl;
}