[英]C++ How do I prevent Memory Protection Violation?
我遇到了memory 違規問題,如果達到else if(argc == 2)
我正在嘗試編寫一個沒有類似錯誤的漂亮腳本,其他任何東西都像一個魅力......
這是一個代碼片段:
//...
// POWER ON
if(strcmp(argv[2], "on") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5", O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER ON Message
unsigned char msg[] = { '\x2A', '\x20', '\x30', '\x20',
'\x49', '\x52', '\x20', '\x30',
'\x30', '\x31', '\x0D' };
// Send message to device
write(serial_port, msg, sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
// POWER OFF
else if(strcmp(argv[2], "off") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5", O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER OFF Message
unsigned char msg[] = { '\x2A', '\x20', '\x30', '\x20',
'\x49', '\x52', '\x20', '\x30',
'\x30', '\x32', '\x0D' };
// Send message to device
write(serial_port, msg, sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
else if(argc == 2)
{
std::cout << "No argument passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
else if(argc > 3)
{
std::cout << "Too many arguments passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
else
{
std::cout << "Wrong argument! Passed: " << std::string(argv[2]) << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
//...
編輯:除了 argc 和 argv[] 值程序不分配任何變量
編輯 2:程序由 2 個參數動作和 3 個 arguments 動作構成,就像我提到的我發布的代碼一樣。
如果這個條件
else if(argc == 2)
計算結果為 true 則意味着argv[argc]
等於nullptr
。 因此,在這種情況下,例如在調用strcmp
時使用表達式argv[2]
(即 null 指針)會導致未定義的行為。 索引的有效范圍是[0, 1]
。
來自 C++ 14 標准(3.6.1 主要功能)
- ...如果 argc 不為零,則這些 arguments 應在 argv[0] 到 argv[argc-1] 中作為指向空終止多字節字符串 (ntmbs s) (17.5.2.1.4.2) 和 argv[ 的初始字符的指針提供0] 應該是指向 ntmbs 的初始字符的指針,該字符表示用於調用程序的名稱或“”。 argc 的值應為非負數。 argv[argc] 的值應為 0 。
我遵循@Yksisarvinen 的建議並重新排序代碼,現在它可以完美運行:
//...
if(argc == 3)
{
// POWER ON
if(strcmp(argv[2], "on") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5", O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER ON Message
unsigned char msg[] = { '\x2A', '\x20', '\x30', '\x20',
'\x49', '\x52', '\x20', '\x30',
'\x30', '\x31', '\x0D' };
// Send message to device
write(serial_port, msg, sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
// POWER OFF
else if(strcmp(argv[2], "off") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5", O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER OFF Message
unsigned char msg[] = { '\x2A', '\x20', '\x30', '\x20',
'\x49', '\x52', '\x20', '\x30',
'\x30', '\x32', '\x0D' };
// Send message to device
write(serial_port, msg, sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
else
{
std::cout << "Wrong argument! Passed: " << std::string(argv[2]) << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
}
else if(argc == 2)
{
std::cout << "No argument passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
else
{
std::cout << "Too many arguments passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
//...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.