Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему падает код? C++

Родион Перкин Ученик (90), на голосовании 3 месяца назад
Падает этот код:
 #include  
#include

using namespace std;
void print(const char* str) { cout << str << endl; }

namespace REVERSE_CRYPT {
void encrypt(int exit_code, string dfname, string efname) {


exit_code = 0;
}
void decrypt(int exit_code, string dfname, string efname) {


exit_code = 0;
}
}

namespace errors {
void Kernel_Unknown_Error() { print("Kernel Error: Unknown error!"); }
void Kernel_CryptIsNotComplete_Error() { print("Kernel Error: The encryption has not been completed!"); }

void error_parser(int exit_code) {
if (exit_code > 0) {
if (exit_code == 1) { errors::Kernel_Unknown_Error(); }
else if (exit_code == 2) { errors::Kernel_CryptIsNotComplete_Error(); }
}
}
}

int main(int argc, char* argv[]) {

char* type = argv[1];
string decrypt_file = argv[2];
string encrypt_file = argv[3];
int exit_code = 2;

if (type == "--decrypt") { exit_code = 0; REVERSE_CRYPT::decrypt(exit_code, decrypt_file, encrypt_file); }
if (type == "--encrypt") { exit_code = 0; REVERSE_CRYPT::encrypt(exit_code, decrypt_file, encrypt_file); }

if (exit_code > 0) { errors::error_parser(exit_code); }

return exit_code;
}
в этом месте:
 #else // ^^^ _HAS_CXX17 / !_HAS_CXX17 vvv 
return _CSTD strlen(reinterpret_cast(_First)); // Строка с ошибкой
#endif // ^^^ !_HAS_CXX17 ^^^
с этой ошибкой
 Вызвано исключение по адресу 0x00007FF6A7DD15F3 в file_coder.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFF. 
Почему? То что проблема в string-ах я понял, но почему так? Помогите мне срочно!
Голосование за лучший ответ
Touya Гуру (3063) 4 месяца назад
многа букв больше трёх не перевариваю
♡$ⴎG@r₱u₷sყ♡ Искусственный Интеллект (157212) 4 месяца назад
GPT-4o
Проблема в вашем коде связана с использованием указателей `char*`. В частности, вы не проверяете, что `argc` достаточно велико, чтобы содержать все аргументы, которые вы пытаетесь использовать. Если количество аргументов, переданных в программу, меньше ожидаемого, то `argv[1]`, `argv[2]` и `argv[3]` могут указывать на неинициализированные (или недоступные) области памяти, что и приводит к возникновению ошибки нарушения прав доступа.

Добавьте проверку количества аргументов в начале функции `main`, чтобы убедиться, что программа получает необходимое количество аргументов:
 
#include
#include

using namespace std;

void print(const char* str) { cout << str << endl; }

namespace REVERSE_CRYPT {
void encrypt(int &exit_code, string dfname, string efname) {
// Your encryption logic here
exit_code = 0;
}
void decrypt(int &exit_code, string dfname, string efname) {
// Your decryption logic here
exit_code = 0;
}
}

namespace errors {
void Kernel_Unknown_Error() { print("Kernel Error: Unknown error!"); }
void Kernel_CryptIsNotComplete_Error() { print("Kernel Error: The encryption has not been completed!"); }

void error_parser(int exit_code) {
if (exit_code > 0) {
if (exit_code == 1) { errors::Kernel_Unknown_Error(); }
else if (exit_code == 2) { errors::Kernel_CryptIsNotComplete_Error(); }
}
}
}

int main(int argc, char* argv[]) {
if (argc < 4) {
print("Usage: ");
return 1;
}

char* type = argv[1];
string decrypt_file = argv[2];
string encrypt_file = argv[3];
int exit_code = 2;

if (strcmp(type, "--decrypt") == 0) {
exit_code = 0;
REVERSE_CRYPT::decrypt(exit_code, decrypt_file, encrypt_file);
}
else if (strcmp(type, "--encrypt") == 0) {
exit_code = 0;
REVERSE_CRYPT::encrypt(exit_code, decrypt_file, encrypt_file);
}

if (exit_code > 0) { errors::error_parser(exit_code); }

return exit_code;
}


Основные изменения:
1. Добавлена проверка количества аргументов в начале `main`.
2. Использование `strcmp` для сравнения строк `type` с `"--decrypt"` и `"--encrypt"`.
3. Передача `exit_code` по ссылке в функции `encrypt` и `decrypt`, чтобы изменения были видны в `main`.

Эти изменения помогут избежать ошибок, связанных с недостаточным количеством аргументов, переданных в программу.
Родион ПеркинУченик (90) 4 месяца назад
От души душевно в душу брат, совсем забыл про них
♡$ⴎG@r₱u₷sყ♡ Искусственный Интеллект (157212) Родион Перкин, ???
Саша Лидский Ученик (92) 4 месяца назад
Лучше Пайтон учи нерв меньше потратишь
Родион ПеркинУченик (90) 4 месяца назад
брат, я с питона перехожу, да и на питоне эту программу не напишешь, нужен более низкоуровневый язык
Саша Лидский Ученик (92) Родион Перкин, ну тоже верно
Похожие вопросы