2015-01-03 3 views
0

У меня есть код C++, но я не знаю что. Для целей примера скажу, что: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? Чтобы быть конкретным, я выполняю все это программно по классу Process в C# в приложении ASP.Net MVC. Я хочу проверить, действительно ли программа забрасывала исключение/чтение, а не зарезервированную память и т. Д.

+0

Вы можете использовать 'std :: vector' или' std :: array', которые обеспечивают проверку вне границ и будут генерировать исключения, если это произойдет во время выполнения. –

+0

Вам нужно убедиться, что x находится между 0 и 99, иначе ваша программа будет иметь неопределенное поведение. – drescherjm

+0

, пожалуйста, не оценивайте рейтинг, так как это абсолютно правильный вопрос с самой важной частью в конце сообщения –

ответ

0

Является ли это функцией, которую вы хотите использовать только для целей разработки или в вашей производственной среде?

В целях развития вы можете попытаться запустить приложение под некоторым инструментом для проверки выполнения (например, Valgrind/Dr Memory) или изменить способ его компиляции, чтобы включить проверки отладки времени выполнения (не гарантируется работа в описанный случай, но помогает во многих других). Имейте в виду, что это сделает ваше приложение намного более медленным (таким образом, оно должно использоваться только для разрабатываемых приложений)

Когда речь заходит о производственной среде, я не знаю, как бы вы делали то, что хотите - в В общем случае вы можете рассчитывать только на ошибку сегментации ОС в случае чтения из доступной памяти (если вам повезло - если вы этого не сделаете "работаете").

Для исключения, я не уверен на 100%, я понимаю, что вы имеете в виду - это «почему программа закончилась»? В таком случае вы можете получить базовый дамп разбитого приложения (в случае нормального завершения я предполагаю, что у вас есть коды возврата), и вы можете проверить его позже, чтобы либо получить причину сбоя, либо, возможно, попытаться восстановить некоторые данные. Инструкции по сборке дампов в Windows вы можете проверить: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787181%28v=vs.85%29.aspx

Однако эта функция является более полезной в среде разработки, чем в производстве.

+0

Также в производственной среде и не может сделать мое приложение намного медленнее. –

+1

Для конкретной проблемы, которую вы описали, я думаю, что http://stackoverflow.com/questions/10571794/c-write-to-read-from-invalid-out-of-bound-array-index содержит ответ - если память выделяется для вашего процесса, вы ничего не можете сделать в целом, и на самом деле ничего не можете сделать, не подслушивая. Однако, если это приложение использует STL, вы можете связать его с отладочной версией этой библиотеки - это сделает код значительно медленнее, но должен помочь. Если вы рассматриваете сборку Clang/GCC, вы также можете попробовать AddressSanitizer, иногда это помогает с такими проблемами. –

0

Если вы не можете изменить вышеуказанный источник программы, запустите его в среде «снаружи» (shell) и получите возвращаемое значение и протестируйте его против 0 - любое другое значение приведет к неправильному поведению.

Также полезно проверить входные данные таких программ, которые, как вы знаете, не могут справиться с этим, а не ждать, пока он не сработает, вы можете предотвратить его.

Если Вы можете изменить программу, то простое решение было бы использовать станд :: вектор или станд :: 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; 
} 

если в() будет вызвана с плохим вне связанным параметром, то исключение будет броском, который Вы можете поймать так:

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

Я не могу изменить источник программы. И, как я писал выше, программа печатает случайное число и возвращает 0 в этом случае. –

 Смежные вопросы

  • Нет связанных вопросов^_^