简体   繁体   English

C++ 如何防止 Memory 保护违规?

[英]C++ How do I prevent Memory Protection Violation?

I have a problem with memory violation problem that occurs if reach else if(argc == 2)我遇到了memory 违规问题,如果达到else if(argc == 2)

I'm trying to have a nice written script with no errors like that, anything else works like a charm...我正在尝试编写一个没有类似错误的漂亮脚本,其他任何东西都像一个魅力......

Here's a code fragment:这是一个代码片段:

//...
// 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
        }
//...

Edit: Besides argc and argv[] values program doesn't asign any variables编辑:除了 argc 和 argv[] 值程序不分配任何变量

Edit 2.: Program is constructed of 2 argument actions and 3 arguments actions like this one mentioned it code I posted.编辑 2:程序由 2 个参数动作和 3 个 arguments 动作构成,就像我提到的我发布的代码一样。

If this condition如果这个条件

else if(argc == 2)

evaluates to true then it means that argv[argc] is equal to nullptr .计算结果为 true 则意味着argv[argc]等于nullptr So using the expression argv[2] (that is a null pointer) in this case for example in a call of strcmp results in undefined behavior.因此,在这种情况下,例如在调用strcmp时使用表达式argv[2] (即 null 指针)会导致未定义的行为。 The valid range of indices is [0, 1] .索引的有效范围是[0, 1]

From the C++ 14 Standard (3.6.1 Main function)来自 C++ 14 标准(3.6.1 主要功能)

  1. ...If argc is nonzero these arguments shall be supplied in argv[0] through argv[argc-1] as pointers to the initial characters of null-terminated multibyte strings (ntmbs s) (17.5.2.1.4.2) and argv[0] shall be the pointer to the initial character of a ntmbs that represents the name used to invoke the program or "". ...如果 argc 不为零,则这些 arguments 应在 argv[0] 到 argv[argc-1] 中作为指向空终止多字节字符串 (ntmbs s) (17.5.2.1.4.2) 和 argv[ 的初始字符的指针提供0] 应该是指向 ntmbs 的初始字符的指针,该字符表示用于调用程序的名称或“”。 The value of argc shall be non-negative. argc 的值应为非负数。 The value of argv[argc] shall be 0 . argv[argc] 的值应为 0

I followed @Yksisarvinen advice and reorder the code and now it works flawless:我遵循@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM